前言¶
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 工具時的上下文膨脹問題。它保留了工具的全局註冊能力,同時通過精細的可見性控制優化了模型的使用體驗。