Skip to content
session-bus
Menu

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.