如何建立 DeepSeek Harness 外掛

九步截圖實測:從最小的 hello-world Context 函式到雙端 MCP Apps 外掛——契約、Schema 與安裝指令全部給出。

最近更新: 2026-09-14

DeepSeek Harness 裡的所有能力——從單一 hello 工具到完整的互動介面——都以外掛形式存在,而自己寫一個外掛的門檻比看起來低:一個接收 Context 的函式、幾個匯出、一個 Schema。這篇圖文跟著一次真實的開發過程,從空資料夾走到一個能在對話裡跑起來的 MCP Apps 外掛。

九步涵蓋完整路徑:外掛是什麼、最小契約、Host 與 Client 兩個執行環境、load–run–dispose 生命週期、真實儲存庫的目錄結構、宿主入口與 Config Schema,以及在你自己的 profile 裡安裝、宣告、驗證外掛的確切指令。

九步建立一個 DeepSeek Harness 外掛

  1. 1

    先看清外掛插在哪裡

    DeepSeek Harness 基於 Cordis,外掛就是一個接收 Context 的函式:它宣告自己相依哪些服務,向 Context 註冊新能力,解除安裝時的清理則交給框架。模型工作階段工具與網頁介面都從這個邊界接入——影片裡的示意圖標出了程式碼可以擴充的幾個面:模型、工具、MCP 和 Web Client。

    DeepSeek Harness 架構示意圖:MODEL、TOOLS、MCP、WEB CLIENT 四個模組接入 DSH 可設定的核心
    四個擴充面匯入 harness 核心——外掛就是你給任何一面加能力的方式。在 0:13 觀看
    DSH 外掛教學裡的 Cordis Context 示意圖,標註宣告相依、註冊工具與介面、Config + Schema 和解除安裝清理
    外掛就是接收這個 Context 的函式:宣告、註冊,剩下的交給框架清理。在 0:25 觀看
  2. 2

    從最小的可用外掛開始

    教學裡的 hello 例子只需要三樣東西:可載入的模組入口(export const name = 'hello')、接收 Context 的 apply(ctx) 函式並在其中註冊能力——這裡用 ctx.tools.add 新增一個回顯名稱的 hello 工具——以及只有外掛需要設定時才匯出的、用 Schema.object 建構的 Config。Harness 會驗證這個 Schema,並在管理介面裡渲染對應的欄位。其餘都是可選的。

    最小的 DeepSeek Harness 外掛原始碼:export const name、apply(ctx) 呼叫 ctx.tools.add,旁邊是 Schema.object 的 Config 和三條清單
    整個檔案就是一個能跑的外掛:入口、apply 函式、可選的 Config Schema。在 1:00 觀看
  3. 3

    選 Host、Client 還是兩者都要——生命週期是同一套

    有兩個執行環境需要分清。Host 是執行 DeepSeek Harness 的後端程式,掌握網路連線和工具要用的金鑰;瀏覽器裡的 Harness Web UI 是 Client,負責元件和互動介面。hello 外掛只有 Host 入口——註冊一個工具,讓對話展示結果;帶介面的外掛則額外提供 Client 入口,宣告自己的 inject 和 apply。無論哪種,每個入口都在自己的執行環境裡執行 apply,解除安裝時 Context 會統一銷毀它註冊的一切。

    DSH 外掛生命週期示意圖,LOAD、RUN、DISPOSE 三個階段下方標註 HOST ENTRY 和 CLIENT ENTRY · OPTIONAL
    Host 入口必備,Client 入口可選——兩者走同一個三階段生命週期。在 1:45 觀看
    DSH 外掛生命週期示意圖裡高亮為綠色的 RUN 階段:apply(ctx) 在這裡執行並註冊外掛的能力
    RUN 就是你的 apply 函式幹活的時刻——把能力註冊到兩個執行環境都能看到的地方。在 1:20 觀看
  4. 4

    研究一個已上線外掛的目錄結構

    寫程式碼之前,先看一個已發布外掛是怎麼組織的。sugarforever/dsh-mcp-apps 儲存庫把原始碼、examples、tests、docs 和套件設定放在根目錄,src/ 下再分成 config、connection、protocol、rpc、tools、client。你不必逐行讀完——認準三個錨點(src/index.ts、src/config.ts、src/client/)就足以看懂任何 DSH 外掛。

    GitHub 上的 dsh 外掛目錄結構:sugarforever/dsh-mcp-apps 的 src 資料夾列出 client、config.ts、connection.ts、index.ts、protocol.ts、rpc.ts、tools.ts
    已上線外掛把契約放在 index.ts、驗證放在 config.ts、瀏覽器端放在 client/。在 2:05 觀看
  5. 5

    寫宿主入口:name、inject、Config、apply

    打開 src/index.ts,宣告公開契約。export const name 標識外掛;export const inject 列出相依的服務——MCP Apps 外掛宣告了 ['tools', 'connection'];export const Config 把驗證交給 Harness。apply(ctx, config) 接收 Context 和驗證後的設定,而長連線、工具註冊這類持續資源都包進 ctx.effect,解除安裝時 Harness 會統一釋放。這幾行就是宿主外掛與框架之間必須遵守的介面。

    VS Code 中打開的 DeepSeek Harness 外掛 src/index.ts:宿主端 import 和高亮的 name、inject、Config 契約匯出
    宿主檔案先 import @deepseek-ai/cordis,再寫三個契約匯出,最後是 apply。在 2:34 觀看
    DSH 外掛程式碼上方的 PLUGIN CONTRACT 標註卡:name 是外掛識別、inject 是宣告相依、apply 負責註冊與清理
    四個匯出就是全部公開契約——name、inject、Config、apply。在 2:55 觀看
  6. 6

    給使用者一個能填的 Config Schema

    在 src/config.ts 裡,教學外掛用一個 Schema union 描述兩種傳輸分支:stdio(command、args、env)和 streamable-http(必填 url、可選 headers),外加共用欄位 serverName(必填)、toolCallTimeoutMs(預設 60000)和 failOnStartupError(預設 false)。開發者實作介面和 Schema,使用者只需要填值——儲存庫裡的 examples/streamable-http.cordis.yml 就是那份填空實例。

    DSH MCP 外掛的 config.ts:Schema union 分 stdio 和 streamable-http 兩個分支,url 必填,逾時欄位帶預設值
    一個 Schema union 涵蓋兩種傳輸;必填與預設欄位直接驅動管理介面。在 3:05 觀看
    dsh-mcp-apps 儲存庫的 streamable-http.cordis.yml 範例:insert 條目把外掛指向 MCP 伺服器 url 並帶 failOnStartupError
    照這樣附一個 examples 檔案——它就是使用者照抄的填空實例。在 3:35 觀看
  7. 7

    把外掛裝進 web profile

    複製外掛儲存庫,把 DSH_HOME 指向要擴充的 Harness 主目錄,再把套件加進 web profile。示範執行的是 npx @deepseek-ai/dsh plugin --profile web add <路徑>,它把本機資料夾連結進 profile,並輸出 added 1 package 確認。裝到別的 profile 了?對同一個 profile 再跑一次 add 即可。

    $git clone https://github.com/sugarforever/dsh-mcp-apps.git
    $cd dsh-mcp-apps
    $export DSH_HOME=/tmp/dsh-video-home
    $npx @deepseek-ai/dsh plugin --profile web add /path/to/dsh-mcp-apps
    終端機裡執行 git clone https://github.com/sugarforever/dsh-mcp-apps.git,DeepSeek Harness 外掛安裝示範的第一步
    從參考儲存庫起步——先複製,再裝相依套件。在 5:37 觀看
    zsh 工作階段在 export DSH_HOME 後執行 npx @deepseek-ai/dsh plugin --profile web add 註冊 DSH 外掛
    add 指令把外掛連結進 web profile——此時還不需要別的設定。在 5:40 觀看
  8. 8

    在 cordis.patch.yaml 裡宣告實例

    只裝套件還不夠——還需要一條 patch 條目告訴 Harness 去實例化它。在 profile 的 cordis.patch.yaml(本例是 $DSH_HOME/profiles/web/cordis.patch.yaml)裡插入一條:唯一的 id、外掛的套件名稱('@sugarforever/dsh-mcp-apps')和它的 config:serverName、transport: streamable-http、MCP 伺服器 url 和 failOnStartupError。Harness 啟動時讀取這份 patch,自動載入外掛。

    vi 裡編輯 DSH web profile 的 cordis.patch.yaml:插入 @sugarforever/dsh-mcp-apps,含 serverName、streamable-http 傳輸和 failOnStartupError
    這條 patch 條目才是讓 Harness 在啟動時實例化外掛的關鍵。在 5:49 觀看
  9. 9

    啟動 Harness Web,看工具真的跑起來

    用同一個 DSH_HOME 啟動 Harness Web,打開 127.0.0.1:3080。讓 agent 玩一局 2048:模型看到外掛暴露的遠端工具並呼叫它,Host 把結果推送到外掛預先載入的沙箱介面,一個可以玩的 2048 棋盤直接出現在對話裡。安裝、設定、驗證,全流程走通。

    DeepSeek Harness 網頁端(127.0.0.1:3080)處理「玩一局2048」請求:dsh-system-prompt 上下文注入與 MCP app 工具呼叫
    模型自己看到外掛暴露的遠端工具並決定呼叫——無需手動接線。在 6:10 觀看
    模型呼叫遠端 MCP 工具後,DeepSeek Harness 對話裡渲染出帶 New Game 按鈕的可玩 2048 棋盤
    外掛的 Client 入口把工具結果變成了對話框裡的互動介面。在 6:15 觀看

