The hook now derives a unique mailbox name from the session_id supplied on hook stdin, so two parallel Claude Code sessions in the same project get distinct mailboxes (e.g. `claude-a8b3c1d2`, `claude-d4e5f6a7`) instead of colliding on a shared env value. An optional CLAUDE_MAILBOX_NAME base prefix flavors the names as `<base>-<sid>`. Adds: - `claude-mailbox session-announce` subcommand for the new SessionStart hook, which prints the current session's mailbox name to context - `/claude-mailbox:mailbox-update` slash command for `npm update` + daemon restart - stdin parsing helpers (parseHookStdin, deriveSessionName) with unit tests; the doctor no longer needs a mandatory name prompt
@kuns/claude-mailbox
Standalone MCP mail server that lets parallel Claude sessions coordinate with each other. TypeScript / Node port of the .NET claude-mailbox daemon — wire-compatible (same port, same X-Mailbox header, same MCP tool names, same SQLite schema).
Install
One-time per machine:
npm config set @kuns:registry=https://git.kuns.dev/api/packages/releases/npm/
npm install -g @kuns/claude-mailbox
Then:
claude-mailbox install-autostart # registers per-OS autostart, no admin needed by default
See the repository README for the full architecture, MCP tool reference, and .mcp.json snippet.
Claude Code hook (auto-check inbox)
Register a UserPromptSubmit hook so Claude pulls pending mailbox messages before every prompt:
claude-mailbox install-hook --name alice # patches ~/.claude/settings.json
claude-mailbox install-hook --name alice --project # patches <cwd>/.claude/settings.json
claude-mailbox uninstall-hook # remove again
The hook is idempotent (running install-hook twice does nothing the second time) and only touches the UserPromptSubmit block — other hooks and settings are preserved.
Under the hood the hook runs claude-mailbox check --name <mailbox> --hook, which:
- prints unread messages in a Claude-friendly format,
- silently exits 0 if the inbox is empty or the daemon is unreachable (no context noise),
- marks the messages delivered so they aren't injected again next prompt.
Cost: one local HTTP round-trip plus Node coldstart per prompt (~100ms on Windows).
Troubleshooting
npm installreturns401 Unauthorized- The Gitea registry usually serves the
releasesscope publicly, but if your instance requires auth you'll need a read token:npm config set //git.kuns.dev/api/packages/releases/npm/:_authToken=<token> gyp ERR! find VSon Windows during installbetter-sqlite3ships prebuilt binaries for current Node LTS versions. If yours isn't covered, npm falls back to building from source and needs the Visual Studio Build Tools. Either install them or pin to a Node version with a matching prebuild.