MCP(模型上下文协议)集成
MCP(模型上下文协议)集成
相关源文件
本章引用的主要源码文件:
src/agent.rssrc/bin/harness.rssrc/main.rssrc/mcp/client.rssrc/mcp/manager.rssrc/mcp/mod.rssrc/mcp/protocol.rssrc/mcp/tool.rssrc/protocol.rssrc/server.rssrc/session.rssrc/skill.rssrc/tool/conversation_search.rssrc/tool/mcp.rssrc/tool/mod.rssrc/tool/skill.rssrc/tool/tests.rs
jcode 中的模型上下文协议(MCP)集成允许代理通过连接到提供工具、资源和提示的外部服务器来动态扩展其能力。该架构专为高性能和资源效率而设计,支持独立的 TUI 使用以及具有进程复用的多会话守护进程模式。
MCP 架构总览
MCP 子系统分为多个层级:底层 JSON-RPC 协议处理、客户端-服务器进程管理器、共享进程池以及与 jcode 代理运行时集成的工具包装器。
组件层次结构
| 组件 | 角色 | 作用域 |
|---|---|---|
McpClient | 拥有 Child 进程并管理 stdio 管道。 | 每个操作系统进程一个 src/mcp/client.rs:120-123 |
McpHandle | 一个可克隆的句柄,用于向 McpClient 发送请求。 | 每个 McpClient 多个 src/mcp/client.rs:17-26 |
SharedMcpPool | 管理一组 McpClient 实例以供复用。 | 全局(守护进程) src/mcp/pool.rs:12-25 |
McpManager | 编排特定会话的服务器连接。 | 每个会话一个 src/mcp/manager.rs:32-40 |
McpTool | 实现 Tool 特征以代理调用到 MCP 服务器。 | 每个 MCP 工具一个 src/mcp/tool.rs:13-17 |
来源: src/mcp/mod.rs:1-18, src/mcp/client.rs:120-123, src/mcp/manager.rs:32-40。
数据流:工具执行
当代理调用 MCP 工具时,请求会通过 McpManager 流向会话拥有的客户端或共享池句柄。
MCP 请求流程示意图
来源: src/mcp/tool.rs:48-57, src/mcp/client.rs:30-56, src/mcp/client.rs:179-188, src/mcp/manager.rs:200-210, src/agent.rs:139-180。
SharedMcpPool 与进程复用
为最小化开销,jcode 实现了 SharedMcpPool。配置中定义的服务器可以标记为 shared: true(默认值)src/mcp/protocol.rs:171-186。
- 无状态服务器: 像搜索引擎或 API 包装器这样的工具通过
SharedMcpPool在所有活跃会话间共享src/mcp/manager.rs:98-121。 - 有状态服务器: 维护本地状态的工具(例如,Playwright 浏览器实例)应设置
shared: false,以确保为每个会话唯一地生成src/mcp/manager.rs:3-5。
McpManager 透明地处理此逻辑:
- 如果
shared为 true 且池存在,则调用pool.acquire_handles()src/mcp/manager.rs:106-114。 - 如果
shared为 false,则为该会话生成一个owned_clientsrc/mcp/manager.rs:124-135。
来源: src/mcp/pool.rs:12-25, src/mcp/manager.rs:87-121, src/mcp/protocol.rs:171-182。
协议实现
jcode 通过 stdio 使用 JSON-RPC 2.0 实现 MCP 规范 src/mcp/protocol.rs:1-16。
关键协议实体
| 代码实体 | 用途 |
|---|---|
JsonRpcRequest | 用于 tools/list 或 tools/call 等方法的标准化包装器 src/mcp/protocol.rs:8-14。 |
InitializeParams | 在握手期间发送以协商协议版本 src/mcp/protocol.rs:48-55。 |
McpToolDef | 服务器返回的工具模式(名称、描述、JSON 模式) src/mcp/protocol.rs:114-121。 |
ContentBlock | 枚举,处理来自工具的 Text、Image 或 Resource 输出 src/mcp/protocol.rs:146-158。 |
来源: src/mcp/protocol.rs:1-160, src/mcp/client.rs:204-215。
动态工具注册
MCP 工具不是硬编码的。当会话启动或连接 MCP 服务器时,jcode 会执行以下操作:
- 发现: 在 MCP 服务器上调用
tools/listsrc/mcp/client.rs:102-114。 - 映射: 将每个
McpToolDef包装在McpTool实例中src/mcp/tool.rs:103-106。 - 命名空间: 工具在
Registry中以带前缀的名称注册:mcp__{server_name}__{tool_name},以避免与内置工具冲突src/mcp/tool.rs:104-106。
工具空间映射示意图
来源: src/mcp/tool.rs:34-37, src/mcp/tool.rs:97-109, src/tool/mod.rs:54-58。
配置与管理
配置文件
jcode 兼容标准的 Claude Code MCP 配置格式。如果 ~/.jcode/mcp.json 不存在,它会在首次运行时尝试从 ~/.claude/mcp.json 或 ~/.codex/config.toml 导入配置 src/mcp/protocol.rs:218-245。
mcp 管理工具
内置的 mcp 工具(McpManagementTool)允许代理(或用户)在运行时管理连接 src/tool/mcp.rs:26-29。
list:显示已连接的服务器及其工具src/tool/mcp.rs:112-150。connect:通过命令/参数动态添加新服务器src/tool/mcp.rs:152-191。reload:从配置文件刷新服务器src/tool/mcp.rs:242-255。
来源: src/tool/mcp.rs:46-86, src/mcp/protocol.rs:189-210。
TUI 集成与状态事件
McpManager 会发出状态更新,这些更新会显示在 TUI 中。连接服务器时,它会返回成功和失败的摘要 src/mcp/manager.rs:87-160。MCP 进程的标准错误输出会被捕获并路由到 jcode 日志系统,并带有特定于服务器的前缀,以帮助调试 src/mcp/client.rs:149-170。
来源: src/mcp/client.rs:151-166, src/mcp/manager.rs:137-156。