DeepSeek Harness プラグインの作り方

hello-world の Context 関数からデュアルランタイムの MCP Apps プラグインまで、スクリーンショット付き 9 ステップ。契約・Schema・インストールコマンドをすべて提示します。

最終更新: 2026-09-14

DeepSeek Harness の機能は、小さな hello ツールから本格的なインタラクティブ UI まですべてプラグインとして提供されます。そして自分でプラグインを書くハードルは見た目より低いのです。必要なのは Context を受け取る関数、いくつかのエクスポート、そして Schema。このウォークスルーでは、空のフォルダからチャット内で動く MCP Apps プラグインまでの、実際の開発の流れを追います。

9 ステップで全工程をカバーします。プラグインとは何か、最小契約、Host と Client の 2 つのランタイム、load・run・dispose のライフサイクル、実際のリポジトリ構成、ホストエントリーと Config Schema、そして自分の profile にプラグインをインストール・宣言・検証する正確なコマンドです。

9 ステップで DeepSeek Harness プラグインを作る

  1. 1

    プラグインがどこに接続するのかを見る

    DeepSeek Harness は Cordis を基盤にしており、プラグインとは Context を受け取る関数です。依存するサービスを宣言し、その Context に新しい機能を登録し、アンインストール時のクリーンアップはフレームワークに任せます。モデルセッションツールも Web インターフェースもこの境界から接続します。スライドにはコードで拡張できる対象——モデル、ツール、MCP、Web Client——が描かれています。

    DeepSeek Harness のアーキテクチャスライド。MODEL・TOOLS・MCP・WEB CLIENT の各ブロックが DSH の設定可能なコアに接続する様子
    4 つの拡張対象がハーネスのコアに収まります。プラグインは、そのどれにでも能力を追加する手段です。動画の 0:13 で見る
    DSH プラグインチュートリアルの Cordis Context 図。依存の宣言、ツールと UI の登録、Config + Schema、アンインストール時のクリーンアップに注釈
    プラグインとはこの Context を受け取る関数です。宣言し、登録し、クリーンアップはフレームワークに任せます。動画の 0:25 で見る
  2. 2

    最小の動くプラグインから始める

    チュートリアルの hello 例に必要なのは 3 つだけです。ロード可能なモジュールエントリー(export const name = 'hello')、Context を受け取る apply(ctx) 関数の中で機能を登録すること——ここでは ctx.tools.add で名前をオウム返しする hello ツールを追加——そしてプラグインが設定を取る場合のみ、Schema.object で組み立てた Config をエクスポートすること。Harness はこの Schema を検証し、管理画面に対応するフィールドを表示します。それ以外はすべて任意です。

    最小の DeepSeek Harness プラグインソース。export const name、ctx.tools.add を呼ぶ apply(ctx)、Schema.object の Config と 3 項目のチェックリスト
    このファイル全体が動くプラグインです。エントリー、apply 関数、任意の Config Schema。動画の 1:00 で見る
  3. 3

    Host か Client か両方か——ライフサイクルは同じ

    区別すべきランタイムは 2 つあります。Host は DeepSeek Harness を動かすバックエンドプロセスで、ネットワーク接続とツールが使うキーを管理します。ブラウザーの Harness Web UI は Client で、コンポーネントとインタラクティブな画面を担います。hello プラグインは Host のみ——ツールを登録し、結果の表示はチャットに任せます。UI を持つプラグインは Client エントリーを追加し、独自の inject と apply を宣言します。どちらでも、各エントリーは自分のランタイムで apply を実行し、アンインストール時には Context が登録済みのものをまとめて破棄します。

    DSH プラグインのライフサイクルスライド。LOAD・RUN・DISPOSE の各段階の下に HOST ENTRY と CLIENT ENTRY · OPTIONAL のチップ
    Host エントリーは必須、Client エントリーは任意。どちらも同じ 3 段階のライフサイクルを走ります。動画の 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/ の 3 点を押さえれば、どの 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 と検証済みの設定を受け取り、RPC 接続やツール登録といった永続的なリソースは ctx.effect で包みます。これによりアンインストール時に Harness がまとめて解放します。この数行が、ホストプラグインとフレームワークの間の必須インターフェースです。

    VS Code で開いた DeepSeek Harness プラグインの src/index.ts。ホスト側の import と、ハイライトされた name・inject・Config の契約エクスポート
    ホストファイルは @deepseek-ai/cordis の import に続き、3 つの契約エクスポート、そして apply で始まります。動画の 2:34 で見る
    DSH プラグインのコードに重ねた PLUGIN CONTRACT の解説カード。name はプラグイン識別、inject は依存の宣言、apply は登録とクリーンアップ
    公開契約は 4 つのエクスポートです——name、inject、Config、apply。動画の 2:55 で見る
  6. 6

    ユーザーが埋められる Config Schema を用意する

    src/config.ts でチュートリアルのプラグインは 1 つの Schema union で 2 つのトランスポート分岐を記述します。stdio(command・args・env)と streamable-http(url 必須、headers 任意)、さらに serverName(必須)、toolCallTimeoutMs(デフォルト 60000)、failOnStartupError(デフォルト false)といった共通フィールドです。開発者がインターフェースと Schema を実装し、ユーザーは値を埋めるだけ——リポジトリの examples/streamable-http.cordis.yml がまさにその記入用インスタンスです。

    DSH MCP プラグインの config.ts。stdio と streamable-http の 2 分岐を持つ Schema union、必須の url、デフォルト値付きのタイムアウトフィールド
    1 つの 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 にインストールした場合は、同じ add コマンドをその profile に対して実行してください。

    $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 で見る
    export DSH_HOME の後、npx @deepseek-ai/dsh plugin --profile web add で DSH プラグインを登録する zsh セッション
    add コマンドがプラグインを web profile にリンクします。他に設定するものはまだありません。動画の 5:40 で見る
  8. 8

    cordis.patch.yaml にインスタンスを宣言する

    パッケージを追加しただけでは不十分です。インスタンス化を指示する patch エントリーが必要です。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 を開きます。エージェントに 2048 を頼むと、モデルはプラグインが公開したリモートツールを呼び出し、Host が結果をプラグインがプリロードしたサンドボックス UI に送り、遊べる 2048 ボードがチャット内に表示されます。インストール・設定・検証、これで全工程完了です。

    DeepSeek Harness の Web UI(127.0.0.1:3080)が 2048 リクエストを処理する様子。dsh-system-prompt のコンテキスト注入と MCP アプリのツール呼び出し
    モデルはプラグインが公開したリモートツールを見つけ、自ら呼び出しを決めます。手動の配線は不要です。動画の 6:10 で見る
    リモート MCP ツールの呼び出し後、DeepSeek Harness のチャット内に New Game ボタン付きの遊べる 2048 ボードが表示される
    プラグインの Client エントリーがツールの結果をチャット内のインタラクティブ UI に変えました。動画の 6:15 で見る

