前言¶
DSH 的理念是「一切皆插件」,開發者往往會在上面裝文件、瀏覽器、數據庫等多個 MCP。這時會有一個具體的代價:即使當前問題只需要文件工具,所有 MCP 的工具名稱、說明和參數也可能一起進入模型上下文。MCP 裝得越多,每輪被佔用的 Token 就越多。
下面介紹 leaforbook/dsh-mcp-lazy,一個把暫時用不到的工具說明先藏起來、任務需要時再加載的 DSH 插件。
這是什麼¶
dsh-mcp-lazy(npm 包名 @yilinxiao/dsh-mcp-lazy)是 DeepSeek Harness(DSH)的 MCP 懶加載、動態加載工具與 Tool Router 插件,由 leaforbook 維護,當前版本 0.5.1,許可證 MIT,要求 Node >= 20。
一句話定位:按需披露兼容 MCP 的工具 Schema,減少上下文膨脹和 Token 浪費;不兼容時保持直通,顯式懶加載連接繼續保溫。
核心功能¶
Schema 按需披露¶
插件接管兼容的 MCP 後,冷態只向模型顯示一個共享路由工具 mcp__router__search_and_activate。任務需要某個 MCP 時,路由工具找到它,此時才顯示該 MCP 對應的工具。
會話級隱藏¶
每個會話有獨立的隱藏列表。當前輪結束後,已加載的工具再次隱藏;其他會話不會繼承本會話已經加載的工具。
自動接管與 fail-open¶
插件只接管名稱清楚、無衝突、能安全隱藏和重新顯示的 MCP。遇到命名異常、工具重名、目錄不完整或 DSH 能力不足等情況,會主動放棄接管,工具照常可見。這種處理方式叫 fail-open:寧可少省 Token,也不影響工具可用。
連接層懶加載與連接保溫¶
顯式配置的 server 支持 stdio 與 streamable-http 兩種 transport,用到時才建立 MCP 連接。當前輪結束後,插件先隱藏工具說明,連接按 warmIdleMs 保留(默認 5 分鐘),短時間內再次使用可直接複用。
目錄分頁與有限重連¶
工具目錄讀取支持分頁(maxToolListPages),意外斷開後有有限次數的自動重連(reconnectAttempts)。
安裝與啓用¶
dsh plugin --profile web add @yilinxiao/dsh-mcp-lazy
安裝後重啓 DSH。插件會自動發現已安裝的兼容 MCP,不需要逐個填寫 MCP 地址、請求頭或密鑰。
安裝包會自動寫入 manager 配置:
- insert:
- id: mcp-lazy-manager
name: '@yilinxiao/dsh-mcp-lazy'
config:
mode: manager
通常不需要手動修改這段配置。
已測試的 DSH 版本爲 0.1.0-rc.6、0.1.0-rc.7 和 0.1.0-rc.8。插件按 DSH 是否提供所需能力決定能否啓用,而不是隻看版本號。
典型用法¶
安裝後正常向模型提問即可,例如:
幫我找出項目裏所有超過 10 MB 的 PDF 文件。
模型會先通過共享路由找到文件 MCP,再調用它的原生工具。插件只決定「什麼時候讓模型看到哪些工具」,真正的調用仍由原 MCP 完成。
按下面步驟驗證是否生效:
1、安裝並重啓 DSH,新建一個會話。
2、查看冷態工具列表:被接管的 MCP 工具應已隱藏,只留下 mcp__router__search_and_activate,普通 DSH 工具仍然可見。
3、提出一個需要某個 MCP 的任務。路由完成後,模型應只看到該 MCP 的工具,並能正常調用。
4、再新建一個會話,前一個會話加載過的 MCP 工具不應出現。
經過上面的步驟,如果某個 MCP 一直可見,通常說明它沒有通過兼容性檢查,被保留爲原來的工作方式,這不代表插件失效。
顯式配置連接層懶加載¶
自動接管只減少模型側的工具說明,不會關閉第三方 MCP 進程。如果希望某個 MCP 平時不連接、用到時才啓動,可以在配置目錄的 cordis.patch.yml 中把它顯式配置爲插件的 server:
- insert:
- id: mcp-lazy
name: '@yilinxiao/dsh-mcp-lazy'
config:
transport: stdio
serverName: filesystem
command: npx
args: [-y, '@modelcontextprotocol/server-filesystem', '/tmp']
connectTimeoutMs: 30000
discoveryTimeoutMs: 60000
maxToolListPages: 100
reconnectAttempts: 1
autoActivate: false
releaseOnTurnEnd: true
warmIdleMs: 300000
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]
stdio 模式用 command、args 等字段描述啓動命令;streamable-http 模式用 url、headers 指向服務地址。幾個關鍵字段:
warmIdleMs:工具隱藏後連接保留多久,默認 5 分鐘,設爲0會立即斷開。autoActivate:默認false,開啓後 DSH 啓動時立即連接,不再按需連接。releaseOnTurnEnd:默認true,當前輪結束後隱藏已加載的工具說明。routingHints:幫助路由器識別該 MCP 的關鍵詞,如業務名、能力或常用叫法。maxToolListPages與reconnectAttempts:目錄分頁上限與自動重連次數。
關閉自動接管¶
想讓所有 MCP 恢復原來的顯示方式,只需禁用 manager 條目。在 $DSH_HOME/profiles/web/cordis.patch.yml 中加入:
- id: mcp-lazy-manager
disabled: true
請保留這段覆蓋配置,刪掉後安裝包會再次啓用 manager。它只關閉自動接管,顯式的 lazy server 配置不受影響;不需要卸載 npm 包,也不用修改其他 MCP 的地址、請求頭或密鑰。
適用場景與注意¶
適合兩類場景:
1、裝了較多 MCP,希望減少每輪進入模型上下文的工具說明。
2、希望某些 MCP 平時不連接、用到時才啓動,並保留短時保溫。
使用前需要注意:
- 插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證(MIT)。
- 自動接管只減少模型側的工具說明,不負責停止、重啓或代理第三方 MCP 進程。
- 不支持
tool.execution.taskSupport === 'required'的任務型工具,調用時直接返回錯誤。 - 自動重連次數有限,超過後需重新調用
activate。 - 保溫連接只存在於當前 DSH 進程,不寫入磁盤,重啓後需重新讀取工具目錄。
- Token 數據是對工具說明的近似測量(使用 cl100k_base),不能直接換算爲賬單金額;覈算實際收益,請比較同類請求的
prompt_tokens和緩存命中。 - 普通 DSH 工具不會被隱藏;不滿足條件時插件主動 fail-open,保持原樣。
- 對第三方 MCP,插件只顯示原 MCP 註冊的工具定義,不替換執行器,權限、審計、重試和進程生命週期仍由原插件負責。
小結¶
dsh-mcp-lazy 解決的是一個具體問題:MCP 裝多之後,工具說明對模型上下文的持續佔用。它的取捨也很清楚——能安全接管的按需披露,不能確定的直接放行。如果你在 DSH 上維護着多個 MCP,可以試一下。
項目地址:https://github.com/leaforbook/dsh-mcp-lazy
社區目錄頁(獨立站點,與 DeepSeek / 幻方無官方從屬關係):https://www.skillhub.cn/plugins/leaforbook/dsh-mcp-lazy