╔═══════════════════════════════════════════════════════════╗
║ ║
║ ░█▀▀░█░░░█▀█░█░█░█▀▄░█▀▀░░░█▀▄░█▀▀░█░░░█▀█░█░█ ║
║ ░█░░░█░░░█▀█░█░█░█░█░█▀▀░░░█▀▄░█▀▀░█░░░█▀█░░█░ ║
║ ░▀▀▀░▀▀▀░▀░▀░▀▀▀░▀▀░░▀▀▀░░░▀░▀░▀▀▀░▀▀▀░▀░▀░░▀░ ║
║ ║
║ Session A ──task──▶ [RELAY] ──SSE──▶ Session B ║
║ Session B ──reply─▶ [RELAY] ──notify─▶ Session A ║
║ │ ║
║ [SQLite] ║
║ ║
╚═══════════════════════════════════════════════════════════╝
克劳德中继MCP服务器
用于会话间通信的MCP服务器 克劳德代码 实例。通过持久存储、访问控制和@notice路由,在机器上路由任务、群聊和协调多个AI代理。
兼容性说明——Codex CLI尚不受支持。 继电器可以安装在 OpenAI Codex命令行界面 并且将会话注册为机器,但Codex不会向模型显示MCP服务器发起的通知。Codex进程接收传入的任务和聊天消息,但只写入跟踪日志,因此模型永远看不到它们,也无法回复。这在上游进行了跟踪 openai/代码#15299 --一旦着陆,双向克劳德密码↔ Codex中继应在这一侧无变化地工作。在此之前,在两端使用Claude Code,或将Codex作为子流程调用(codex exec)来自Claude Code工作人员会话。
运作原理
Session A (host) Relay Server Session B (client)
| | |
|-- relay_send_task ------>| |
| |-- SSE push task ------>|
| | (processes task)
| |<-- relay_reply --------|
|<-- channel notification -| (task completed) |
中继器作为MCP服务器在stdio上运行。在 主机模式,它还启动了一个HTTP服务器,该服务器接受任务并通过SSE进行广播。在 客户端模式 (端口已占用),它订阅主机的SSE流并将消息中继到本地Claude Code会话。
特性
- SQLite持久性 (WAL模式)--任务、聊天和计算机注册表在重启后仍然有效
- 乐观锁定 --基于版本的并发控制可防止竞争条件
- Idempotency键 --无重复的安全任务重试
- 带ACL的房间 --每个代理每个房间的读/写/历史权限
- @提及路线 --
@researcher 仅交付给该代理
- 断路器 --降级的机器在连续3次故障后停止接收任务
- 指数退避 --带有抖动的SSE重新连接可防止闪电群
- 自我清理 --代理永远不会收到自己的广播消息
- 审核日志 --为调试记录的每个状态转换
- 观察者流 --SSE消防水带
/observe 用于仪表板
快速开始
npm install
npm run build
主机会话(运行HTTP服务器)
claude --dangerously-load-development-channels server:claude-relay
客户端会话(通过SSE连接到主机)
RELAY_URL=http://host-ip:8788 RELAY_SESSION_NAME=worker \
claude --dangerously-load-development-channels server:claude-relay
交叉机器(通过Tailscale或直接IP)
# On remote machine
RELAY_URL=http://100.86.56.43:8788 \
RELAY_TOKEN=your-shared-secret \
RELAY_SESSION_NAME=mac-mini \
claude --dangerously-load-development-channels server:claude-relay
配置
| 变量 |
默认值 |
描述 |
RELAY_PORT |
8788 |
HTTP服务器端口 |
RELAY_BIND |
0.0.0.0 |
绑定地址 |
RELAY_URL |
http://127.0.0.1:8788 |
中继URL(客户端模式) |
RELAY_TOKEN |
(空) |
身份验证的承载令牌(空=打开) |
RELAY_SESSION_NAME |
(自动) |
会话标识符 |
RELAY_TASK_TTL_HOURS |
8 |
任务到期时间 |
RELAY_DB_PATH |
relay.db |
SQLite数据库文件路径 |
MCP工具
| 工具 |
说明 |
relay_send_task |
将任务发送到另一个会话。返回轮询的任务ID。 |
relay_check_task |
检查任务状态并检索结果。 |
relay_reply |
向请求者报告任务结果。 |
relay_list_machines |
列出处于联机/脱机状态的已连接机器。 |
relay_chat |
向房间发送群聊消息。 |
relay_chat_history |
获取房间的最近聊天记录。 |
relay_respond_permission |
批准/拒绝远程会话的工具权限请求。 |
HTTP API
任务
| 方法 |
端点 |
身份验证 |
描述 |
| 职位 |
/task |
是 |
创建任务(支持 idempotency_key) |
| 得到 |
/task/:id |
是 |
检查任务状态和结果 |
| PUT |
/task/:id |
是 |
提交任务结果 |
| 得到 |
/tasks |
是 |
列出所有任务 |
聊天
| 方法 |
端点 |
身份验证 |
描述 |
| 职位 |
/chat |
是 |
发送聊天消息(支持 @mentions) |
| 得到 |
/chat |
是 |
按房间获取聊天记录 |
房间和门禁
| 方法 |
端点 |
身份验证 |
描述 |
| 得到 |
/rooms |
是 |
列出所有具有ACL的房间 |
| 职位 |
/rooms |
是 |
创建具有权限的房间 |
| PUT |
/rooms/:id/acl |
是 |
设置每个代理的权限 |
每个代理的房间权限: read, write, history (每个真/假)。默认设置为打开(全部允许)。
机器
| 方法 |
端点 |
身份验证 |
描述 |
| 得到 |
/machines |
是 |
列出处于联机/降级/脱机状态的机器 |
| 职位 |
/machines/heartbeat |
是 |
客户端心跳 |
权限
| 方法 |
端点 |
身份验证 |
描述 |
| 职位 |
/permission |
是 |
许可裁决(允许/拒绝) |
| 得到 |
/permissions |
是 |
列出待处理的权限请求 |
流和可观测性
| 方法 |
端点 |
身份验证 |
描述 |
| 得到 |
/ |
否 |
健康检查 |
| 得到 |
/subscribe |
是 |
客户端会话的SSE流 |
| 得到 |
/observe |
是 |
所有事件的SSE消防水带(用于仪表板) |
| 得到 |
/history |
是 |
初始加载的完整事件历史记录 |
建筑
src/
├── index.ts # Entry point — wires modules, HTTP routes, MCP tools
├── relay/
│ ├── tasks.ts # Task store: CRUD, state machine, optimistic locking
│ ├── chat.ts # Chat store: rooms, history
│ ├── machines.ts # Machine registry: heartbeat, circuit breaker
│ └── permissions.ts # Permission request/grant flow (in-memory)
└── store/
├── db.ts # SQLite setup, WAL mode, migrations
├── schema.ts # Table definitions
└── audit.ts # Append-only audit log
- 模块化单片 --具有明确边界、单一进程的域模块
- 双模 --主机(HTTP服务器)或客户端(SSE订阅者),启动时自动检测
- SQLite WAL --持久存储,每秒约50000次写入
- 乐观锁定 --
version 任务列可防止并发更新冲突
- 断路器 --连续3次故障将机器标记为
degraded
- 指数回退+抖动 --SSE重新连接:
min(30s, 1s * 2^attempt * random)
发展
npm run dev # Watch mode with tsx
npm run build # Compile TypeScript
npm test # Run tests (48 tests across 7 suites)
路线图
- 人在循环审查UI --用于评估代理输出的三面板仪表板
- 法学硕士作为法官 --人工干预的自动评分规则
- 故障分类 --用于发现代理中断位置的结构化标记
- 黑曜石出口 --将评估数据导出到vault进行反射
- Ack协议 --带有重试和死信队列的送达确认
看 计划.md 对于完整的v2设计。
相关项目
作者
格莱布·卡利宁 --教育家、产品设计师、人类人工智能协作工具的构建者。
许可证
Apache 2.0——请参阅 许可证.