传输与 OAuth
以下是已保存的 MCP 服务器定义可使用的传输形态,以及 HTTP 传输可用来进行身份验证的 OAuth 工作流。
当 Codex 拥有 MCP 连接时,显式的 connectionTimeoutMs 值控制启动过程(包括初始化和初始工具发现),requestTimeoutMs 值控制工具调用。OpenClaw 在将这些值转换为 Codex 的秒级设置时会保留毫秒精度;未设置的值保留 Codex 的默认值。supportsParallelToolCalls 提示也会被转发。Codex 还可以并行运行带有 readOnlyHint 注解的工具。
Stdio 传输¶
启动一个本地子进程,并通过 stdin/stdout 进行通信。
| 字段 | 描述 |
|---|---|
command |
要启动的可执行文件(必填) |
args |
命令行参数数组 |
env |
额外的环境变量 |
cwd / workingDirectory |
进程的工作目录 |
关闭操作可强制缓慢的锚点和中继在其控制管道、输出管道和谱系管道关闭后退出。仍然存活的锚点会通过其中继被杀死并回收。如果锚点组已不存在,宿主可以直接杀死无响应的中继。宿主随后确认实际退出和组消失。已确认的清理正常完成;后续连接会启动全新的服务器。未确认的清理仍会报告错误,其中包含缺失的关闭事实、已用时间以及任何失败的信号传递。关闭升级时,清理截止时间不会改变。
Warning
Stdio 环境安全过滤器
OpenClaw 在生成 stdio MCP 服务器之前会拒绝解释器启动、加载器劫持和 shell 初始化环境变量键,即使它们出现在服务器的 env 块中。这与其他 OpenClaw 生成的进程使用相同的主机环境安全策略:它会阻止已知的解释器启动钩子(例如 NODE_OPTIONS、PYTHONSTARTUP、PERL5OPT、RUBYOPT、BASHOPTS、KSH_ENV)、共享库和函数注入前缀(DYLD_*、LD_*、BASH_FUNC_*)以及类似的运行时控制变量。启动时会静默丢弃这些变量并记录警告,以免它们向 stdio 进程注入隐式前奏、替换解释器、启用调试器或劫持动态链接器。显式的允许列表可让普通 MCP 凭据环境变量(GITHUB_TOKEN、GH_TOKEN、GITLAB_TOKEN、NPM_TOKEN、NODE_AUTH_TOKEN、DATABASE_URL、MONGODB_URI、REDIS_URL、AMQP_URL、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET)以及普通代理和特定于服务器的环境变量(HTTP_PROXY、自定义 *_API_KEY 等)保持可用。其他 AWS_* 键(如 AWS_CONFIG_FILE 和 AWS_SHARED_CREDENTIALS_FILE)仍会被阻止,因为它们指向凭据文件,而非直接携带凭据值。
如果你的 MCP 服务器确实需要某个被阻止的变量,请在网关宿主进程上设置它,而不是放在 stdio 服务器的 env 下。
SSE / HTTP 传输¶
通过 HTTP Server-Sent Events 连接到远程 MCP 服务器。
| 字段 | 描述 |
|---|---|
url |
远程服务器的 HTTP 或 HTTPS URL(必填) |
headers |
可选的 HTTP 标头键值映射(例如身份验证令牌) |
connectionTimeoutMs |
每台服务器的连接超时时间(毫秒,可选) |
requestTimeoutMs |
每台服务器的 MCP 请求超时时间(毫秒) |
auth: "oauth" |
使用 openclaw mcp login 保存的 MCP OAuth 凭据 |
sslVerify |
仅对明确受信任的私有 HTTPS 端点设为 false |
clientCert / clientKey |
mTLS 客户端证书和密钥路径 |
supportsParallelToolCalls |
提示此服务器的并发调用是安全的 |
示例:
{
"mcp": {
"servers": {
"remote-tools": {
"url": "https://mcp.example.com",
"auth": "oauth",
"requestTimeoutMs": 20000,
"headers": {
"Authorization": "Bearer <token>"
}
}
}
}
}
url(用户信息)和 headers 中的敏感值会在日志和状态输出中被脱敏。当看似敏感的 headers 或 env 条目包含字面值时,openclaw mcp doctor 会发出警告,以便操作员将这些值移出已提交的配置。
如果旧版 SSE 消息端点返回 HTTP 404,或有状态的 Streamable HTTP 会话过期,OpenClaw 会让该连接退役,并在下一次发现时重新连接。失败的调用会被报告而不会重放,因为工具可能在连接失败之前就已经改变了状态。
OAuth 工作流¶
OAuth 适用于声明支持 MCP OAuth 流程的 HTTP MCP 服务器。启用 auth: "oauth" 时,服务器会忽略静态的 Authorization 标头。默认情况下,OAuth 凭据是共享的,并由操作员管理。通过 openclaw mcp login 保存的凭据可用于嵌入式 MCP、CLI 运行器和本地 Codex 应用服务器。
原生 MCP OAuth 会话存储在仅所有者可访问的共享 SQLite 数据库中,路径为 <state-dir>/state/openclaw.sqlite(mcp_oauth_stores)。该行可包含访问令牌和刷新令牌、动态客户端注册密钥、发现元数据以及临时的 PKCE 验证器。刷新、登录和注销使用同一个 SQLite 租约,因此并行的 OpenClaw 进程无法消耗同一个刷新令牌,也无法复活已注销的会话。
仅由 openclaw doctor --fix 处理从已退役的 <state-dir>/mcp-oauth/*.json 存储进行的升级。运行时代码从不读取、写入或回退到这些文件。
在共享凭据可用之前,OpenClaw 只会将该 MCP 服务器从代理运行时中省略,而不是使代理回合失败。操作员或具有 shell 访问权限的代理随后可以运行 openclaw mcp login <name>,并在后续回合中使用该服务器。
如果服务器以 insufficient_scope 拒绝令牌,OpenClaw 会保留请求的 scope,并要求执行 openclaw mcp login <name>,而不是重复无法授予新 scope 的刷新。该登录会启动新的授权请求,同时保留先前令牌,直到替换凭据被保存。
当远程 MCP 服务已由另一个支持刷新的 OpenClaw 认证配置支持时,可以可选地设置 oauth.authProfileId。OpenClaw 会在运行时投影前刷新任一凭据源,并只将当前访问令牌传递给下游 MCP 客户端。
当每个已认证发送者都应连接独立账户时,设置 oauth.identity: "per-requester"。按请求者 OAuth 需要 HTTP 服务器 URL,并且不能使用 oauth.authProfileId。将 gateway.publicOrigin 配置为 Gateway 的外部可达 HTTPS 源;本地开发期间,仅对字面回环主机(localhost、127.0.0.1 或 [::1])接受 HTTP。授权后,提供商会重定向到 <gateway.publicOrigin>/oauth/mcp/callback。
{
gateway: {
publicOrigin: "https://gateway.example.com",
},
mcp: {
servers: {
docs: {
url: "https://mcp.example.com/mcp",
transport: "streamable-http",
auth: "oauth",
oauth: {
identity: "per-requester",
scope: "docs.read",
},
},
},
},
}
按请求者流程由发送者驱动:
- 发送者在连接账户之前调用来自该服务器的工具。
- OpenClaw 会为该发送者返回登录链接,而不是暴露其他发送者的凭据。
- 提供商通过 Gateway 回调进行重定向。回调成功后,发送者使用其已连接账户重试工具调用。
如果缺少 gateway.publicOrigin,登录结果会指明该设置,并且 openclaw doctor 会报告相同操作员修复。openclaw mcp login 和 openclaw mcp logout 仍然是仅限操作员命令,用于共享凭据;它们不管理按请求者账户。
登录链接是一次性 bearer 链接:任何打开该链接的聊天参与者都会将自己账户连接到该链接所针对的发送者。在可信发送者彼此互相信任的频道中使用按请求者 OAuth;请求者私有的登录交接被记录为后续工作。
共享操作员流程使用以下命令:
1. 保存服务器
使用 auth: "oauth" 和任意可选 OAuth 元数据添加或更新服务器。
openclaw mcp set docs '{"url":"https://mcp.example.com/mcp","transport":"streamable-http","auth":"oauth","oauth":{"scope":"docs.read"}}'
对于由认证配置支持的 bearer,保存配置绑定:
openclaw mcp set docs '{"url":"https://mcp.example.com/mcp","transport":"streamable-http","auth":"oauth","oauth":{"authProfileId":"docs:mcp"}}'
2. 开始登录
运行登录以创建授权请求。
OpenClaw 会启动已注册的回环回调,打印授权 URL,并将临时 OAuth verifier 状态存储在共享 SQLite 中。在浏览器中批准请求并返回终端;回调到达后,令牌交换会自动完成。
3. 必要时使用手动回退
如果浏览器运行在另一台机器上,或无法访问打印的回环地址,请复制返回的代码并将其传回 OpenClaw。
4. 检查授权
使用 status 或 doctor 确认令牌存在且不需要额外授权。如果 status 报告 authorization-required,或 doctor 要求额外授权,请再次运行 openclaw mcp login <name>。
5. 清除凭据
登出会删除已存储的 OAuth 凭据,但保留已保存的服务器定义。
如果提供商轮换令牌或授权状态卡住,请运行 openclaw mcp logout <name>,然后重复 login。即使 auth: "oauth" 已从配置中移除,只要服务器名称和 URL 仍能标识凭据存储条目,logout 就可以清除已保存 HTTP 服务器的凭据。
Streamable HTTP 传输¶
streamable-http 是与 sse 和 stdio 并列的额外传输选项。它使用 HTTP 流式传输与远程 MCP 服务器进行双向通信。
| Field | Description |
|---|---|
url |
远程服务器的 HTTP 或 HTTPS URL(必填) |
transport |
设置为 "streamable-http" 以选择此传输;省略时,OpenClaw 使用 sse |
headers |
可选的 HTTP 头键值映射(例如 auth tokens) |
connectionTimeoutMs |
每服务器连接超时时间(毫秒,可选) |
requestTimeoutMs |
每服务器 MCP 请求超时时间(毫秒) |
auth: "oauth" |
使用由 openclaw mcp login 保存的 MCP OAuth 凭据 |
sslVerify |
仅对明确信任的私有 HTTPS 端点设置为 false |
clientCert / clientKey |
mTLS 客户端证书和密钥路径 |
supportsParallelToolCalls |
提示并发调用对此服务器是安全的 |
| 字段 | 描述 |
|---|---|
OpenClaw 配置使用 transport: "streamable-http" 作为规范拼写。CLI 原生 MCP 中 type: "http" 的值在通过 openclaw mcp set 保存时会被接受,并会在现有配置中由 openclaw doctor --fix 修复,但 transport 才是嵌入式 OpenClaw 直接使用的字段。
示例:
{
"mcp": {
"servers": {
"streaming-tools": {
"url": "https://mcp.example.com/stream",
"transport": "streamable-http",
"connectionTimeoutMs": 10000,
"requestTimeoutMs": 30000,
"headers": {
"Authorization": "Bearer <token>"
}
}
}
}
}
Note
Registry 命令不会启动通道桥接。只有 probe 和 doctor --probe 会打开一个实时 MCP 客户端会话,以证明目标服务器可达。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw