Appearance
MCP 协议 — 练习
练习 1:配置 MCP 服务器
在 config.toml 中配置一个 MCP 服务器,观察工具注册和调用过程。
参考答案
MCP 服务器在 config.toml 的 [mcp_servers] 段配置,支持三种传输方式:
Stdio 传输(最常用):
toml[mcp_servers.my-tools] command = "python" args = ["-m", "my_mcp_server"] env = { API_KEY = "..." }Codex 启动子进程,通过 stdin/stdout 进行 JSON-RPC 通信。
HTTP 传输:
toml[mcp_servers.remote-api] url = "https://api.example.com/mcp" headers = { Authorization = "Bearer ..." }通过 HTTP POST 发送请求,SSE 接收响应。
InProcess 传输: 内置工具直接在进程内调用,无需启动子进程或网络请求。
工具注册过程:
McpConnectionManager::new_uninitialized()创建管理器- 配置加载时,为每个
[mcp_servers]条目创建AsyncManagedClient - 客户端连接后,调用 MCP
tools/list方法获取工具列表 tool_is_model_visible()过滤工具,只向模型暴露可见的工具- 工具通过
tool_plugin_provenance记录来源
验证方式:启动 TUI 后,模型在需要时会自动发现和使用已注册的 MCP 工具。
练习 2:追踪 MCP 工具调用
从一个触发 MCP 工具调用的指令出发,追踪完整的调用链。
参考答案
以用户指令"查询数据库中的用户列表"为例(假设配置了数据库 MCP 服务器):
用户输入:
CodexThread::submit(Op::UserInput("查询数据库中的用户列表"))上下文构建:
Session::build_initial_context()组装:- System prompt + 内置工具(shell、apply_patch)
- MCP 工具声明(
query_database、list_tables等) - 工具通过
tool_is_model_visible()过滤
模型调用:
ModelClientSession::stream()发送到 LLM,LLM 返回工具调用:json{"function": "query_database", "arguments": {"sql": "SELECT * FROM users"}}工具路由:
Session识别query_database是 MCP 工具(非内置工具),路由到McpConnectionManagerMCP 调用:
McpConnectionManager根据tool_plugin_provenance找到工具所在的服务器- 通过对应的传输层(Stdio/HTTP/InProcess)发送
tools/call请求 - MCP 服务器执行查询并返回结果
结果回传:
- 结果追加到对话上下文
- 模型收到工具结果后生成最终回复
Event::TurnItemUpdated通知消费者
Elicitation(如需要):如果 MCP 服务器需要用户提供额外信息,通过
ElicitationRequestManager发起请求。在 TUI 模式下显示表单,Exec 模式下自动拒绝。
练习 3:分析 MCP 通信协议
分析 Codex 与 MCP 服务器之间的消息格式和通信协议。
参考答案
Codex 与 MCP 服务器使用 JSON-RPC 2.0 协议通信(由 rmcp-client 实现),核心消息类型:
请求消息(Codex → MCP 服务器):
initialize:初始化连接,交换能力声明tools/list:获取服务器支持的工具列表tools/call:调用指定工具,传递参数resources/list:获取可用的资源列表resources/read:读取指定资源
通知消息:
notifications/cancelled:取消正在执行的请求notifications/elicitation:请求用户输入
三种传输层的协议映射:
| 传输层 | 消息载体 | 连接管理 |
|---|---|---|
| InProcess | 直接函数调用 | 无需连接 |
| Stdio | stdin/stdout JSON Lines | 子进程生命周期 |
| StreamableHttp | HTTP POST (请求) + SSE (响应) | HTTP 连接池 |
rmcp-client(codex-rs/rmcp-client/src/rmcp_client.rs)是底层的 MCP 客户端实现,处理:
- JSON-RPC 消息的序列化/反序列化
- 请求 ID 的生成和响应匹配
- 超时和重试逻辑
- 连接的建立和关闭
拓展挑战
- 阅读
rmcp-client的完整实现,理解 JSON-RPC 消息处理 - 分析
tool_is_model_visible()的过滤逻辑和可见性元数据 - 研究 MCP
elicitation在 TUI 模式下的表单渲染实现 - 分析
McpServerMetadata的字段和用途