前言¶
在 DeepSeek Harness(DSH)里接 MCP,常见做法是使用官方桥接 @deepseek-ai/dsh-mcp-client:启动时连接所有已配置的服务端,并把每个工具都注册成原生工具。结果是每一轮对话的请求里都会带上全部工具的 JSON Schema,即使用户或模型从未调用过其中任何一个。README 中给出的实测示例里,仅 xerj 一个服务端(22 个工具)就约 13,325 tokens/turn 的 schema 开销。工具一多、描述一长,上下文会被长期占满。
下面介绍社区插件 dsh-mcp-summon(维护者 adithyanraj03,分类:工作流)。它在加载时只注册一个 mcp_summon 工具,各 MCP 服务端默认休眠、零进程;模型在会话中途按需「召唤」,被激活的服务端会以与官方桥接相同的适配层注册为 真实原生工具(真实 schema、原生 UI、逐工具审批、图片结果可进持久化存储),用完后可 release 收回。
这是什么¶
dsh-mcp-summon 是面向 DSH 的「默认休眠 MCP」插件:平时只占一个召唤入口,需要哪台 MCP 再拉起哪台,并把该台的工具挂进当前会话的工具集;会话结束或崩溃回退时,会回到休眠态(安全方向)。
- 仓库:adithyanraj03/dsh-mcp-summon
- 目录页:skillhub.cn 插件页
- 许可证:MIT(README badge)
- 运行要求:Node ≥ 22,DSH ≥ 0.2.x(package.json
engines)
与官方桥接的差异可以概括为:启动时不连 MCP、不展开全量 schema;激活后行为与官方桥接一致,而不是长期用一个代理工具去「假装」原生工具。
核心功能¶
加载时:一个工具 + 服务端卡片¶
插件在 apply 阶段只注册 mcp_summon。其描述里会为 cordis.patch.yml 里配置的每个服务端生成一张「卡片」:能力摘要(可配 summary)、工具数量、以及按与 README 相同方法估算的每轮 schema 成本({name, description, parameters} 的 JSON 字节 ÷ 4)。卡片按 serverName 排序,会话内固定;测量缓存位于 $DSH_HOME/storages/dsh-mcp-summon/cache.json,不会仅为做卡片而启动服务端。
会话中:summon / status / release¶
模型通过 mcp_summon 自行激活或释放服务端,例如:
mcp_summon({ action: "summon", server: "xerj" })
→ summoned xerj: 22 tools registered as mcp__xerj__* (~13,325 tokens/turn
for the rest of this session, visible from your next turn).
mcp_summon({ action: "status" })
→ Server states:
- xerj: summoned (22 tools, 53297 schema bytes ≈ 13325 tokens/turn, pid 41312)
- summon-fixture: dormant
mcp_summon({ action: "release", server: "xerj" })
→ released xerj: its tools unregister from your next turn and its process
stopped (a daemon it started keeps running — it is shared infrastructure).
要点:
- 召唤后工具名形如
mcp__<serverName>__*,Harness 每轮重新组装工具集,从下一轮起可见。 release会注销工具并关闭 transport(结束子进程);若配置了daemon,守护进程不会被杀掉,供其他会话或工具共用。- 激活一次会改变工具块,该轮 prompt-cache 前缀会失效一次——README 写明这是激活的 documented 代价,与官方桥接在启动时全量注册同理,只是推迟到真正需要时。
配置形态¶
与 @deepseek-ai/dsh-mcp-client 单行服务端配置同形,v1 仅 stdio。在 profile 的 cordis.patch.yml 中通过 config.servers: [...] 列出服务端。主要字段:
| 字段 | 必填 | 说明 |
|---|---|---|
serverName |
是 | [A-Za-z0-9_-]{1,32},对应 mcp__<server>__* 命名空间 |
transport |
是 | v1 为 stdio |
command / args |
command 必填 | 启动程序;密钥勿放 args(argv 对 ps 可见) |
env |
否 | 放密钥;spawn 前会对父环境做 credential scrub |
summary |
否 | 卡片上的能力段落 |
disableTools |
否 | 不暴露的工具名列表 |
toolCallTimeoutMs |
否 | 默认 60000 |
daemon |
否 | 代理型 stdio 服务端可先探活再 detached 启动本地服务 |
daemon 典型场景:stdio 进程只是把调用转发到本机长期服务(如 xerj 指向 http://localhost:9200)。召唤前探测 healthUrl;若无响应则 detached 启动 daemon,轮询健康后再连代理;release 只停代理,不停 daemon。
与 dsh-mcp-lazy 的取舍(README 摘要)¶
同生态里还有 dsh-mcp-lazy:永久保留一个 gateway 代理工具,按需 search/describe/tool,schema 懒加载。README 对比段在截断处未完整给出;已明确的是:summon 激活后是原生工具面,适合希望调用体验与官方桥接一致、又只想为「会用到的服务端」付 schema 成本的场景。
安装与启用¶
1、将插件加入指定 profile(命令来自 README):
dsh plugin --profile <your-profile> add dsh-mcp-summon
2、在该 profile 的 cordis.patch.yml 中配置 config.servers(插件包内附带注释示例)。
3、重启 profile。加载时 不会 spawn MCP 进程,服务端保持 dormant,直到模型调用 mcp_summon。
可选:在插件仓库根目录用脚本估算你配置下的 token 代理值:
node scripts/measure-tokens.mjs --config ~/.dsh/profiles/web/cordis.patch.yml
典型用法小结¶
- 在
cordis.patch.yml写好多个 MCP,但日常对话只保留mcp_summon的固定开销(README 测得:头部加两张卡片约 398 tokens/turn,随配置的服务端个数增长,不随未召唤服务端的工具体积增长)。 - 任务需要某能力时,模型执行
summon,随后直接使用mcp__<server>__*原生工具。 - 任务段落结束或要省上下文时,
release对应服务端;需要时用status查看 summoned / dormant 及 schema 字节与 pid。
README 还提到:对 xerj 用 disableTools 只保留 11 个搜索/hub 工具时,激活成本可从约 13,325 降到约 8,087 tokens/turn(相对全量约 39%),需在真实服务端上测量验证。
适用场景与注意¶
适合:已在 DSH 里配置多台 MCP,但多数会话只会用到其中一部分;希望 schema 成本按「本次会话真正召唤的服务端」计费,且召唤后要与官方桥接一样的原生工具与审批/UI 行为。
注意:
- 插件以当前 DSH 进程的权限运行;
command、env、daemon会启动或连接本机程序。安装前请阅读源码与 MIT 许可证,确认服务端来源可信。 - 密钥只应放在
env,不要写进args。 - 社区目录 skillhub.cn 独立于 DeepSeek / 幻方,并非官方应用商店;DSH 生态理念是「一切皆插件」,选型以仓库文档为准。
结尾¶
dsh-mcp-summon 把 MCP 从「启动即全量注册」改成「默认休眠、一键召唤、用完 release」,在保持官方桥接级原生工具语义的前提下,把 schema 开销推迟到真正需要的服务端。若你在 Harness 里堆了多台 MCP,值得在 profile 里试装并配合 measure-tokens.mjs 看清各台的卡片成本。
- 目录页:https://www.skillhub.cn/plugins/adithyanraj03/dsh-mcp-summon
- GitHub:https://github.com/adithyanraj03/dsh-mcp-summon