按需加载 MCP 工具,并在轮次结束时卸载闲置工具 Schema,减少发送给模型的工具目录及上下文 Token;同时保温连接以便快速复用。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:leaforbook/dsh-mcp-lazy
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本。请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness 的按需 MCP 桥接插件。它不会在启动时把 MCP 服务器的全部工具塞进工具目录,而是为每个服务器保留 activate 和 deactivate 两个控制工具,并在同一工具域共享一个 mcp__router__search_and_activate 路由工具。需要哪个服务器时,可让路由器搜索并激活,也可明确调用服务器自己的 activate;本轮结束后立即卸载远端工具 Schema,默认将连接保温 5 分钟以便下一轮复用。
这样做主要是为了少占 TOKEN。工具的名称、说明和参数结构会随模型请求一起进入上下文。MCP 服务器越多、工具定义越长,常驻目录消耗的输入 TOKEN 就越多。这个插件让没用到的工具不进入当轮请求。
工具定义本身能少多少 TOKEN
下面的数据来自三个真实 MCP 服务器,测试时间为 2026-08-18。“全量常驻”按 @deepseek-ai/dsh-mcp-client 的方式统计,“按需模式”按每个服务器未激活时的两个专用控制工具统计。0.4.0 新增的共享路由工具是整个 DSH 工具域一份固定开销,未计入各服务器行。TOKEN 使用 cl100k_base 统一计算,适合比较工具定义的前后差额。
| MCP 服务器 | 全量常驻 | 按需模式未激活 | 全量工具定义 | 按需工具定义 | 每轮减少 | 工具定义降幅 |
|---|---|---|---|---|---|---|
| Chrome DevTools MCP 1.7.0 | 29 个工具 | 2 个工具 | 4,585 TOKEN | 200 TOKEN | 4,385 TOKEN | 95.6% |
| Playwright MCP 0.0.79 | 24 个工具 | 2 个工具 | 3,452 TOKEN | 195 TOKEN | 3,257 TOKEN | 94.4% |
| Filesystem MCP 2026.7.10 | 14 个工具 | 2 个工具 | 1,694 TOKEN | 190 TOKEN | 1,504 TOKEN | 88.8% |
| 三个服务器合计 | 67 个工具 | 6 个工具 | 9,727 TOKEN | 581 TOKEN | 9,146 TOKEN | 94.0% |
表里的 94.0% 只表示工具定义缩小了多少,不能当成整次请求的 TOKEN 降幅。整次请求还包括系统提示、聊天记录、用户消息和其他工具。上下文越长,这 9,146 TOKEN 在总输入里的占比就越小。
整次请求大约能省多少
仍以三个服务器的合计数据为例,设 C 为工具定义之外的输入 TOKEN:
- 全量常驻:约
C + 9,727 - 按需未激活:约
C + 581 - 输入降幅:约
9,146 ÷ (C + 9,727)
其他上下文 C |
全量常驻总输入 | 按需未激活总输入 | 约减少 | 整次输入降幅 |
|---|---|---|---|---|
| 0 TOKEN | 9,727 TOKEN | 581 TOKEN | 9,146 TOKEN | 94.0% |
| 10,000 TOKEN | 19,727 TOKEN | 10,581 TOKEN | 9,146 TOKEN | 46.4% |
| 50,000 TOKEN | 59,727 TOKEN | 50,581 TOKEN | 9,146 TOKEN | 15.3% |
| 100,000 TOKEN | 109,727 TOKEN | 100,581 TOKEN | 9,146 TOKEN | 8.3% |
这里的绝对值仍是 cl100k_base 估算,不等同于 DeepSeek API 的精确 TOKEN。DeepSeek 还会把输入分成缓存命中和未命中两部分,两者的实际费用可能不同。要核算真实收益,应比较同类请求返回的 prompt_tokens、prompt_cache_hit_tokens 和 prompt_cache_miss_tokens,不能直接用单轮估算乘以轮数。
什么时候省,什么时候不省
- 服务器未激活时,每个服务器只保留两个专用控制工具,整个工具域另共享一个搜索激活路由器,仍是最省 TOKEN 的状态。
- 激活服务器后,它的全部工具会在当前轮注册;这一轮仍要承担该服务器的工具定义 TOKEN。
- 默认会在轮次结束时立即卸载远端工具 Schema;专用控制工具和共享路由器仍然可用。
- 默认连接继续保温 5 分钟。保温期内再次激活会直接复用内存目录和现有连接,不重新启动 MCP 进程。
releaseOnTurnEnd: false会让实际激活或调用过该服务器的会话成为跨轮次持有者;直到最后一个持有会话销毁前,Schema 和连接都会保持可用。- 如果服务器本来只有一两个很短的工具,按需模式的 TOKEN 优势可能很小。
autoActivate: true会在启动时直接连接服务器,相当于关闭懒加载,不再节省这部分 TOKEN。
安装
dsh plugin --profile web add @yilinxiao/dsh-mcp-lazy
推荐通过 npm 安装;源码与发布记录仍保存在 GitHub。
安装时会加入一个默认停用的 mcp-lazy 配置占位,不会在缺少服务器参数时启动插件。完成下面的服务器配置后才会实际连接 MCP。
配置
在对应配置目录的 cordis.patch.yml 中,每个 MCP 服务器写一条配置:
- insert:
- id: mcp-lazy
name: '@yilinxiao/dsh-mcp-lazy'
config:
transport: stdio
serverName: filesystem
command: npx
args: [-y, '@modelcontextprotocol/server-filesystem', '/tmp']
connectTimeoutMs: 30000 # 建立连接超时,默认 30 秒
discoveryTimeoutMs: 60000 # 每页 tools/list 超时,默认 60 秒
maxToolListPages: 100 # 最多读取的工具目录页数,默认 100
reconnectAttempts: 1 # 意外断开后的有限重连次数,默认 1
autoActivate: false # 是否在启动时直接连接,默认 false
releaseOnTurnEnd: true # 是否在轮次结束后卸载远端工具 Schema,默认 true
warmIdleMs: 300000 # Schema 卸载后连接保温时长,默认 5 分钟
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]
配置项
| 配置键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
transport |
stdio | streamable-http |
— | 必填。MCP 传输方式。 |
serverName |
string | — | 必填。允许 [A-Za-z0-9_-]{1,32},同时用作工具名前缀。 |
command / args / env / cwd |
— | — | stdio 启动参数。env 会合并到脱敏后的父进程环境。 |
url / headers |
— | — | streamable-http 的服务地址和请求头。 |
toolCallTimeoutMs |
number | 60000 |
单次工具调用超时,单位为毫秒。 |
connectTimeoutMs |
number | 30000 |
建立 MCP 连接的超时,单位为毫秒。 |
discoveryTimeoutMs |
number | 60000 |
单页 tools/list 请求的超时,单位为毫秒;激活流程另有略短于 180 秒控制工具超时的总 deadline。 |
maxToolListPages |
number | 100 |
一次目录发现最多读取的页数;重复游标、重名工具或超限都会中止。 |
reconnectAttempts |
number | 1 |
意外断开且仍有当前轮使用者、跨轮次持有者或自动激活所有权时的重连次数。设为 0 可关闭;成功调用工具后恢复预算。 |
autoActivate |
boolean | false |
启动时直接连接服务器。开启后不再按需加载。 |
releaseOnTurnEnd |
boolean | true |
本轮结束且没有会话继续使用时,立即卸载远端工具 Schema。设为 false 时,实际激活或调用过服务器的会话会跨轮次持有发布;无关会话的销毁不会释放它,最后一个真实持有会话销毁后才卸载。 |
warmIdleMs |
number | 300000 |
Schema 卸载后的连接保温时长,单位为毫秒。仅接受非负整数,无效值回退为 5 分钟;设为 0 可恢复 0.3.x 的轮末立即关闭连接行为。 |
routingHints |
string[] | [] |
共享路由器用于匹配服务器的关键词,例如业务名称、能力或自然语言别名。 |
工作原理
- 同一 DSH 工具域只注册一个
mcp__router__search_and_activate,每个服务器仍保留mcp__<server>__activate和mcp__<server>__deactivate。路由器依次参考精确serverName、完整工具前缀、routingHints和已缓存目录;完整前缀先保留大小写做精确匹配,只有大小写折叠后的候选唯一时才回退匹配,因此Foo/foo之类的歧义不会被猜中。零匹配或最高分并列时同样不会激活任何服务器。 共享路由器的宿主注册归属于当前某个插件上下文;该 Cordis fiber 卸载而其他服务器仍存活时,注册会转移到一个存活上下文,仍保持每个工具域恰好一份。 如果已有配置使用serverName: router,且该 MCP 原生提供search_and_activate,两个工具会得到同一个公开名称。宿主注册表无法同时暴露同名工具,因此激活期间由原生工具占用该名称;原生工具卸载后自动恢复共享路由器,其他服务器自己的activate/deactivate始终可用。 - 路由器选中服务器或明确调用
activate后,插件通过stdio或streamable-http连接服务器,带超时和页数上限分页读取tools/list,再注册服务器提供的全部工具。激活结果只返回工具数量,不重复输出完整名称列表。 - 工具名沿用
dsh-mcp-client的规则:mcp__<server>__<tool>。名称只保留[A-Za-z0-9_-],最长 64 个字符;出现冲突时追加 12 位哈希。 releaseOnTurnEnd: true时,默认在agent/turn-stopping立即卸载远端工具 Schema,并把连接保温warmIdleMs;保温期再次激活会直接从内存目录恢复 Schema。设为false时,当前轮使用者与跨轮次持有者分别记录:轮次停止只清除当前轮需求,持有权一直保留到对应的agent/disposed;多个持有者必须全部销毁才会释放,无关会话的销毁不产生影响。autoActivate是独立的常驻所有权;显式deactivate和插件销毁始终立即关闭连接。- 收到
tools/list/changed后,插件先完整拉取并验证新目录,再按指纹差量更新:未变化的工具不重复注册,刷新失败则保留最后一次可用目录。每次发现都有单调递增的代次,较早的激活发现即使更晚返回也不能覆盖更新的刷新结果。保温且没有活跃使用者时只更新内存目录,不重新发布 Schema;并发通知会合并,刷新期间的新通知会在本次完成后再同步一次。 - 连接意外断开时会立即卸载失效工具。仍有当前轮使用者、跨轮次持有者(或启用了
autoActivate)时,插件按reconnectAttempts做有限自动重连,不会无限后台循环。
限制
- 不支持必须以任务方式执行的工具,即
tool.execution.taskSupport === 'required'。遇到这类工具会直接返回错误。 - 自动重连是有界的,且只在仍有连接需求时发生。超过预算后需重新调用
activate;成功调用任一服务器工具会恢复重连预算。 - 保温只复用当前进程内的连接和工具目录,不写磁盘;进程重启后仍需重新发现。
- TOKEN 数据是工具定义的近似值,不代表请求的全部输入,也不能直接换算成账单金额。
测试
npm ci --legacy-peer-deps --ignore-scripts
npm test
测试覆盖分页与游标保护、稳定指纹、差量更新、注册失败回滚、刷新通知合并,以及真实 stdio MCP 客户端/服务端的分页、调用和目录变更通知。
许可证
MIT
链接
同类插件
superdesigndev/treg★ 477
给 Agent 的工具目录:按「要做的事」检索约 2,600 个外部接口(SEO 与 SERP、外链、社交、人物与公司信息补全、广告库、抓取),查看参数与单次调用价格后直接调用,凭据由服务端注入。附带技能,MCP 行在未设置 TREG_TOKEN 前保持禁用。
zhaoolee/notes#dsh-plugin★ 147
将 DSH 对话导出为锤子便签风格 PNG,或在配置的账号工作区中新建和更新 Markdown 便签。
taxueseek/argo#dsh-plugin★ 101
专为 agent 打造的搜索工具:多语言,覆盖中文/英文/学术/代码/购物/金融/新闻/百科。
omdsh-dev/dsh-data-agent★ 55
让 AI 帮你连数据库、写 SQL。
heartleo/hn-cli#hacker-news★ 50
用于获取 Hacker News 榜单、讨论串、搜索和用户资料的工具。
geml-spec/geml#integrations/dsh-plugin★ 24
按块寻址的文档读写:MCP server 提供 geml_get / geml_set / geml_check 等工具,Agent 只取回或改写 Markdown、GEML 文档中的某一个块,而不是整篇文件。另带 GEML 写作技能,以及把项目调用图构建为 GEML codemap 并浏览的代码图谱技能。