前言¶
DeepSeek Harness (DSH) 通过插件机制扩展能力,其中 dsh-mcp-client 会将安装的 MCP 服务器工具在部署范围内全局注册。当安装大量 MCP 服务器时,每个请求都需要处理所有工具的模式定义,这产生了固定的开销,且会让工具列表变得庞大,导致模型难以在众多工具中选择正确的那个。
dsh-mcp-loader 旨在解决这一问题。它为每个多工具 MCP 服务器引入一个加载器工具,真实工具仅在调用加载器时进入模型上下文。这移除了工具模式在每次请求中的固定成本,并保持了可见的工具列表精简。
插件简介¶
- 名称:
mikotomywife/dsh-mcp-loader - 维护者:MikotoMyWife
- 定位:DSH 的 MCP 工具懒加载插件,支持按会话遮罩和描述工程。
- 许可证:MIT
- 核心价值:减少 Token 消耗,优化工具列表,提升模型在多 MCP 服务器场景下的选择效率。
核心功能¶
插件提供以下能力:
-
按服务器加载器开关
每个多工具服务器由一个加载器工具(默认命名mcp_<server>)代表。调用加载器可加载、隐藏或重新加载真实工具。加载状态是按会话隔离的:一个会话的加载对其他会话不可见。 -
工作模式
auto:启动时探测一次服务器工具数量,工具数小于阈值(singleToolThreshold)的服务器直接常驻,否则注册加载器。lazy:服务器始终隐藏在加载器后,仅在调用时加载,启动时不探测。eager:服务器常驻,不使用加载器。
-
按代理工具遮罩 (
hiddenTools)
在服务器加载后,可对特定工具进行遮罩。遮罩使用restrict({ deny })实现,支持精确名称、公开名称(如mcp__notes__*)和通配符(如e*,?)。遮罩仅影响可见性,工具仍全局注册。 -
全局禁用工具 (
disabledTools)
在注册轴层面直接丢弃匹配的工具,使其对任何代理都不可见。同样支持通配符规则。 -
描述工程
支持按服务器或按工具的描述覆盖,以及参数描述截断(maxParameterDescriptionChars)。服务器发送的instructions会在加载结果中作为归属文本展示,而非长期占用加载器描述的 Token。 -
环境清理与资源桥接
- 子进程环境会移除凭证类键值(如
/KEY|PASSWORD|SECRET|TOKEN)和DSH_*事实,同时保留PATH和NPM_CONFIG_*等环境变量。 - 支持可选的 Resource Bridge,将已加载服务器的资源暴露给 Harness 资源服务。
- 子进程环境会移除凭证类键值(如
-
容错与边界
- 原子注册:失败时回滚到零工具。
- 硬限制:限制
maxToolListPages、maxToolsPerServer和discoveryTimeoutMs,超时或超出限制的加载会失败并保持加载器可用。 - 有序重新同步:防止并发加载导致旧数据覆盖新数据。
安装与构建¶
插件依赖 Node.js 环境和 @modelcontextprotocol/client 2.0.0。
- 克隆仓库并安装依赖:
npm install
- 编译代码:
npm run build
- 配置插件:
根据package.json中的配置,插件通过cordis.patch.yml进行挂载。
典型用法¶
工作流程如下:
- 初始状态:工具列表仅显示加载器工具(例如
mcp_notes、mcp_browser)。 - 第一次调用:模型调用
mcp_notes({})。系统返回ok,并在当前会话及其子代理中暴露真实工具(例如mcp__notes__search)。 - 第二次调用:模型再次调用
mcp_notes({})。系统返回ok (N tool(s) hidden),隐藏真实工具。 - 第三次调用:模型调用
mcp_notes({})。系统重新加载并暴露真实工具。
对于单工具服务器(数量小于阈值),启动时直接常驻,不经过上述加载器流程。
注意事项¶
- Node 版本:插件要求 Node.js 版本
>=20。 - 注册范围:工具注册是部署范围(全局)的,与官方
dsh-mcp-client一致。hiddenTools是在全局注册的基础上,按会话进行过滤。 - 会话隔离:可见性是按会话的。一个会话的加载状态不会影响其他会话。
- 单工具阈值:配置
singleToolThreshold: 0可强制所有服务器使用按会话的加载器模式。 - 权限安全:插件以当前 DSH 进程的权限运行。安装前应检查源码与许可证。
结语¶
dsh-mcp-loader 通过懒加载和按会话遮罩机制,解决了 DSH 在集成大量 MCP 工具时的上下文膨胀问题。它保留了工具的全局注册能力,同时通过精细的可见性控制优化了模型的使用体验。