Codex 工具系统与 MCP 客户端实现解析
大约 2 分钟
Codex 工具系统与 MCP 客户端实现解析
1. 架构定位:Rust 原生 MCP 协议支持
在 Model Context Protocol (MCP) 和原生工具(Native Tools)扩展支持方面,Codex 独立实现了 Rust 原生协议栈,主要由以下模块构成:
rmcp-client([codex-rs/rmcp-client](file:///Users/util6/fork-code/codex/codex-rs/rmcp-client)):高效、强类型定义的 Model Context Protocol 客户端实现,支持 Stdio / UDS / HTTP SSE 等底层传输协议。codex-mcp([codex-rs/codex-mcp](file:///Users/util6/fork-code/codex/codex-rs/codex-mcp)):桥接逻辑,管理本地及远程 MCP 服务端的注册、握手与 Capability 协商。mcp_tool_call.rs([codex-rs/core/src/mcp_tool_call.rs](file:///Users/util6/fork-code/codex/codex-rs/core/src/mcp_tool_call.rs)):工具调用的核心调度器,处理参数改写、审批评估、并发分发与结果清洗。
┌─────────────────────────────────────────────────────────┐
│ mcp_tool_call │
│ │
│ ┌─────────────────────────┐ ┌─────────────────────┐ │
│ │ OpenAI File Rewriting │ │ Guardian Approval │ │
│ └────────────┬────────────┘ └──────────┬──────────┘ │
│ │ │ │
│ ┌────────────▼───────────────────────────▼──────────┐ │
│ │ App Tool Policy Evaluator │ │
│ └────────────┬──────────────────────────────────────┘ │
└───────────────┼─────────────────────────────────────────┘
│
▼ RMCP Transport Protocol (Stdio / UDS)
┌─────────────────────────────────────────────────────────┐
│ External MCP Servers │
│ • GitHub MCP • Memory MCP • Postgres MCP ... │
└─────────────────────────────────────────────────────────┘2. 工具调用链路与类型清洗 (mcp_tool_call.rs)
在 [codex-rs/core/src/mcp_tool_call.rs](file:///Users/util6/fork-code/codex/codex-rs/core/src/mcp_tool_call.rs) 中,一次完整的 MCP 工具调用遵循以下标准管道:
- 参数拦截与重写 (
rewrite_mcp_tool_arguments_for_openai_files):若传入参数包含文件对象引用,拦截并转换为本地临时缓存路径。 - App 策略评估 (
AppToolPolicyEvaluator):根据配置好的权限规则表(AppToolPolicy)评估调用合法性。 - Guardian 审批核查 (
GuardianApprovalRequest):对敏感 MCP 操作(如生产环境数据库写入)触发 Guardian / Reviewer 深度安全审计。 - RMCP 传输调度 (
rmcp::CallToolResult):通过rmcp-client将结构化 JSON-RPC 请求发往 MCP Server 进程,异步等待响应。 - 结果封装与上报 (
McpToolCallItem):清洗执行结果、异常状态码及 Metrics,打上 OTEL (OpenTelemetry) 标签后回传给 Agent 主 Loop。
3. Native Skills 与 MCP 组合生态
除标准 MCP 外,Codex 同样内置了类似 Skill 的拓展机制:
core-skills/skills:本地嵌入的专用指令集与 Prompt 模板。- MCP 与 Skill 联动 (
mcp_skill_dependencies.rs):当特定 Skill 被触发时,自动激活其依赖的后台 MCP Server,实现按需建立连接,降低长连接内存开销。
4. 跨 Agent 工具适配对比
| 评估维度 | Codex | OpenCode | Claude Code |
|---|---|---|---|
| MCP 实现方式 | Rust 原生协议栈 (rmcp-client) | TypeScript SDK (@modelcontextprotocol/sdk) | TypeScript 内置 MCP Manager |
| 依赖管理 | 线程级懒加载与动态暴露 (mcp_tool_exposure.rs) | 全局 Provider 初始化挂载 | 进程启动时绑定挂载 |
| 安全审查 | 动态策略评估 + Guardian 钩子 | 简单拦截/人工确认 | 策略确认与 CLI 交互 |