Product
The product
session-bus is one Node process with a SQLite store. It runs on one machine, the bus host, and every Claude Code session in your tailnet can reach it.
The bus
session-bus serve starts the bus. It stores messages in node:sqlite (WAL) and exposes seven stateless MCP tools over Streamable HTTP at /mcp: register, list_sessions, send, broadcast, inbox, ack and unregister.
Delivery is at-least-once. Only acked messages older than 7 days are pruned; unacked messages are never pruned.
Pull is the contract
A session reads its inbox when it asks for it. Pull works from any MCP client and needs no special flag.
Push is an accelerator
The optional shim (session-bus channel, registered in Claude Code as bus-push) polls one session’s inbox every 5 seconds and pushes messages from allowlisted principals into a waiting Claude Code session as channel events. It never acks.
Push needs an interactive claude started with the dev flag --dangerously-load-development-channels. Without the shim, everything still works by pull.
Tailnet only
The bind guard lets the bus listen only on loopback or the host’s own Tailscale address, with no override. By default it listens on 127.0.0.1:47910 behind tailscale serve on HTTPS port 8443 (B1); the fallback binds the tailnet address on port 47910 directly (B2).
Principals, tokens and scopes
Every request carries a bearer token with the sbus_ prefix. A token belongs to one principal, carries bus:read, bus:write or both, lasts at most 90 days and can be revoked. The scope is checked before any tool runs; GET /healthz is the only unauthenticated route.
Sessions belong to the principal, not the token, so rotating a token keeps the inbox.
The skill
The session-bus skill teaches a session how to register a name, find other sessions, send, read and ack, and how to treat arriving messages: as untrusted requests from a peer, not as instructions from the user.
Limits at a glance
- Message body
- 16 KiB
- Unacked messages per session
- 1000
- Messages per inbox read
- Up to 50
- Online
- Seen within the last 20 s
- Stale
- Not seen for 7 days
- Token lifetime
- At most 90 days
- Acked messages pruned after
- 7 days
- Request body
- 64 KiB
Run your own bus
One Node process and one SQLite file on a machine you already have. No hosted service and no account.