Skip to main content

Real-time cross-machine MCP relay for Claude Code agents — send and receive messages across named channels.

Project description

Claude Bridge

Real-time cross-machine communication for Claude Code agents.

CI Python License MCP


Claude Code's native Agent Teams coordinate multiple instances on the same machine. Claude Bridge fills the gap — it lets Claude Code agents on different machines communicate in real time over a shared MCP relay server.

Windows PC (Claude Code)         MacBook (Claude Code)
         |                                |
         |   SSE · Tailscale / LAN        |  ← server runs here
         +-------> Claude Bridge <--------+
                    :8765

One agent sends. The other receives. No polling hacks, no shared filesystems, no cloud dependencies.


Architecture

Architecture


Quickstart

1. Install (on the machine that will host the server)

pip install claude-code-bridge          # server + web dashboard
pip install claude-code-bridge[tui]     # also brings the terminal UI

Why the PyPI name differs from the project name: claude-bridge was already taken on PyPI by an unrelated project. The distribution name is claude-code-bridge; the import name (import claude_bridge) and the CLI command (claude-bridge) are unchanged.

Or from a clone if you'd like to hack on it:

git clone https://github.com/constripacity/Claude-Bridge.git
cd Claude-Bridge
pip install -e .[dev]              # editable install with test/lint deps

2. Start the server

claude-bridge                       # defaults: 0.0.0.0:8765, ./claude-bridge.db
# or pick a custom port / db path:
claude-bridge --port 9000 --db /var/lib/claude-bridge/bridge.db
# or disable the web dashboard if you only want the MCP transport:
claude-bridge --no-dashboard
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Claude Bridge — General MCP Relay Server
  Version: 0.6.0
  http://localhost:8765/             ← Dashboard
  http://localhost:8765/sse          ← Local MCP config
  http://<host-address>:8765/sse    ← Remote machines (LAN/Tailscale)
  http://localhost:8765/api/state    ← JSON state for dashboard
  http://localhost:8765/status       ← Health check
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3. Connect each Claude Code session to the bridge

Use the claude mcp add CLI on every machine that should use the bridge — including the host. Don't edit ~/.claude/settings.json directly; current Claude Code rejects the legacy mcpServers block at the schema level.

Host machine — points at the local server:

claude mcp add --transport sse -s user claude-bridge http://localhost:8765/sse

Remote machines — point at the host's reachable address (LAN IP, Tailscale IP, or any other network route):

claude mcp add --transport sse -s user claude-bridge http://<host-address>:8765/sse

Use -s user to share the entry across all your projects, or -s local to scope it to one. Verify with claude mcp listclaude-bridge should show as ✓ Connected. If a Claude Code session is already running, type /mcp inside it to re-handshake (or restart the session) so the new tools register.

That's it. Every connected Claude Code session now has six new tools.


MCP Tools

Tool Description
bridge_send Send a message to a named channel
bridge_receive Read messages — pass since_id for incremental polling
bridge_channels List all active channels and message counts
bridge_ping Health check + server stats
bridge_clear Clear all messages from a channel
bridge_status Cross-channel overview with recent messages

Usage

Agents communicate over named channels. Convention: <project>:<role>.

Machine A (orchestrator):

bridge_send(
  channel="myproject:orchestrator",
  sender="windows",
  content='{"type":"task","phase":1,"action":"run_tests"}'
)

Machine B (worker):

bridge_receive(channel="myproject:orchestrator")
→ gets the task

bridge_send(
  channel="myproject:worker",
  sender="mac",
  content='{"type":"result","phase":1,"status":"complete","tests_run":61,"failures":0}'
)

Machine A polls for results:

bridge_receive(channel="myproject:worker", since_id="<last_id>")

The since_id parameter ensures each agent only processes new messages on every poll.


Channel Naming

Channels are created on first write — no registration needed.

<project>:orchestrator   →  A sends tasks to B
<project>:worker         →  B sends results to A
<project>:events         →  shared event log
<project>:debug          →  verbose diagnostics
general:sync             →  cross-project coordination

Networking

The bridge is plain HTTP + Server-Sent Events. As long as the client machine can reach the host's :8765, it works — pick whatever connectivity fits your setup:

  • Single machine — use localhost. Nothing to set up.
  • Same LAN — use the host's LAN IP (e.g. 192.168.1.42). No port forwarding needed.
  • Different networks (the original motivating case) — use a private overlay between machines:
    • Tailscale is the simplest and what this project is tested against. Install on both machines, join the same tailnet, use the host's tailnet IP in the remote MCP config, and keep :8765 firewalled to the tailnet — no public exposure.
    • Other mesh VPNs (ZeroTier, Nebula, headscale) work the same way.
    • A reverse proxy with auth on a public host also works, but the bridge itself has no auth yet (see roadmap), so don't expose a bare instance to the open internet.

Why not use Agent Teams?

