前言¶
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 支持 stdio 与 streamable-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 模式用 command、args 等字段描述启动命令;streamable-http 模式用 url、headers 指向服务地址。几个关键字段:
warmIdleMs:工具隐藏后连接保留多久,默认 5 分钟,设为0会立即断开。autoActivate:默认false,开启后 DSH 启动时立即连接,不再按需连接。releaseOnTurnEnd:默认true,当前轮结束后隐藏已加载的工具说明。routingHints:帮助路由器识别该 MCP 的关键词,如业务名、能力或常用叫法。maxToolListPages与reconnectAttempts:目录分页上限与自动重连次数。
关闭自动接管¶
想让所有 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