AtlatestRenderedmarkdown
Readme

Minder

Scheduled task channel server for Claude Code sessions, built with Sigil.

Architecture

Minder is an MCP channel server that manages cron-based scheduled tasks and pushes events into a running Claude Code session via the claude/channel protocol.

minder/
├── package.sgl              # Package definition
├── dev-redirects.sgl        # Points deps at local sigil + sigil-later
├── minder.yaml              # Schedules (optional)
├── src/minder/
│   ├── main.sgl             # Entry point: channel MCP server
│   ├── config.sgl           # Config loading (YAML)
│   └── scheduler.sgl        # Cron scheduling via sigil-later
└── test/
    └── test-config.sgl

Configuration

Schedules via minder.yaml:

schedules:
  check-services:
    cron: "*/30 * * * *"
    prompt: "Check service health"

Dependencies

  • sigil-mcp — MCP server framework (channel notifications)
  • sigil-later — Cron-based task scheduling
  • sigil-yaml — Config file parsing
  • sigil-log — Structured logging

Building

Always build within a Guix shell:

guix shell -m ../sigil/manifest.scm -- env CC=gcc \
  ../sigil/build/release/bin/sigil build --redirects dev-redirects.sgl

Testing

guix shell -m ../sigil/manifest.scm -- env CC=gcc \
  ../sigil/build/release/bin/sigil -L build/dev/lib test --redirects dev-redirects.sgl

Running

Minder is designed to be spawned by Claude Code as a channel MCP server:

claude --channels server:minder

Register it in .mcp.json:

{
  "mcpServers": {
    "minder": {
      "command": "./build/dev/bin/minder",
      "env": {}
    }
  }
}

Stale Cache

After rebuilding, clear the global module cache:

rm -rf ~/.cache/sigil/lib/0.7.0/minder/

Key Implementation Notes

  • YAML dict keys from yaml-decode are keywords — use keyword->string
  • Struct constructors match the struct name (not make- prefixed)
  • The MCP server loop runs inside with-async so scheduler goroutines can interleave with stdin reads
  • channel-notify! from (sigil mcp channel) sends channel events
  • sigil-later tasks spawn their own goroutines via later-every!