ARCHITECTURE · 09

MCP 桥接:DeepSeek Harness 如何接入外部工具服务器

直接答案

MCP(Model Context Protocol,模型上下文协议)是连接外部工具服务器的开放协议。官方插件 @deepseek-ai/dsh-mcp-client 做桥接:每个服务器是一个插件实例,工具以 mcp__服务器名__工具名 限定名进入工具注册表,模型把它当原生工具用。
示意图
01左侧两个外部 MCP 服务器块(stdio 本机进程 / streamable-http 远程);中间 dsh-mcp-client 插件块标注"listTools → 注册";右侧 ctx.tools 注册表,工具以 mcp__server__tool 限定名出现;最右模型只看到 schema。底部返回链路标注"调用时只发 rawName,不发公开限定名"。

配置方式与两种传输

官方事实

cordis.yml 里,每个 MCP 服务器对应一个插件实例(插件实例即扩展点,见插件系统页)。支持两种传输(transport,连接方式):

  • stdio:在本机启动一个进程(配置 command / args / env / cwd);
  • streamable-http:连远程 HTTP 服务(配置 url / headers)。

envheaders 支持 !!js 表达式引用环境变量——Token(访问令牌)不用明文写进配置文件。实际操作中通常通过 profile 的 cordis.patch.yml 或命令行 --patch 加入 MCP 配置(本站教程口径,见《MCP 接入》教程;配置方式出处见配置分层页)。

服务器名(serverName)只允许字母数字、下划线和连字符,最长 32 字符,且在存活实例中必须唯一——重名会让后加载的实例直接失败。

工具命名:限定名与确定性哈希

官方事实

模型看到的工具名是服务器限定名:mcp__<serverName>__<rawName>(与 Claude Code、Codex 的命名形状相同)。公开名会被规范化以符合函数名约定(64 字符、字母数字下划线连字符);如果替换或截断改变了名字,会追加一段由 (serverName, rawName) 算出的确定性 12 位十六进制哈希。

关键性质:名称是 (serverName, rawName) 的纯函数——连接顺序、重新同步都不会让工具改名。这对 KV cache(模型推理缓存)友好:工具集合不变时,请求前缀稳定。

生命周期与重同步:整代替换,不留半套

官方事实
  • 插件激活时先等 listTools()(列出工具)完成,在组合首个轮次前完成注册;
  • 监听服务器的 notifications/tools/list_changed(工具列表变更通知)并重新同步;
  • 成功的重同步是整代替换——新工具集整体换掉旧的,不累积;
  • 如果注册时发生冲突,回滚整个世代(generation),绝不保留半套工具。

断线怎么办:热替换与重连预算

官方事实
  • 改配置触发 HMR(热替换):编辑配置会断开重连,不用重启进程;只要 serverName 没变,工具名完全相同。
  • 自动重连:指数退避(重试间隔逐次翻倍),默认首次延迟 500 毫秒、上限 30 秒、最多 10 次;连接一旦存活超过 30 秒,重试预算重置。
  • 预算耗尽:工具被注销,停止重连,直到 HMR 重载或进程重启。
  • 手动恢复模式reconnect.enabled: false 时,工具保持注册但调用会失败——适合你想自己控制重连时机的场景。
示意图
02上半部:世代 1 工具集整体被世代 2 替换(旧集合虚线消失,标注"不累积、冲突回滚");下半部:重试时间轴,间隔从 0.5s 逐次翻倍到 30s 封顶,第 10 次后标注"预算耗尽:工具注销,等 HMR 或重启"。

调用与结果处理

官方事实
  • 调用时发的是 client.callTool({ name: rawName, ... })——公开限定名绝不发给服务器,服务器只认它自己的原始名;
  • 默认每次调用超时 60 秒(toolCallTimeoutMs),支持 abort(中止信号);
  • 规范成功结果是 { content: JsonValue[], structuredContent? };声明了且受支持的 outputSchema(输出结构)会校验 structuredContent,不受支持的词汇回退为无约束 JSON;
  • 图片(PNG / JPEG / WebP / GIF)是唯一被持久化的富媒体结果——需要挂载 ctx.attachments,且确切的模型路由声明支持图片输入;音频和嵌入资源会变成诊断文本。

已知边界与风险面

官方事实教程实测

官方 README 明列的已知限制:

  • 只桥接工具能力:MCP 协议里的 resources(资源)和 prompts(提示词)没有 harness 消费接口,暂缓实现——看到"MCP 支持资源/提示词"的说法,对当前版本不成立;
  • 启动超时继承 MCP SDK 默认 60 秒;
  • HTTP 传输失败按每次调用重试,不会由 supervisor(监管进程)重新拉起;
  • 不强制执行不受支持的 MCP 输出 schema。

风险面(本站教程已验证):stdio 传输会在你本机启动程序;引入第三方服务器等于引入第三方代码;你要保管好 Token;这些工具可以做真实写入。装 MCP 服务器前,按"装软件"的标准审视它。

EVIDENCE

证据与来源

本页包含:官方事实 / 教程实测

#事实声明状态来源
1mcp-client 是官方桥接插件、限定名 mcp__<server>__<rawName>、注册进 ctx.tools官方事实
2每服务器一个插件实例、stdio / streamable-http 两种传输、env / headers 支持 !!js官方事实
3经 profile 的 cordis.patch.yml 或 --patch 加入配置教程实测本站已验证内容
  • 本站教程内容 src/content/tutorials/mcp.ts:326
4serverName 约束(字符集、32 字符、唯一性、重名失败)官方事实
5名称规范化、12 位十六进制哈希、名称为纯函数官方事实
6生命周期:listTools 等待、list_changed 重同步、整代替换、冲突回滚整个世代官方事实
7HMR 断开重连不重启进程、serverName 不变则工具名不变官方事实
8重连参数(500ms 起步、30s 上限、10 次)、预算重置与耗尽行为、reconnect.enabled:false 手动模式官方事实
9调用发 rawName 不发公开名、60 秒超时、abort 支持官方事实
10结果结构、outputSchema 校验回退、图片为唯一持久富媒体(PNG / JPEG / WebP / GIF)官方事实
11已知限制四条(只桥接工具、启动超时、HTTP 重试方式、不强制校验不支持词汇)官方事实
12MCP 工具走与原生工具相同的流水线官方事实
13风险面(本机起进程、第三方代码、Token、真实写入)教程实测本站已验证内容
  • 本站教程内容 src/content/tutorials/plugin-skills-mcp.ts:315
适用版本
DSH 0.1.1-rc.2(2026 年 8 月,开发者预览阶段)
发布
2026-08-26
更新
2026-08-26
最后核验
2026-08-26