ARCHITECTURE · 09
MCP 桥接:DeepSeek Harness 如何接入外部工具服务器
直接答案
MCP(Model Context Protocol,模型上下文协议)是连接外部工具服务器的开放协议。官方插件@deepseek-ai/dsh-mcp-client 做桥接:每个服务器是一个插件实例,工具以 mcp__服务器名__工具名 限定名进入工具注册表,模型把它当原生工具用。示意图
配置方式与两种传输
在 cordis.yml 里,每个 MCP 服务器对应一个插件实例(插件实例即扩展点,见插件系统页)。支持两种传输(transport,连接方式):
- stdio:在本机启动一个进程(配置
command/args/env/cwd); - streamable-http:连远程 HTTP 服务(配置
url/headers)。
env 和 headers 支持 !!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时,工具保持注册但调用会失败——适合你想自己控制重连时机的场景。
示意图
调用与结果处理
- 调用时发的是
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
证据与来源
本页包含:官方事实 / 教程实测
| # | 事实声明 | 状态 | 来源 |
|---|---|---|---|
| 1 | mcp-client 是官方桥接插件、限定名 mcp__<server>__<rawName>、注册进 ctx.tools | 官方事实 | |
| 2 | 每服务器一个插件实例、stdio / streamable-http 两种传输、env / headers 支持 !!js | 官方事实 | |
| 3 | 经 profile 的 cordis.patch.yml 或 --patch 加入配置 | 教程实测本站已验证内容 |
|
| 4 | serverName 约束(字符集、32 字符、唯一性、重名失败) | 官方事实 | |
| 5 | 名称规范化、12 位十六进制哈希、名称为纯函数 | 官方事实 | |
| 6 | 生命周期:listTools 等待、list_changed 重同步、整代替换、冲突回滚整个世代 | 官方事实 | |
| 7 | HMR 断开重连不重启进程、serverName 不变则工具名不变 | 官方事实 | |
| 8 | 重连参数(500ms 起步、30s 上限、10 次)、预算重置与耗尽行为、reconnect.enabled:false 手动模式 | 官方事实 | |
| 9 | 调用发 rawName 不发公开名、60 秒超时、abort 支持 | 官方事实 | |
| 10 | 结果结构、outputSchema 校验回退、图片为唯一持久富媒体(PNG / JPEG / WebP / GIF) | 官方事实 | |
| 11 | 已知限制四条(只桥接工具、启动超时、HTTP 重试方式、不强制校验不支持词汇) | 官方事实 | |
| 12 | MCP 工具走与原生工具相同的流水线 | 官方事实 | |
| 13 | 风险面(本机起进程、第三方代码、Token、真实写入) | 教程实测本站已验证内容 |
|