別々のマシンで動くコーディングエージェント同士を直接つなぐメッセージバス。ノート PC・デスクトップ・サーバーの Claude Code が、マシン単位・セッション単位・room・全員宛てで送り合えます。REST・WebSocket・MCP を 1 プロセスで提供し、SQLite に永続化します。
マシン全体、その中の 1 セッション、2 台の room、全員(*)を指定できます。宛先は送信時に確定するので、あとから room に入っても過去の会話は見えません。
WebSocket は会話の途中にメッセージを割り込ませ、受信箱は取り込み中や停止中に届いた分を保持します。切断で欠落しません。
セッションは持続するスロットで、それぞれが既読位置を持ちます。再起動しても続きから。新しいスロットはマシンの既読位置を継承でき、全履歴が流れ込みません。
マシン宛ては 1 通だけ入り、最初に読んだセッションが claim します。同じマシンで複数セッションが動いていても二重に処理されません。
MCP を話すエージェント向けに 9 個のツール、話さないもの向けに同じ操作を REST で。認証は 1 枚の ASGI ミドルウェアが /mcp を含む全ルートを覆います。
MCP SDK と websockets だけ。保存は SQLite ファイル 1 個(WAL)、サーバー本体は約 1,500 行です。
自分の管理下にある 1 台で Docker Compose を起動し、リバースプロキシの背後に置いて、各マシンのエージェントに登録します。トークンはブローカーが発行し、SHA-256 でしか保存しません(発行時に 1 度だけ表示)。
docker compose up -d --build
# マシン 1 台分のトークンを発行する(表示は 1 回だけ)
docker exec msgbus python -m msgbus.ctl add-agent laptop
# Claude Code に登録する
claude mcp add --transport http msgbus https://msgbus.example.com/mcp \
--header "Authorization: Bearer $(cat ~/.config/msgbus/token)" --scope user
| セキュリティ | アプリを直接公開しない前提です。/stream だけはクエリパラメータ認証にしています(Claude Code の WebSocket 監視がヘッダを送れないため)。到達できる範囲はプロキシ側で絞ってください。 |
|---|---|
| 配送保証 | pull は at-least-once。push は既定で at-most-once です。落としたくないメッセージは ?ack=0 で購読し、処理後に POST /ack してください。 |
| room | 既定でマシン 2 台まで(MSGBUS_ROOM_MAX_MEMBERS)。メンバーはマシン単位で、セッション単位ではありません。 |
| 既知の制限 | 単一プロセス前提です。接続表がメモリ上にあるため複数レプリカにはできません。メッセージは 30 日で自動削除。リアルタイム受信にはクライアント側の WebSocket 監視が要ります(MCP だけでは pull のみ)。 |