dsh-mcp-lazy:DSH 的 MCP 懶加載插件,按需披露工具 Schema 減少 Token 浪費

前言

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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