本页内容
本页内容
CLI 命令
将 OpenClaw 作为 MCP 服务器运行
本页介绍了 openclaw mcp serve 路径:OpenClaw 充当 stdio 上的 MCP 服务器、其工具、事件模型及其限制。
OpenClaw 作为 MCP 服务器
这是 openclaw mcp serve 路径。
何时使用 serve
在以下情况下使用 openclaw mcp serve:
- Codex、Claude Code 或其他 MCP 客户端应直接与 OpenClaw- 支持的通道对话进行对话
- 你已经有一个带有已路由对话的本地或远程 OpenClaw Gateway
- 您需要一台跨 OpenClaw 通道后端工作的 MCP 服务器,而不是运行单独的每通道桥接器
当 OpenClaw 应该自行托管编码运行时并将代理会话保留在 OpenClaw 内部时,请改用 openclaw acp。
工作原理
openclaw mcp serve 启动 stdio MCP 服务器。 MCP 客户端拥有该进程。当客户端保持 stdio 会话打开时,桥接器通过 WebSocket 连接到本地或远程 OpenClaw 网关,并通过 MCP 公开路由通道对话。
客户端生成桥
MCP 客户端启动 openclaw mcp serve。
网桥连接到网关
该网桥通过 WebSocket 连接到 OpenClaw 网关。
会话变成 MCP 对话
路由会话变成 MCP 对话和 transcript/history 工具。
现场活动队列
在桥接器连接期间,实时事件会在内存中排队。
可选Claude推
如果启用Claude通道模式,同一会话还可以接收Claude-特定的推送通知。
重要行为
- 实时队列状态在桥接器连接时开始
- 更早的转录历史通过
messages_read读取 - Claude 推送通知仅在 MCP 会话存活期间存在
- 当客户端断开连接时,桥接器退出,实时队列消失
- 取消
events_wait请求立即释放其服务器端等待和超时 - bridge 或 MCP 传输关闭失败使
openclaw mcp serve失败,而不是报告干净关闭 - 一次性 agent 入口点(例如
openclaw agent和openclaw infer model run)会在回复完成时退出它们打开的任何打包 MCP 运行时,因此重复运行脚本不会累积 stdio MCP 子进程 - stdio MCP 由 OpenClaw 启动的服务器(捆绑或用户配置)在关闭时会作为进程树被拆除,因此在父 stdio 客户端退出后,由服务器启动的子进程将无法生存
- 删除或重置会话会通过共享运行时清理路径释放该会话的 MCP 客户端,因此不会有任何 stdio 连接仍然附着在已移除的会话上
选择客户端模式
通用 MCP 客户端
仅使用标准 MCP 工具。使用 conversations_list、messages_read、events_poll、events_wait、messages_send 以及审批工具。
Claude Code
标准 MCP 工具加上 Claude- 特定通道适配器。启用 --claude-channel-mode on 或保留默认值 auto。
serve 暴露的内容
该桥接使用现有的 Gateway 会话路由元数据来暴露由 channel 支持的对话。当 OpenClaw 已经拥有已知路由的会话状态时,你会得到如下对话信息:
channel- 收件人或目标元数据
- 可选的
accountId - 可选的
threadId
这使得 MCP 客户端可以在一个地方完成以下所有操作:
- 列出最近的已路由对话
- 读取最近的会话记录历史
- 等待新的入站事件
- 通过相同路由发送回复
- 查看桥接连接期间到达的审批请求
用法
本地网关
远程网关(令牌)
远程网关(密码)
详细 / Claude 关闭
桥接工具
conversations_list
列出最近的、由会话支持的对话,这些对话在 Gateway 会话状态中已经有路由元数据。
筛选条件:limit(最大 500)、search、channel、includeDerivedTitles、includeLastMessage。
conversation_get
使用 session_key 通过直接的 Gateway 会话查询返回一个对话。
messages_read
读取一个由会话支持的对话的最近转写消息。limit 默认为 20,最大 200。
attachments_fetch
从一封抄本消息中提取非文本消息内容块和存储的媒体元数据。直接通过网关查找message_id,因此该消息不需要出现在最近历史记录窗口中。持久化条目使用 { "type": "openclaw_media", "media": { ... } },其中 media 可以包括 url、contentType、kind、fileName、维度、持续时间或大小。这是一个元数据视图,而不是独立的持久附件 Blob 存储。
events_poll
读取自数字游标以来排队的实时事件。 limit 最大 200。如果请求的游标早于保留的队列历史记录,则结果还包括 gap.requested_after_cursor 和 gap.oldest_available_cursor。
events_wait
长轮询,直到下一个匹配的排队事件到达或超时到期(默认 30 秒,最长 300 秒)。
当通用 MCP 客户端需要近实时传送而无需 Claude- 特定推送协议时,请使用此选项。即使当前没有保留匹配事件,已知的游标间隙也会立即返回,并带有相同的附加 gap 元数据。
messages_send
通过已记录在该对话上的相同路由发送文本回复。
当前行为:
- 需要存在一个已有的对话路由
- 使用会话的 channel、recipient、account id 和 thread id
- 仅发送文本
permissions_list_open
列出自连接到 Gateway 以来由 bridge 观察到的待处理 exec/plugin 审批请求。
permissions_respond
使用以下之一来处理一个待处理的 exec/plugin 审批请求:
allow-onceallow-alwaysdeny
事件模型
桥在连接期间维护一个内存中的事件队列。
当前事件类型:
messageexec_approval_requestedexec_approval_resolvedplugin_approval_requestedplugin_approval_resolvedclaude_permission_request
Claude 通道通知
该桥还可以公开 Claude- 特定通道通知。这是 OpenClaw 相当于 Claude Code 通道适配器:标准 MCP 工具仍然可用,但实时入站消息也可以作为 Claude- 特定的 MCP 通知到达。
关闭
--claude-channel-mode off:仅提供标准 MCP 工具。
on
--claude-channel-mode on:启用 Claude 通道通知。
自动(默认)
--claude-channel-mode auto:当前默认值;行为与 on 相同。
启用 Claude 通道模式后,服务器会声明 Claude 实验性能力,并且可以发出:
notifications/claude/channelnotifications/claude/channel/permission
当前桥接行为:
- 传入的
user转录消息会作为notifications/claude/channel转发 - 通过 MCP 收到的 Claude 权限请求在内存中进行跟踪
- 如果链接会话中的命令所有者稍后发送
yes <id>或no <id>(<id>是 5 个字母的请求 ID,不包括l),桥会将其转换为notifications/claude/channel/permission - 这些通知仅限于当前在线会话;如果 MCP 客户端断开连接,就没有推送目标
这是有意为之的客户端特定行为。通用 MCP 客户端应依赖标准的轮询工具。
MCP 客户端配置
stdio 客户端配置示例:
对于大多数通用 MCP 客户端,从标准工具表面开始并忽略 Claude 模式。仅对真正了解 Claude- 特定通知方法的客户端打开 Claude 模式。
选项
openclaw mcp serve 支持:
--urlstring网关 WebSocket URL。配置时默认使用 gateway.remote.url。
--tokenstring网关令牌。
--token-filestring从文件中读取令牌。
--passwordstring网关密码。
--password-filestring从文件中读取密码。
--claude-channel-mode"auto" | "on" | "off"Claude 通知模式。默认 auto。
-v, --verboseboolean将详细日志输出到 stderr。
安全与信任边界
桥接器不会凭空创建路由。它只会暴露 Gateway 已经知道如何路由的对话。
这意味着:
- 发送方允许列表、配对以及通道级信任仍然属于底层的 OpenClaw 通道配置
messages_send只能通过已有的已存储路由进行回复- 批准状态仅针对当前桥接会话为 live/in-memory
- 桥接器认证应与其他远程 Gateway 客户端一样使用相同的 Gateway token 或密码控制
如果 conversations_list 中缺少某个对话,通常原因不是 MCP 配置损坏,而是底层 Gateway 会话中的路由元数据缺失或不完整。
测试
OpenClaw 为这座桥提供了可重复的 Docker 烟雾检查:
该烟雾运行单个容器:它播种对话状态,启动网关,然后生成 openclaw mcp serve 作为 stdio 子进程,并将其作为 MCP 客户端驱动。它通过真实的 stdio MCP 桥验证对话发现、转录读取、附件元数据读取、实时事件队列行为以及 Claude-style 通道和权限通知。出站发送路由(messages_send 重用存储的对话路由)由 src/mcp/channel-server.test.ts 中的单元测试单独覆盖。
这是在不将真实的 Telegram、Discord 或 iMessage 账号接入测试运行的情况下,证明桥接可正常工作的最快方式。
有关更广泛的测试上下文,请参阅 测试。
故障排除
没有返回任何对话
这通常意味着 Gateway 会话尚未可路由。请确认底层会话已存储 channel/provider、recipient,以及可选的 account/thread 路由元数据。
events_poll 或 events_wait 错过较旧的消息
实时队列在网桥连接时启动并保留有界窗口。如果结果包含 gap,请使用 messages_read 读取持久转录本历史记录,然后将 after_cursor 设置为比 gap.oldest_available_cursor 少 1 来恢复。
Claude 通知不显示
请检查以下所有项:
- 客户端保持了 stdio MCP 会话处于打开状态
--claude-channel-mode为on或auto- 客户端实际了解了Claude-具体通知方法
- 传入消息发生在桥接器连接之后
缺少批准
permissions_list_open 只显示在桥接器连接期间观察到的审批请求。它不是一个持久化的审批历史 API。
当前限制
该桥有以下限制:
- 会话发现依赖于现有的 Gateway 会话路由元数据
- 没有超出 Claude- 特定适配器的通用推送协议
- 没有消息编辑或反应工具
- HTTP/SSE/streamable-http 传输连接到单个远程服务器;上游未复用
permissions_list_open只包含桥接连接期间观察到的审批。