前言¶
在 DeepSeek Harness(DSH) 里接多个 MCP 服务时,常见做法是每次请求都把全部工具定义发给模型。工具一多,单步就要带上成百上千条完整 schema,既占 token,也会让模型在大量选项里更难选对工具。若为了省 token 随意删减工具列表,又可能漏掉能力或打乱会话侧的 prompt cache。
下面介绍社区插件 dsh-tool-search(维护者 GunjanPatel359):把 MCP 工具收成短索引,需要时再拉详情并调用,目标是在不破坏 prompt cache 的前提下降低每步 token,并保留权限与审批链路。插件归类为工作流,当前 GitHub 星标为 0;基于 DSH 构建,并非 DeepSeek 官方项目。
这是什么¶
dsh-tool-search 面向 DSH 的 Deferred tool loading:默认仍保留 read、bash 等内置工具,对匹配规则的 MCP 工具不再每步发送完整定义,而是发送按服务分组的索引(工具名、参数名与一行摘要,具体粒度由配置决定)。模型通过 tool_details 读取完整 schema,再通过 call_tool 执行;权限策略、审批与 hooks 仍作用于真实工具与参数。
README 中的对比示意:
without: read, bash, mcp__github__create_issue {full schema}, mcp__github__list_issues {full schema}, ... ×180
with: read, bash, tool_details {index: 180 names + one-liners}, call_tool
核心功能¶
降低每步 token¶
README 称 MCP 工具相关部分单次请求约可节省 88% token(相对「每步全量 schema」的基线)。作者在真实 MCP 环境做了对比(同一小任务、每格三次运行,token 为各模型步累计):
| Model | Without the plugin | With it | Change |
|---|---|---|---|
| DeepSeek deepseek-flash, 25 MCP tools | 80,777 | 58,864 | -27% |
| DeepSeek deepseek-flash, 75 MCP tools | 183,274 | 79,838 | -56% |
| Claude claude-haiku-5-5, 25 MCP tools | 110,598 | 94,422 | -15% |
| OpenAI gpt-5.4-mini, 25 MCP tools | 50,846 | 23,398 | -54% |
同一会话内 5 条消息(DeepSeek,其中两条不需要工具)的累计:
| Servers | Without the plugin | With it | Change |
|---|---|---|---|
| 25 MCP tools | 159,736 | 106,398 | -33% |
| 75 MCP tools | 317,040 | 147,120 | -54% |
工具连接越多,节省越明显;README 注明每次运行在有/无插件下均完成了任务。
保持 prompt cache 可用¶
会话内工具列表形态稳定(索引不变),按需加载某个工具的详情不会迫使提供方以全价重读整段对话。
索引仍覆盖全部工具名¶
索引中始终列出每个工具名称;若模型拼错名或漏写 mcp__server__ 前缀,tool_details 会返回最接近的真实名称,降低「看不见工具」的风险。
不绕过 DSH 安全面¶
权限策略、用户审批与 hooks 仍看到真实工具名与参数,而非绕过 MCP 层。
安装与启用¶
作为 profile 中的 bundle 安装(README 以 tui profile 为例):
dsh plugin --profile tui add dsh-tool-search
dsh --profile tui
若从仓库 checkout 做单次试运行,README 给出:
git clone https://github.com/GunjanPatel359/dsh-tool-search
cd dsh-tool-search
dsh tui --patch ./examples/local.patch.yml
package.json 标明运行环境 Node >= 22,插件版本 0.1.0,许可证 MIT。安装前建议自行查看仓库源码与许可证;插件在当前 DSH 进程权限下运行,与任意 DSH 插件相同。
社区目录页:https://www.skillhub.cn/plugins/GunjanPatel359/dsh-tool-search(独立站点,与 DeepSeek / 幻方无官方从属关系)。
配置说明¶
在 Cordis patch 中增加插件行;patch 会替换整段 config,只改部分字段时须把要保留的键一并写上。README 示例:
- id: dsh-tool-search
name: dsh-tool-search
config:
match: ['mcp__'] # name prefixes to defer
exclude: [] # ...except these prefixes, e.g. ['mcp__mycore__'] for tools used every turn
alwaysLoad: [] # exact names always sent in full
minTools: 10 # defer only when at least this many match
indexStyle: signature # names | summary | signature (name, parameter names, summary)
maxDetails: 10 # most tools one tool_details call returns
summaryChars: 120 # length of each summary in the index
indexChars: 12000 # past this, remaining tools are listed by name only
detailsToolName: tool_details
callToolName: call_tool
要点:
match/exclude/alwaysLoad:默认延迟mcp__前缀工具;几乎每轮都要用的工具可用exclude或alwaysLoad保持全量定义。minTools:匹配工具数低于该阈值时不启用延迟(少量定义比多一步tool_details更省)。indexStyle:控制索引里展示名称、摘要还是「签名」(名 + 参数名 + 摘要)。maxDetails、summaryChars、indexChars:控制单次详情条数、摘要长度与索引总长度上限(超出部分仅列名)。
典型工作方式¶
在 Native tool calls 模式下,智能体侧可见的工具面大致为:
- 常驻:
read、bash等未进入延迟规则的工具。 - 索引:
tool_details携带的 MCP 工具短列表(按 MCP 服务分组)。 - 首次使用某个延迟工具前,模型先调
tool_details取完整 schema(可能一步返回多个,受maxDetails限制)。 - 执行时走
call_tool,内部映射到真实 MCP 工具;参数校验错误由目标工具返回,而非由模型提供方在 schema 层拦截。
每轮几乎必用的 MCP 工具应通过 exclude 或 alwaysLoad 排除在索引之外,避免多一次详情查询。
权衡与兼容性¶
权衡(README Trade-offs)¶
- 对话中首次使用某个延迟工具时,可能多一步
tool_details。 - 参数错误表现为工具自身报错,而非提供方在调用前的 schema 校验失败。
- 部分 UI 会把外层步骤显示为
call_tool,真实工具名在内部。
兼容模式¶
- Native tool calls:插件主要为此设计。
- PTC 模式(
run_code):插件自动退让,不向这类 agent 的请求追加内容(代码里已列出全部工具)。 - 子 agent 与 structured-output 子任务:各 agent 使用自己的工具索引;子任务的
structured_output仍为普通全量工具。
文档写明面向 DSH 0.2.x;DSH 尚未 1.0,插件接口可能在版本间变化。
适合谁用¶
适合在 DSH 中挂载较多 MCP 服务、且主要走 native tool call 的工作流。工具数少(低于 minTools)时插件不会改写行为。若你依赖 PTC/run_code 为主,插件对请求无额外影响。
DSH 生态强调「一切皆插件」;dsh-tool-search 是社区贡献的工作流类插件之一。更多说明与 issue 见 GitHub:https://github.com/GunjanPatel359/dsh-tool-search。