前言¶
在 DeepSeek Harness(DSH) 里接多个 MCP 服务器时,常见做法是每一轮模型请求都把全部工具定义原样塞进上下文。工具一多,单步就要带上成百上千条完整 schema,token 开销大,模型在冗长列表里选工具也容易变差。下面介绍社区插件 dsh-tool-index:把 MCP 工具收成紧凑索引,按需再拉完整 schema,同时保持会话内工具列表不变,便于 prompt cache 继续生效。
这是什么¶
dsh-tool-index 是面向 DSH 的插件(基于 DeepSeek Harness 构建,并非 DeepSeek 官方项目),维护者为 GunjanPatel359,在插件目录中归类为「模型推理」。它解决的核心问题是:重复发送完整 MCP 工具定义带来的 token 成本,以及工具列表若在中途变化导致 prompt cache 失效。
未启用时,上下文里往往是 read、bash 以及大量 mcp__*__* 的完整 schema;启用后,对外暴露的稳定工具集里增加 tool_details 与 call_tool,MCP 侧则以索引形式列出名称、参数名与一行摘要(按服务器分组),需要时再查详情并调用。
核心功能¶
按需加载,列表固定¶
- 每轮请求只发送短索引:每个 deferred 工具包含 name、parameters 与 one-line summary(具体展示风格由
indexStyle控制)。 - 模型需要某工具时,先通过
tool_details读取完整定义,再用call_tool执行;权限策略、审批与 hooks 仍针对真实工具名与参数,不绕过 DSH 既有机制。 - 会话内对外可见的工具集合保持不变,加载某个 MCP 工具不会整段重写工具列表,从而 prompt cache 可继续使用。
名称仍全覆盖,错名可纠¶
索引里始终列出全部 deferred 工具名称;若模型拼错名或缺少 mcp__server__ 前缀,tool_details 会返回最接近的真实名称(详见仓库内 docs/name-matching.md)。
实测 token 变化(README 基准)¶
README 给出「同一小任务、每格三次运行」及「单会话 5 轮对话(其中两轮不需工具)」的汇总 token(各模型每步相加)。摘录如下:
| 场景 | 无插件 | 有插件 | 变化 |
|---|---|---|---|
| DeepSeek deepseek-flash,25 个 MCP 工具 | 80,777 | 58,864 | -27% |
| DeepSeek deepseek-flash,75 个 MCP 工具 | 183,274 | 79,838 | -56% |
| Claude claude-haiku-5-5,25 个 MCP 工具 | 110,598 | 94,422 | -15% |
| OpenAI gpt-5.4-mini,25 个 MCP 工具 | 50,846 | 23,398 | -54% |
75 个 MCP 工具、单小任务场景下,README 开头亦给出 183,274 → 79,838(约 56% 减少) 的对比。可自行用仓库内 e2e/run.sh 复现。
兼容与模式¶
- Native tool calls:插件主要面向该模式。
- PTC 模式(
run_code):插件不改动这类 agent 的请求;DSH 已在代码侧列出全部工具。 - 子 agent 与 structured-output 子任务:各 agent 使用各自工具索引;子任务的
structured_output仍为普通工具。
文档写明面向 DSH 0.2.x;DSH 尚未 1.0,插件接口可能随版本变化。运行环境要求 Node.js >= 22(见 package.json)。
安装与启用¶
作为 profile bundle 安装并启动 TUI:
dsh plugin --profile tui add dsh-tool-index
dsh --profile tui
插件以当前 DSH 进程权限运行;安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认符合你的安全与合规要求。
配置要点¶
在 DSH 插件配置中启用 dsh-tool-index 时,README 给出如下字段(patch 会替换整段 config,修改时需写全你要保留的键):
- id: dsh-tool-index
name: dsh-tool-index
config:
match: ['mcp__'] # 要延迟完整 schema 的工具名前缀
exclude: [] # 例外前缀,例如每轮都用的 ['mcp__mycore__']
alwaysLoad: [] # 始终发送完整 schema 的精确工具名
minTools: 10 # 匹配数量达到此值才启用延迟
indexStyle: signature # names | summary | signature
maxDetails: 10 # 单次 tool_details 最多返回的工具数
summaryChars: 120 # 索引中每条摘要长度
indexChars: 12000 # 超出后剩余工具仅列名称
detailsToolName: tool_details
callToolName: call_tool
使用注意:
- 匹配工具数 少于
minTools时不做延迟,避免为少量工具多一步tool_details。 - 几乎每轮都用的 MCP 工具应通过
exclude或alwaysLoad排除出索引,否则多一次查详情步骤。 match按前缀匹配;不要把 harness 核心工具(如read、bash)纳入延迟——它们几乎每轮都需要,延迟只会变差且无内置拦截。
典型用法与代价¶
典型调用链:
- 模型在索引中看到目标 MCP 工具名与摘要。
- 首次使用前调用
tool_details获取完整 schema。 - 通过
call_tool传入真实工具名与参数执行。
权衡(README Trade-offs):
- 某个 deferred 工具在对话中 首次使用前可能多一步
tool_details。 - 参数校验由 工具自身 返回错误,而非 provider 在 schema 层拦截。
- 部分 UI 外层步骤显示为
call_tool,内层才是真实 MCP 工具。
适用场景¶
适合在 DSH 中 长期挂载较多 MCP 服务器、且主要走 native tool call 的智能体开发场景;工具越多,每轮省略的完整定义越多。若 MCP 很少、或 agent 处于 PTC / run_code 主导模式,收益可能有限或插件自动让路。
DSH 生态强调「一切皆插件」;SkillHub 插件目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-tool-index 把 MCP 工具定义从「每轮全量 schema」改为「稳定工具表 + 紧凑索引 + 按需详情」,在 README 基准下可明显降低多 MCP 场景的 token,并尽量保持 prompt cache 有效。实现细节见仓库 docs/how-it-works.md。
- 目录页:https://www.skillhub.cn/plugins/GunjanPatel359/dsh-tool-index
- 源码与文档:https://github.com/GunjanPatel359/dsh-tool-index