Claude Code's built-in Agent Teams (experimental, requires CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1) coordinate agents on the same machine. They share a process, a filesystem, and a local network. There's no mechanism for two agents running on separate physical machines to talk to each other.

Claude Bridge is the missing layer. It's intentionally minimal — a relay, not an orchestrator. Your agents stay in control of their own logic.


CLAUDE.md

A ready-to-use CLAUDE.md is included. Drop it in your project root or add it to your global ~/.claude/CLAUDE.md to give every Claude Code session full context on how to use the bridge, which channels belong to which project, and what each machine's role is.


Web Dashboard

Open http://localhost:8765/ in any browser for a live monitor of channels, messages, and senders. It polls /api/state + /api/messages every 2 seconds, lets you click into any message for a JSON-highlighted inspector, and includes a working send composer (pick a sender, type or paste JSON, ⌘↵ / Ctrl↵ to send) and a per-channel clear button. Adapts to mobile viewports automatically.

The dashboard speaks a small JSON API alongside the MCP /sse transport:

Endpoint Purpose
GET /api/state All channels + counts + senders + uptime in one call
GET /api/messages?channel=X[&since_id=Y][&limit=N] Feed for one channel
GET /api/messages/{id} Full message detail (parsed JSON, byte size)
POST /api/send {channel,sender,content} Same effect as bridge_send
POST /api/clear {channel} Drop all messages on a channel

Sends from the dashboard are indistinguishable from MCP bridge_send calls — they share the same INSERT path.


Terminal UI

If you live in a terminal, run the TUI companion instead of (or alongside) the web dashboard. Install the [tui] extra and use the module entry point:

pip install claude-bridge[tui]
python -m claude_bridge.tui
# or:  python -m claude_bridge.tui --url http://<host>:8765 --sender mac

It's a Textual app that talks to the same JSON API as the dashboard, so they're always in sync. Channels in a sidebar, live-polled feed with sender/type colouring, a JSON-highlighted inspector, send composer, filter, clear, and pause — all keyboard-driven (? for help, q to quit).

Design reference for every layout (full / compact / narrow / states) lives in docs/design/terminal/ — open index.html to browse the artboards.


Persistence

Messages are persisted to a local SQLite database (./claude-bridge.db by default) so they survive server restarts. Override the path with the CLAUDE_BRIDGE_DB environment variable:

CLAUDE_BRIDGE_DB=/var/lib/claude-bridge/bridge.db claude-bridge
# or:  claude-bridge --db /var/lib/claude-bridge/bridge.db

The schema is a single messages table — easy to inspect with sqlite3. Use bridge_clear to drop a channel.


Roadmap

  • Optional SQLite persistence (survive server restarts)
  • Web dashboard (live channel monitor in the browser)
  • claude-bridge PyPI package + CLI entrypoint
  • Auth token support (shared secret per channel or global)
  • stdio transport (for pure local use without HTTP)
  • Submit to MCP server directory
  • WebSocket transport (alternative to SSE) — deferred unless requested

Requirements

  • Python 3.10+
  • mcp, starlette, uvicorn, anyio (declared in pyproject.toml; installed automatically by pip install claude-bridge)
  • A reachable network path between machines — localhost, LAN, Tailscale, or any other route (see Networking)

Performance

The server is intentionally lightweight:

  • Idle CPU: ~0% (M-series efficiency cores, no busy loop)
  • Memory: ~25MB
  • Latency: <5ms on LAN, <20ms over Tailscale
  • Messages: persisted to SQLite (WAL mode) — survives restarts

Safe to run on a MacBook Air M3 without thermal impact.


Contributing

See CONTRIBUTING.md. PRs welcome, especially for the roadmap items above.


License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

claude_code_bridge-0.6.0.tar.gz (40.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

claude_code_bridge-0.6.0-py3-none-any.whl (38.0 kB view details)

Uploaded Python 3

File details

Details for the file claude_code_bridge-0.6.0.tar.gz.

File metadata

  • Download URL: claude_code_bridge-0.6.0.tar.gz
  • Upload date:
  • Size: 40.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.9

File hashes

Hashes for claude_code_bridge-0.6.0.tar.gz
Algorithm Hash digest
SHA256 c759d0f6417e10d1a6fedd300554d8d6e97d1f9ee4d696ec48bef6daec29e120
MD5 cc74ea22592dfea321f75a5db709677a
BLAKE2b-256 aadf84f206b7d275f8865306cd9dd01008896b1c958b825c7ed17d34262e3f25

See more details on using hashes here.

File details

Details for the file claude_code_bridge-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for claude_code_bridge-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a5e45211f9d2e5b9e7e83dddbc11eca8040f50c8c8f50c56637ff654c1241e30
MD5 90187f4290f00db49107c68e54ec8f5b
BLAKE2b-256 5440e79a933dce5c81ced61d312359b0ac7ae8a1c0c2b03c6eb96c8e33d43e07

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page