前言¶
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 邊界的調用只有兩種:callTool 與 readResource,後者只接受 ui:// URI。Host 側插件可以在進程內調用 listResources、listPrompts、getPrompt,且這些結果不會注入模型上下文。
渲染器的認領條件¶
Web 渲染器只認領同時滿足以下條件的 Tool 結果:
- presentation card 爲
mcp-app; - 資源 URI 是
ui://; - MIME 類型精確爲
text/html;profile=mcp-app; - 結果是通過 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-host 與 mcp-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、畫中畫三種表面,並把瀏覽器安全邊界收斂到 callTool 與 ui:// 的 readResource。社區目錄頁見 https://www.skillhub.cn/plugins/openma-ai/dsh-mcp-apps(獨立站點,與 DeepSeek 無官方從屬關係),源碼與文檔見 https://github.com/openma-ai/dsh-mcp-apps。