dsh-mcp-lazy:DSH 的 MCP 懒加载插件,按需披露工具 Schema 减少 Token 浪费

前言

DSH 的理念是「一切皆插件」,开发者往往会在上面装文件、浏览器、数据库等多个 MCP。这时会有一个具体的代价:即使当前问题只需要文件工具,所有 MCP 的工具名称、说明和参数也可能一起进入模型上下文。MCP 装得越多,每轮被占用的 Token 就越多。

下面介绍 leaforbook/dsh-mcp-lazy,一个把暂时用不到的工具说明先藏起来、任务需要时再加载的 DSH 插件。

这是什么

dsh-mcp-lazy(npm 包名 @yilinxiao/dsh-mcp-lazy)是 DeepSeek Harness(DSH)的 MCP 懒加载、动态加载工具与 Tool Router 插件,由 leaforbook 维护,当前版本 0.5.1,许可证 MIT,要求 Node >= 20。

一句话定位:按需披露兼容 MCP 的工具 Schema,减少上下文膨胀和 Token 浪费;不兼容时保持直通,显式懒加载连接继续保温。

核心功能

Schema 按需披露

插件接管兼容的 MCP 后,冷态只向模型显示一个共享路由工具 mcp__router__search_and_activate。任务需要某个 MCP 时,路由工具找到它,此时才显示该 MCP 对应的工具。

会话级隐藏

每个会话有独立的隐藏列表。当前轮结束后,已加载的工具再次隐藏;其他会话不会继承本会话已经加载的工具。

自动接管与 fail-open

插件只接管名称清楚、无冲突、能安全隐藏和重新显示的 MCP。遇到命名异常、工具重名、目录不完整或 DSH 能力不足等情况,会主动放弃接管,工具照常可见。这种处理方式叫 fail-open:宁可少省 Token,也不影响工具可用。

连接层懒加载与连接保温

显式配置的 server 支持 stdiostreamable-http 两种 transport,用到时才建立 MCP 连接。当前轮结束后,插件先隐藏工具说明,连接按 warmIdleMs 保留(默认 5 分钟),短时间内再次使用可直接复用。

目录分页与有限重连

工具目录读取支持分页(maxToolListPages),意外断开后有有限次数的自动重连(reconnectAttempts)。

安装与启用

dsh plugin --profile web add @yilinxiao/dsh-mcp-lazy

安装后重启 DSH。插件会自动发现已安装的兼容 MCP,不需要逐个填写 MCP 地址、请求头或密钥。

安装包会自动写入 manager 配置:

- insert:
    - id: mcp-lazy-manager
      name: '@yilinxiao/dsh-mcp-lazy'
      config:
        mode: manager

通常不需要手动修改这段配置。

已测试的 DSH 版本为 0.1.0-rc.6、0.1.0-rc.7 和 0.1.0-rc.8。插件按 DSH 是否提供所需能力决定能否启用,而不是只看版本号。

典型用法

安装后正常向模型提问即可,例如:

帮我找出项目里所有超过 10 MB 的 PDF 文件。

模型会先通过共享路由找到文件 MCP,再调用它的原生工具。插件只决定「什么时候让模型看到哪些工具」,真正的调用仍由原 MCP 完成。

按下面步骤验证是否生效:

1、安装并重启 DSH,新建一个会话。
2、查看冷态工具列表:被接管的 MCP 工具应已隐藏,只留下 mcp__router__search_and_activate,普通 DSH 工具仍然可见。
3、提出一个需要某个 MCP 的任务。路由完成后,模型应只看到该 MCP 的工具,并能正常调用。
4、再新建一个会话,前一个会话加载过的 MCP 工具不应出现。

经过上面的步骤,如果某个 MCP 一直可见,通常说明它没有通过兼容性检查,被保留为原来的工作方式,这不代表插件失效。

显式配置连接层懒加载

自动接管只减少模型侧的工具说明,不会关闭第三方 MCP 进程。如果希望某个 MCP 平时不连接、用到时才启动,可以在配置目录的 cordis.patch.yml 中把它显式配置为插件的 server:

- insert:
    - id: mcp-lazy
      name: '@yilinxiao/dsh-mcp-lazy'
      config:
        transport: stdio
        serverName: filesystem
        command: npx
        args: [-y, '@modelcontextprotocol/server-filesystem', '/tmp']
        connectTimeoutMs: 30000
        discoveryTimeoutMs: 60000
        maxToolListPages: 100
        reconnectAttempts: 1
        autoActivate: false
        releaseOnTurnEnd: true
        warmIdleMs: 300000
        routingHints: [文件, 目录]

    - id: mcp-lazy
      name: '@yilinxiao/dsh-mcp-lazy'
      config:
        transport: streamable-http
        serverName: remote-api
        url: http://127.0.0.1:8000/mcp
        headers: {}
        warmIdleMs: 300000
        routingHints: [远程接口, API]

stdio 模式用 commandargs 等字段描述启动命令;streamable-http 模式用 urlheaders 指向服务地址。几个关键字段:

  • warmIdleMs:工具隐藏后连接保留多久,默认 5 分钟,设为 0 会立即断开。
  • autoActivate:默认 false,开启后 DSH 启动时立即连接,不再按需连接。
  • releaseOnTurnEnd:默认 true,当前轮结束后隐藏已加载的工具说明。
  • routingHints:帮助路由器识别该 MCP 的关键词,如业务名、能力或常用叫法。
  • maxToolListPagesreconnectAttempts:目录分页上限与自动重连次数。

关闭自动接管

想让所有 MCP 恢复原来的显示方式,只需禁用 manager 条目。在 $DSH_HOME/profiles/web/cordis.patch.yml 中加入:

- id: mcp-lazy-manager
  disabled: true

请保留这段覆盖配置,删掉后安装包会再次启用 manager。它只关闭自动接管,显式的 lazy server 配置不受影响;不需要卸载 npm 包,也不用修改其他 MCP 的地址、请求头或密钥。

适用场景与注意

适合两类场景:

1、装了较多 MCP,希望减少每轮进入模型上下文的工具说明。
2、希望某些 MCP 平时不连接、用到时才启动,并保留短时保温。

使用前需要注意:

  • 插件以当前 dsh 进程的权限运行,安装前应检查源码与许可证(MIT)。
  • 自动接管只减少模型侧的工具说明,不负责停止、重启或代理第三方 MCP 进程。
  • 不支持 tool.execution.taskSupport === 'required' 的任务型工具,调用时直接返回错误。
  • 自动重连次数有限,超过后需重新调用 activate
  • 保温连接只存在于当前 DSH 进程,不写入磁盘,重启后需重新读取工具目录。
  • Token 数据是对工具说明的近似测量(使用 cl100k_base),不能直接换算为账单金额;核算实际收益,请比较同类请求的 prompt_tokens 和缓存命中。
  • 普通 DSH 工具不会被隐藏;不满足条件时插件主动 fail-open,保持原样。
  • 对第三方 MCP,插件只显示原 MCP 注册的工具定义,不替换执行器,权限、审计、重试和进程生命周期仍由原插件负责。

小结

dsh-mcp-lazy 解决的是一个具体问题:MCP 装多之后,工具说明对模型上下文的持续占用。它的取舍也很清楚——能安全接管的按需披露,不能确定的直接放行。如果你在 DSH 上维护着多个 MCP,可以试一下。

项目地址:https://github.com/leaforbook/dsh-mcp-lazy

社区目录页(独立站点,与 DeepSeek / 幻方无官方从属关系):https://www.skillhub.cn/plugins/leaforbook/dsh-mcp-lazy

羽毛球分组比赛记分
小程序二维码

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

小夜