前言¶
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 工具且希望節省上下文空間的場景,這是一個實用的優化方案。使用前請確保工具定義足夠複雜以覆蓋網關的固定成本。