建立 DeepSeek Harness 外掛:常見問題

開發者寫第一個外掛時真正會問的問題。

一句話說明白:DeepSeek Harness 外掛是什麼?

外掛就是一個接收 Cordis Context 的函式:它宣告自己相依哪些服務,向 Context 註冊新能力——模型工具、服務或介面——並依靠框架在外掛解除安裝時統一釋放它註冊的一切。

一個 DSH 外掛最少需要什麼?

三樣:可載入的模組入口、接收 Context 的 apply(ctx) 函式,以及 apply 裡註冊的至少一種能力——教學的 hello 外掛用 ctx.tools.add 新增了一個工具。只有外掛需要設定時才匯出 Config Schema,其餘都是可選的。

建立 DeepSeek Harness 外掛必須用 TypeScript 嗎?

教學的參考外掛是 TypeScript 寫的——export const name = 'mcp-apps'、inject 陣列、Schema.object(...) 都是 TypeScript 慣用法,直接複製那個儲存庫起步最快。契約本身只是一組模組匯出,概念可以遷移,但本頁所有範例都是 TypeScript。

Harness 啟動時是怎麼載入我的外掛的?

三步:把 DSH_HOME 指向你的 Harness 主目錄;用 npx @deepseek-ai/dsh plugin --profile web add <路徑> 把套件裝進某個 profile;在該 profile 的 cordis.patch.yaml 裡寫一條 insert 條目,填外掛名稱和設定。Harness 啟動時讀取 patch 並自動載入外掛——Harness 側不用改任何程式碼。

DSH 外掛可以包裝遠端 MCP 伺服器嗎?

可以——案例就是這麼做的。宿主入口連線 stdio 或 Streamable HTTP 的 MCP 伺服器,然後在 ctx.effect 裡把遠端工具註冊成 Harness 模型工具。Config Schema 暴露兩種傳輸分支,使用者只需在 cordis.patch.yaml 裡填 serverName、transport 和 url。

外掛被移除時,連線由誰清理?

框架來清理——前提是你透過 Context 註冊。把持續連線和工具註冊包進 ctx.effect,DISPOSE 階段會在解除安裝時統一釋放。這也是教學從不用模組層級全域變數存連線的原因。

相關指南

外掛生態的其餘部分,從概念到線上目錄。

來源與署名

截圖均來自這段公開錄影,每張圖都連回來源影片的對應時間點;上文分步文字是我們自行整理的內容。

DSH Plugins 是獨立的 DeepSeek Harness 外掛市集,與 DeepSeek 官方無關,也不代表官方背書。第三方外掛未經安全稽核,安裝前請審查原始碼。

每週取得最新的 DeepSeek Harness 外掛,絕不濫發。