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.
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:
- installs the
claude-mailboxbinary vianpm install -g @kuns/claude-mailboxif missing (asks first) - registers the daemon for autostart and starts it if needed
- health-probes
http://127.0.0.1:47822/health - optionally lets you set a base prefix (e.g.,
backend) — without one, mailbox names are anonymous (claude-XXXXXXXX) - 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
- Open two Claude Code sessions in the same (or different) project.
- Each session's SessionStart hook announces its mailbox name in context.
- In session A you can say: "I have a second session running. Use
mcp__mailbox__list_mailboxesto find it and send<msg>." Claude will discover the peer's mailbox and send viamcp__mailbox__send. - Session B's
UserPromptSubmithook 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