dsh-mcp-summon:按需召唤 MCP,注册为原生工具

前言

在 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 再拉起哪台,并把该台的工具挂进当前会话的工具集;会话结束或崩溃回退时,会回到休眠态(安全方向)。

与官方桥接的差异可以概括为:启动时不连 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).

要点:

  1. 召唤后工具名形如 mcp__<serverName>__*,Harness 每轮重新组装工具集,从下一轮起可见。
  2. release 会注销工具并关闭 transport(结束子进程);若配置了 daemon,守护进程不会被杀掉,供其他会话或工具共用。
  3. 激活一次会改变工具块,该轮 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

典型用法小结

  1. 在 cordis.patch.yml 写好多个 MCP,但日常对话只保留 mcp_summon 的固定开销(README 测得:头部加两张卡片约 398 tokens/turn,随配置的服务端个数增长,不随未召唤服务端的工具体积增长)。
  2. 任务需要某能力时,模型执行 summon,随后直接使用 mcp__<server>__* 原生工具。
  3. 任务段落结束或要省上下文时,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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