Files
ClaudeMailbox/plugin/README.md
Mika Kuns 9fd321043f feat(mcp): identity-via-arg + plugin ships .mcp.json
MCP tools (send/check_inbox/peek_inbox/list_mailboxes) now accept the
caller's mailbox name as an explicit argument (from/name), falling back
to the X-Mailbox header for legacy single-session HTTP setups. This
unblocks multi-session coordination through a shared .mcp.json — each
Claude session passes its own session-derived name on every call,
instead of relying on a single transport header that all sessions
would share.

The plugin now ships .mcp.json (no header), and the SessionStart
announcement spells out the exact args to pass to each mcp__mailbox__*
tool so Claude wires it up automatically.
2026-05-19 11:50:58 +02:00

4.1 KiB

claude-mailbox plugin

Lets Claude Code pull unread messages from a local claude-mailbox daemon before every prompt and inject them into the conversation context. Each Claude session gets a unique mailbox identity auto-derived from its session id, so two sessions in the same project never collide.

Setup (three prompts, all inside Claude Code)

/plugin marketplace add https://git.kuns.dev/releases/ClaudeMailbox
/plugin install claude-mailbox@claude-mailbox
/claude-mailbox:mailbox-doctor

The doctor walks the rest:

  1. installs the claude-mailbox binary via npm install -g @kuns/claude-mailbox if missing (asks first)
  2. registers the daemon for autostart and starts it if needed
  3. health-probes http://127.0.0.1:47822/health
  4. optionally lets you set a base prefix (e.g., backend) — without one, mailbox names are anonymous (claude-XXXXXXXX)
  5. runs a self → self smoke test

Restart Claude Code only if step 4 wrote a new prefix. After that, every prompt auto-pulls unread messages.

Mailbox identity (the important bit)

Each Claude Code session gets its own mailbox name, derived from the session's UUID:

Configuration Resulting mailbox name
No CLAUDE_MAILBOX_NAME set claude-a8b3c1d2 (first 8 hex chars of session_id)
CLAUDE_MAILBOX_NAME=backend in .claude/settings.json env backend-a8b3c1d2

So if you open two Claude Code sessions in the same project, they'll be e.g. backend-a8b3c1d2 and backend-d4e5f6a7 — distinct, addressable, no manual setup.

The SessionStart hook announces the current session's mailbox name in the conversation context on startup. Peers discover each other via claude-mailbox list or the mcp__mailbox__list_mailboxes MCP tool.

What the hooks do

Hook Command Effect
SessionStart claude-mailbox session-announce Tells Claude its mailbox name for this session and instructs it on the from / name args to pass to MCP tools.
UserPromptSubmit claude-mailbox check --hook Pulls unread messages for the session's mailbox and injects them as context. Silent on empty inbox; emits a one-line setup hint when the daemon is unreachable.

Cost: one local HTTP round-trip per prompt + Node coldstart (~100ms on Windows).

MCP tools

The plugin also ships a .mcp.json so Claude has direct access to the mailbox via tool calls. Because the X-Mailbox header would be the same for two parallel sessions sharing one .mcp.json, each MCP tool takes the caller's mailbox name as an explicit argument (from the SessionStart announcement):

Tool Required args Purpose
mcp__mailbox__send from, to, body Send a message to another mailbox.
mcp__mailbox__check_inbox name Pull all undelivered messages for your mailbox (marks delivered).
mcp__mailbox__peek_inbox name Non-consuming count of pending messages.
mcp__mailbox__list_mailboxes name Discover known mailboxes and pendingForYou counts.

The SessionStart announcement spells out the exact args to pass, so Claude picks them up automatically.

Slash commands

Command What it does
/claude-mailbox:mailbox-doctor Diagnose + auto-fix the full setup.
/claude-mailbox:mailbox-status Read-only health check. No changes.
/claude-mailbox:mailbox-update Update the daemon to the latest npm version and restart it.

Coordinating two Claude Code sessions

  1. Open two Claude Code sessions in the same (or different) project.
  2. Each session's SessionStart hook announces its mailbox name in context.
  3. In session A you can say: "I have a second session running. Use mcp__mailbox__list_mailboxes to find it and send <msg>." Claude will discover the peer's mailbox and send via mcp__mailbox__send.
  4. Session B's UserPromptSubmit hook pulls the message on its next prompt and injects it as context.

You can also send from any shell:

claude-mailbox list
claude-mailbox send --from probe --to backend-a8b3c1d2 --body "hi"

Uninstall

/plugin uninstall claude-mailbox@claude-mailbox
npm uninstall -g @kuns/claude-mailbox
claude-mailbox uninstall-autostart    # if you registered it