agentic_huge_data_base / wiki
页面 jcode · 10 MCP(模型上下文协议)集成·DeepWiki 中文全文译文

10 · MCP(模型上下文协议)集成(MCP (Model Context Protocol) Integration)

代理式研究运行时 · 聚焦本章的模块关系、源码依据与实现要点。

项目jcode 章节10 状态全文译文 模块界面与交互、接口与服务契约、系统架构、智能体运行时
源码线索
  • src/agent.rs
  • src/bin/harness.rs
  • src/main.rs
  • src/mcp/client.rs
  • src/mcp/manager.rs
  • src/mcp/mod.rs
  • src/mcp/protocol.rs
  • src/mcp/tool.rs
  • src/protocol.rs
  • src/server.rs
模块标签
  • 界面与交互
  • 接口与服务契约
  • 系统架构
  • 智能体运行时
  • 记忆与上下文

章节正文

MCP(模型上下文协议)集成

MCP(模型上下文协议)集成

相关源文件

本章引用的主要源码文件:

  • src/agent.rs
  • src/bin/harness.rs
  • src/main.rs
  • src/mcp/client.rs
  • src/mcp/manager.rs
  • src/mcp/mod.rs
  • src/mcp/protocol.rs
  • src/mcp/tool.rs
  • src/protocol.rs
  • src/server.rs
  • src/session.rs
  • src/skill.rs
  • src/tool/conversation_search.rs
  • src/tool/mcp.rs
  • src/tool/mod.rs
  • src/tool/skill.rs
  • src/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 请求流程示意图
jcode · MCP 请求流程示意图 · 图 1
jcode · MCP 请求流程示意图 · 图 1

来源: 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_client src/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/listtools/call 等方法的标准化包装器 src/mcp/protocol.rs:8-14
InitializeParams在握手期间发送以协商协议版本 src/mcp/protocol.rs:48-55
McpToolDef服务器返回的工具模式(名称、描述、JSON 模式) src/mcp/protocol.rs:114-121
ContentBlock枚举,处理来自工具的 TextImageResource 输出 src/mcp/protocol.rs:146-158

来源: src/mcp/protocol.rs:1-160, src/mcp/client.rs:204-215

动态工具注册

MCP 工具不是硬编码的。当会话启动或连接 MCP 服务器时,jcode 会执行以下操作:

  1. 发现: 在 MCP 服务器上调用 tools/list src/mcp/client.rs:102-114
  2. 映射: 将每个 McpToolDef 包装在 McpTool 实例中 src/mcp/tool.rs:103-106
  3. 命名空间: 工具在 Registry 中以带前缀的名称注册:mcp__{server_name}__{tool_name},以避免与内置工具冲突 src/mcp/tool.rs:104-106
工具空间映射示意图
jcode · 工具空间映射示意图 · 图 2
jcode · 工具空间映射示意图 · 图 2

来源: 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