dsh-tool-index:用工具索引压缩 MCP 定义,降低 DSH 每轮 token

前言

在 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

使用注意:

  1. 匹配工具数 少于 minTools 时不做延迟,避免为少量工具多一步 tool_details。
  2. 几乎每轮都用的 MCP 工具应通过 exclude 或 alwaysLoad 排除出索引,否则多一次查详情步骤。
  3. match 按前缀匹配;不要把 harness 核心工具(如 read、bash)纳入延迟——它们几乎每轮都需要,延迟只会变差且无内置拦截。

典型用法与代价

典型调用链:

  1. 模型在索引中看到目标 MCP 工具名与摘要。
  2. 首次使用前调用 tool_details 获取完整 schema。
  3. 通过 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
羽毛球分组比赛记分
小程序二维码

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

小夜