前言¶
DeepSeek Harness(DSH)支持通过插件集成 Model Context Protocol(MCP)服务器。使用默认的 @deepseek-ai/dsh-mcp-client 时,配置的服务器会在插件启动时连接,并将所有工具定义注册为原生工具。这意味着每次请求都会携带大量工具的 schema 字节,且服务器会常驻内存,无论模型是否实际调用它们。
dsh-mcp-lazy 是一个为此设计的网关插件。它在前端只暴露一个固定的代理工具,仅在模型调用特定工具时才启动对应的服务器,并在闲置后断开连接。服务器元数据会被缓存到磁盘,使得元数据查询操作无需启动进程。
核心功能¶
- 单一代理工具:替代原本的 N 个工具定义,前端只存在一个 schema 恒定的工具。
- 惰性加载与空闲断开:服务器仅在首次使用时启动,闲置后自动断开。
- 磁盘缓存:元数据持久化存储,
search(搜索)和describe(描述)操作不触发进程启动。 - 配置迁移工具:提供 CLI 工具
dsh-mcp-lazy-adopt,帮助将现有配置迁移到新插件。 - Token 节省测量:提供脚本用于计算并测量 Token 节省情况。
安装¶
使用官方安装命令添加插件到指定配置文件:
dsh plugin --profile <your-profile> add dsh-mcp-lazy
安装后,插件会注册其补丁层。需要在配置文件的 cordis.patch.yml 中定义服务器列表。
使用方式¶
插件在 DSH 面板中暴露为一个名为 mcp-lazy 的工具。以下是几种调用方式:
- 搜索工具:在缓存中查找工具名称。
mcp({ search: "screenshot" })
- 获取描述:获取指定工具的完整参数 schema。
mcp({ describe: "take_screenshot" })
- 调用工具:实际执行操作,此时才会启动对应的服务器。
mcp({ tool: "take_screenshot" })
- 跨服务器调用:当多个服务器拥有同名工具时,通过
server参数指定。
mcp({ tool: "echo", server: "docs" })
- 连接服务器:连接并刷新缓存,不执行调用。
mcp({ connect: "chrome" })
- 查看状态:查看当前连接状态、缓存数量及缓存时间。
mcp({})
配置示例¶
在 cordis.patch.yml 中添加 mcp-lazy 配置段:
- id: mcp-lazy
config:
servers:
- serverName: chrome
transport: stdio
command: npx
args: ['-y', 'chrome-devtools-mcp@1.6.0']
lifecycle: lazy
- serverName: docs
transport: streamable-http
url: http://127.0.0.1:3000/mcp
注意事项¶
- Token 节省计算:网关本身消耗固定的 1525 字节。仅当服务器工具定义渲染后的字节数超过该值时,插件才会产生净收益。如果配置的服务器工具较少或较小,插件可能会增加开销。建议在启用前运行测量脚本验证。
- Node 版本要求:插件依赖 Node.js 版本
>=22.18.0。 - 配置迁移:
adopt命令不会在插件启动时自动运行,需要手动执行。它读取当前实际挂载的配置,将原生工具行标记为disabled: true并追加到当前插件的servers列表中。 - 全局影响:
adopt命令通常禁用原生配置行,该行通常位于home补丁层(~/.dsh/cordis.patch.yml)。如果其他配置文件(如default、dsh-tui、headless)也引用了该配置但未挂载本插件,它们将失去该工具能力。 - 不支持字段:插件不支持
reconnect和failOnStartupError两个原生字段,迁移配置时会报错并保留原行。
总结¶
dsh-mcp-lazy 通过引入一个固定开销的网关层,换取了动态加载 MCP 服务器的能力,显著降低了每次请求的 Token 消耗。对于拥有大量 MCP 工具且希望节省上下文空间的场景,这是一个实用的优化方案。使用前请确保工具定义足够复杂以覆盖网关的固定成本。