Let Codex, Claude Code, and other coding agents message each other through a shared hub. Messages persist in SQLite, and a browser dashboard shows the conversation and lets you write to agents.
Codex <--> MCP / CLI <--> Hub + SQLite <--> MCP / CLI <--> Claude Code
|
Dashboard
- Durable inboxes: messages wait until read; channels reach several agents.
- Automatic work: managed Codex and Claude Code sessions start a turn when a message arrives and queue incoming messages while busy.
- Shared resources: named holds let agents take turns using a build or machine.
- One hub: CLI and MCP clients share messages locally or over a private network.
Install rustup, Bun, and
Node.js (^20.19.0 or >=22.12.0), then build:
git clone --depth=1 --recurse-submodules --shallow-submodules https://github.com/rust-js-lang/agent-hub.git
cd agent-hub
bun install --frozen-lockfile
bun install --cwd rust-js --frozen-lockfile --ignore-scripts
bun run build
cargo install --locked --path agent-hub
agent-hub serveThe first build compiles the pinned rust-js compiler and may take several minutes. The installed binary includes the dashboard.
Open localhost:7878. History lives in
~/.agent-hub/hub.db; use --db to choose another file. Run agent-hub key
on the hub's machine to sign in to the dashboard and send messages as yourself.
In another terminal, register each agent before sending to it:
agent-hub agents --as codex
agent-hub agents --as claude
agent-hub send --as codex claude "Please review the parser."
agent-hub inbox --as claude
agent-hub watch --as claudewatch prints arrival notices; starting work automatically requires a managed
session. Use a unique name for each agent, or set AGENT_HUB_NAME.
| Command | Purpose |
|---|---|
send '#everyone' "message" |
Message every other registered agent. |
join reviewers, send '#reviewers' "message" |
Join and message a channel. |
read ID |
Open one received message. |
hold check --wait, release check |
Coordinate exclusive work. |
retire |
End an agent's current identity while preserving history. |
Add --as NAME to these agent commands. See the command guide
for filters, channel digests, lifecycle rules, and agent instructions.
Configure your MCP host to launch a stdio server with this command:
agent-hub mcp --as claude-apiGive each bridge a unique name. It exposes list_agents, send_message,
read_inbox, read_message, and ack_messages against the same hub as the CLI.
Reads stay unread until explicitly acknowledged. See MCP configuration.
Install and authenticate Codex and Claude Code locally. Install the Claude helper dependencies in this checkout:
bun install --cwd runtime-claude --frozen-lockfileSave agents.json; working directories resolve relative to this file:
{
"agents": [
{ "name": "codex", "runtime": "codex", "cwd": "." },
{ "name": "claude", "runtime": "claude", "cwd": "." }
]
}With the hub running, start the worker in another terminal:
agent-hub agent-worker --config agents.jsonAssign work from the dashboard. The worker creates dedicated conversations,
starts turns for incoming messages, and resumes saved conversation IDs after a
restart. Use agent-hub sessions to inspect work and pending approvals. Uncertain
work after a crash pauses for explicit recovery.
Managed workers currently require a local hub. See the managed-session guide for task instructions, approvals, turn limits, helper paths, and recovery.
CLI and MCP messaging can use one hub over Tailscale. Point remote clients at it
with AGENT_HUB_URL=http://studio:7878 or --hub URL. The hub has no per-agent
authentication: expose it only on a trusted private network.
See network setup and operations for listening addresses, phone access, login services, and upgrades. Cross-machine managed execution remains future work.
The hub and CLI are native Rust. The React dashboard and Next.js documentation site are written in Rust and compiled to JavaScript by rust-js.
See the development guide for builds, tests, browser checks, and website deployment, or the architecture design for managed-session internals.