DeepSeek Harness プラグイン作成の FAQ

初めてプラグインを書く開発者の本音の疑問。

一文でいうと、DeepSeek Harness プラグインとは?

Cordis の Context を受け取る関数です。依存するサービスを宣言し、その Context に新しい機能——モデルツール、サービス、UI——を登録し、アンインストール時には登録したものすべてをフレームワークが解放してくれます。

DSH プラグインに最低限必要なものは?

3 つです。ロード可能なモジュールエントリー、Context を受け取る apply(ctx) 関数、そして apply 内で登録する少なくとも 1 つの機能——チュートリアルの hello プラグインは ctx.tools.add でツールを 1 つ追加するだけです。エクスポートした Config Schema は任意で、プラグインが設定を取る場合にのみ必要です。

DeepSeek Harness プラグインを作るのに TypeScript は必須?

チュートリアルの参照プラグインは TypeScript 製です。export const name = 'mcp-apps'、inject の配列、Schema.object(...) はいずれも TypeScript のイディオムで、そのリポジトリをクローンするのが最速の始め方です。契約自体はモジュールのエクスポートにすぎないため概念は転用できますが、このページの例はすべて TypeScript です。

Harness は起動時にどうやってプラグインをロードする?

3 ステップです。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の新着プラグインを毎週お届け。スパムはありません。