Skip to main content
Glama
mailbox-mcp
by EllGree

mailbox-mcp

MCP server for inter-agent mailbox communication. Structured API over the existing <repo>/.claude/{inbox,outbox}/*.md file convention used by Grygoriy's Claude-Code orchestration setup.

Status: Phase 1 in development.

Full spec: see SPEC.md.

Quick start

npm install
npm run build
npm start                # runs the MCP server over stdio

Register in ~/.claude.json under mcpServers:

{
  "mcpServers": {
    "mailbox": {
      "command": "node",
      "args": ["C:\\Users\\Gree\\workspace\\tools\\mailbox-mcp\\dist\\index.js"]
    }
  }
}

Restart Claude Code. Verify via /mcp — should list mailbox as connected.

Related MCP server: claude-presence

Tool surface (Phase 1)

  • mail_send(to, topic, body, [status, refs, reply_to, labels]) — drop a mail into target agent's inbox

  • mail_list(agent, folder, [status, since, labels, limit]) — list mails

  • mail_get(id, agent, folder) — read full mail

  • mail_reply(in_reply_to, body, [topic, to, parent_status, initial_status, ...]) — reply + auto-flip parent. Topic defaults to the parent's — same conversation continues; pass an explicit topic only to fork the subject.

  • mail_status(id, agent, folder, status) — flip status, audit-logged

  • mail_thread(root_id) — full thread tree

See SPEC.md for details.

Phase 2 (planned)

GitLab pipeline / MR watchers + templates + scheduled / conditional send. Separate background daemon.

Layout

src/
├── index.ts              # MCP server entrypoint
├── types.ts              # Mail types
├── config.ts             # Agent enum + paths
├── tools/                # One file per tool
└── storage/              # File I/O, frontmatter, naming, audit

Notes

mail_reply topic behavior — the reply's topic defaults to the parent's topic (same conversation continues). Pass an explicit topic only when the reply forks the subject. Previously the schema required topic; if a caller omitted it, the JS coerced undefined → the literal string "undefined" past the regex-only validator, producing filenames like 2026-07-07-1111-undefined.md and frontmatter with no topic: key — which mail_list then silently skipped as malformed. assertValidTopic now hard-rejects non-string / empty.

License

MIT — see LICENSE.

Available Tools

7 tools
mail_getA

Fetch a single mail by id from a given agent's folder. Returns full metadata + markdown body + absolute path.

Inputs: id (required), agent (required), folder (required).

mail_listA

List mails in a target agent's inbox or outbox. Filters: status, since (ISO date), labels (any-match), limit (default 100). Sorted newest-first.

Inputs: agent (required), folder (required), limit, since, +2 more.

mail_migrateA

Backfill id: frontmatter into hand-written legacy briefs in a given folder. Scans .md files, generates an id from filename timestamp + nanoid suffix for any file missing one, rewrites atomically. Use dry_run: true first to preview.

Inputs: agent (required), folder (required), dry_run.

mail_replyA

Reply to a mail. Finds parent in the CALLER's own inbox or outbox (use mail_send if you need to reply across agents), sends the reply with to = parent.from by default, and auto-flips the parent's status to 'done'. One tool call instead of three.

Inputs: body (required), in_reply_to (required), to, ref, +5 more.

mail_sendA

Send a brief/message to another agent's inbox. Writes a YAML-frontmatter markdown file to /.claude/inbox/-.md atomically. Caller identity comes from MAILBOX_MCP_AGENT_ID env var (default 'workspace'). Use this instead of writing files manually — it enforces naming, frontmatter, and audit.

Inputs: to (required), body (required), topic (required), ref, +4 more.

mail_statusB

Change a mail's status. Validates the state-machine transition (open ↔ holding → done/superseded; done and superseded are terminal). Atomic write + audit entry.

Inputs: id (required), agent (required), folder (required), status (required).

mail_threadA

Walk the reply_to graph rooted at the given mail. Returns root + descendants in breadth-first order with depth annotation. Scans all known agents' folders — expensive but complete.

Inputs: root_id (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 7 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: retrieving specific mails, listing mails, migrating legacy files, replying to mails, sending new mails, changing status, and traversing threads. No two tools overlap in functionality.

    Naming Consistency5/5

    All tool names follow the consistent pattern 'mail_<verb>' with lowercase snake_case verbs (get, list, migrate, reply, send, status, thread). The naming is perfectly uniform.

    Tool Count5/5

    7 tools is well-scoped for a mailbox server. The set covers the essential operations without being excessive. Each tool serves a distinct and necessary function.

    Completeness4/5

    The tool surface covers core mailbox operations: fetching, listing, sending, replying, status management, and thread traversal. Minor gaps exist (e.g., no direct deletion), but status updates (done/superseded) effectively serve as archival, so the surface is mostly complete.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP server that gives Claude and other MCP hosts full access to Mail.app on macOS — search, read, send, reply, flag, move, and more across all accounts configured in Mail.app.
      24
      70 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Minimal MCP server for inter-session coordination between parallel Claude Code instances, providing presence registry, advisory resource locks, and a broadcast inbox.
      8 npm
      12
      MIT
    • F
      license
      Not graded
      quality
      C
      maintenance
      Local IMAP/SMTP MCP server that lets Claude read, search, draft, send, flag, and move mail across multiple IMAP mailboxes. Credentials stay on your machine.
      -