openma-ai/dsh-mcp-apps:爲 DeepSeek Harness 補上 MCP Apps 支持

前言

MCP Apps 允許 MCP 工具結果附帶 ui:// 的 HTML 資源,由客戶端渲染成可交互界面。要在 DeepSeek Harness(DSH)裏跑通它,需要協議 Host、沙箱渲染器和顯示模式管理這一整套組件。

對比已有做法:DSH 的 Web 構建自帶一個 inline-only 渲染器,只覆蓋行內一種表面。下面介紹 openma-ai/dsh-mcp-apps:它把 MCP Apps Host 與 Web 渲染器打包成普通 Cordis 插件,補上這一層能力。

這是什麼

openma-ai/dsh-mcp-apps(npm 包名 @openma/dsh-mcp-apps,當前版本 0.1.1,MIT 許可)爲 DeepSeek Harness 提供 MCP Apps 支持,以普通 Cordis 插件形式打包。實現基於官方 @modelcontextprotocol/ext-apps 的 AppBridge 與 PostMessageTransport。

項目由三個包組成:

  • @openma/dsh-mcp-apps:可安裝、可嵌套的 bundle kernel,管理 Host 與 Web 兩個子行的生命週期;
  • @openma/dsh-mcp-apps-host:內部運行時包,提供 ctx.mcpApps 服務註冊表;
  • @openma/dsh-mcp-apps-web:內部運行時包,在雙 iframe 沙箱中運行 App HTML 的 Web 渲染器。

核心能力

複用同一條 MCP 連接

安裝 bundle 後新增兩個獨立子行:共享既有 MCP 連接的 Host 服務,以及在雙 iframe 沙箱中運行 App HTML 的 Web 渲染器。MCP 服務器連接保持爲獨立插件行,DSH 的 mcp-client 檢測到可選的 ctx.mcpApps 服務後自動貢獻連接,例如:

- name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: weather
    transport: stdio
    command: weather-mcp-server

這樣配置後,工具、資源、prompts、模型側執行與 AppBridge 調用共用同一個 MCP SDK Client,包括它的認證與重連 generation;這個項目不會開第二條連接。

受限的瀏覽器 Remote 邊界

跨瀏覽器 Remote 邊界的調用只有兩種:callToolreadResource,後者只接受 ui:// URI。Host 側插件可以在進程內調用 listResourceslistPromptsgetPrompt,且這些結果不會注入模型上下文。

渲染器的認領條件

Web 渲染器只認領同時滿足以下條件的 Tool 結果:

  1. presentation card 爲 mcp-app
  2. 資源 URI 是 ui://
  3. MIME 類型精確爲 text/html;profile=mcp-app
  4. 結果是通過 schema 校驗的合法 MCP Tool 結果。

其餘結果不參與 tool.call.takeover 鏈,繼續走普通的工具視圖與通用 fallback。

一個會話,三種表面

一個 AppBridge 會話可以在 inline、fullscreen(右側面板)與受限畫中畫三種表面之間移動,無需重掛載 iframe。左下角的 Host 顯示模式控件,只在 App 通過 appCapabilities.availableDisplayModes 聲明後纔會出現。

沙箱邊界

  • App HTML 不在 DSH 文檔內運行,而是加載進雙 iframe 沙箱;
  • CSP 先於 App 代碼安裝,僅接受經過校驗的 HTTP(S)/WS(S) 域來源;
  • 外部導航僅允許 HTTP(S) URL,且在新標籤頁打開;
  • inline 高度請求限制在 96–720 px;
  • 內部文檔一旦發生導航,立即切斷 Host-to-App 轉發。

安裝與啓用

1、安裝 bundle:

dsh plugin --profile web add @openma/dsh-mcp-apps

從本地檢出安裝時,先裝依賴,再添加根目錄:

npm install
dsh plugin --profile web add .

若當前 profile 已確認包含官方 Host,也可以只裝渲染器,這是最小等價方案:

dsh plugin --profile web add ./packages/web

2、bundle patch 會掛載一個 kernel,其下擁有 mcp-apps-hostmcp-apps-web 兩個子行:

- id: mcp-apps-bundle
  name: '@openma/dsh-mcp-apps'

3、在已經提供 ctx.mcpApps 與生成 remote.mcpApps 命名空間的 DSH 組合上,安裝完整 bundle 也是安全的:fallback Host 行會變成 no-op,Web 渲染器直接複用既有 Remote。

典型用法:驗證三種表面切換

倉庫自帶一個示例 stdio MCP 服務器。構建並啓動:

npm run build:example:display-modes
node examples/display-modes/server.mjs

它的 display_modes 工具會打開 ui://dsh/display-modes。在界面裏遞增計數器並依次切換三種表面,可以驗證 App 會話在表面之間移動後依然保持存活。

適用場景與注意事項

  • 想在 DSH 的 Web profile 裏直接使用 MCP Apps,安裝本包即可。如果目標是在 DSH 裏使用 Codex、Claude Code、Pi 等外部 Agent Plugins(包含它們各自的 MCP Apps),只需安裝 @openma/dsh-agents-plugins-bridge,它已自帶 MCP Apps;不要把兩個 bundle 裝進同一個 profile。
  • Host 包與 UI 無關。完整的 HTML/AppBridge 路徑目前只有 Web 包實現;TUI 可以獨立安裝 Host 並自行提供渲染器(例如文本 fallback 或「在瀏覽器中打開」),終端客戶端不應在行內執行任意 App HTML。
  • Web 渲染器針對當前 DSH Web 構建的 tool.call.takeover 鏈。與 DSH 0.1.0-rc.7 組合時,priority -110 使它先於 priority -100 的內置 inline-only 渲染器認領 MCP App 結果。
  • Downloads、App-to-chat messages、sampling 尚未啓用。
  • 開發或構建需要 Node.js 20 或更新版本。
  • 插件以當前 dsh 進程的權限運行。安裝前建議檢查倉庫源碼與許可證(本項目爲 MIT),確認符合自己的安全要求。

結尾

回顧一下:dsh-mcp-apps 用兩個 Cordis 插件行把 MCP Apps 的協議 Host 與沙箱渲染接進 DSH,複用既有 MCP 連接,支持 inline、fullscreen、畫中畫三種表面,並把瀏覽器安全邊界收斂到 callToolui://readResource。社區目錄頁見 https://www.skillhub.cn/plugins/openma-ai/dsh-mcp-apps(獨立站點,與 DeepSeek 無官方從屬關係),源碼與文檔見 https://github.com/openma-ai/dsh-mcp-apps

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

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

小夜