clawhub: プレフィックスを使用してください。
要件
- Node 22.22.3+、Node 24.15+、または Node 25.9+、および
npmまたはpnpm。 - TypeScript ESM モジュール。
- リポジトリ内のバンドル済み Plugin を扱う場合は、リポジトリをクローンして
pnpm installを実行します。 OpenClaw はextensions/*ワークスペースパッケージから バンドル済み Plugin を検出するため、ソースチェックアウトでの Plugin 開発では pnpm のみを使用できます。
Plugin の形態を選択する
チャネル Plugin
OpenClaw をメッセージングプラットフォームに接続します。
プロバイダー Plugin
モデル、メディア、検索、取得、音声、またはリアルタイムプロバイダーを追加します。
CLI バックエンド Plugin
OpenClaw のモデルフォールバックを通じてローカル AI CLI を実行します。
ツール Plugin
エージェントツールを登録します。
クイックスタート
必須のエージェントツールを 1 つ登録して、最小構成のツール Plugin を構築します。これは 実用的な Plugin の最小構成であり、パッケージ、マニフェスト、エントリポイント、および ローカルでの検証を網羅します。1
パッケージメタデータを作成する
contracts.tools に含める必要があります。activation.onStartup は意図を持って設定してください。
この例では Gateway の起動時に読み込みます。ホストから信頼される Plugin サーフェスもマニフェストによって制限され、インストール済み
Plugin では明示的な宣言が必要です。api.registerAgentToolResultMiddleware(...) では
各対象ランタイムを contracts.agentToolResultMiddleware に列挙する必要があり、
api.registerTrustedToolPolicy(...) では各ポリシー ID を
contracts.trustedToolPolicies に含める必要があります。これらの宣言により、インストール時の
検査とランタイム登録の整合性が保たれます。すべてのマニフェストフィールドについては、Plugin マニフェストを参照してください。2
ツールを登録する
index.ts
definePluginEntry を使用します。チャネル Plugin では代わりに
openclaw/plugin-sdk/core の defineChannelPluginEntry を使用します。3
ランタイムをテストする
インストール済みまたは外部の Plugin では、読み込まれたランタイムを確認します。Plugin が CLI コマンドを登録する場合は、そのコマンドも実行して出力を確認します。
例:
openclaw demo-plugin ping。このリポジトリ内のバンドル済み Plugin では、OpenClaw は extensions/* ワークスペースから
ソースチェックアウトの Plugin パッケージを検出します。最も対象範囲の近い
テストを実行します。4
パッケージのインストールをテストする
パッケージとして公開可能な Plugin を公開する前に、ユーザーが利用するものと同じ
インストール形態をテストします。まずビルドステップを追加し、
openclaw.extensions などの
ランタイムエントリが ./dist/index.js のようなビルド済み JavaScript を参照するようにして、
npm pack にその dist/ 出力が含まれていることを確認します。TypeScript のソースエントリは、
ソースチェックアウトおよびローカル開発パス専用です。次に Plugin をパックし、npm-pack: を使用して tarball をインストールします。npm-pack: は OpenClaw が管理する Plugin ごとの npm プロジェクトを使用するため、
ソースチェックアウトのテストでは見逃す可能性のあるランタイム依存関係の誤りを検出します。これは
パッケージと依存関係の構成を検証するものであり、カタログに紐付けられた公式の信頼性を検証するものではありません。
ランタイムのインポートは dependencies または optionalDependencies に含める必要があります。
devDependencies のみに残された依存関係は、管理対象の
ランタイムプロジェクトにはインストールされません。公式または特権的な Plugin の動作に対する最終検証として、生のアーカイブやパスからのインストールを
使用しないでください。生のソースはローカルデバッグには有用ですが、
npm または ClawHub からのインストールと同じ依存関係パスを検証するものではありません。
Plugin が信頼済みの公式 Plugin ステータスに依存する場合は、カタログに裏付けられた
公式インストール、または公式の信頼性が記録される公開済みパッケージパスを通じた 2 つ目の検証を
追加してください。インストールルートと依存関係の所有権の詳細については、
Plugin の依存関係解決を参照してください。5
公開する
公開する前にパッケージを検証します。正規の ClawHub パッケージスニペットは
docs/snippets/plugin-publish/ にあります。6
インストールする
公開済みパッケージを ClawHub 経由でインストールします。
ツールの登録
ツールは必須または任意にできます。必須ツールは、Plugin が有効な場合は常に 使用できます。任意ツールでは、OpenClaw が所有元の Plugin ランタイムを 読み込む前に、ユーザーによる明示的なオプトインが必要です。 ツールファクトリーは、deliveryContext、利用可能な場合はアクティブなプラットフォーム会話の
nativeChannelId、および requesterSenderId を含む、信頼済みのランタイムコンテキストを受け取ります。
outputSchema は任意です。コードモードとツール検索で使用される
構造化された details 値を記述します。カタログ呼び出しは実行前に無効なスキーマを拒否し、
ツールフックの後に最終値を検証します。安定した JSON 結果を持たないツールでは省略してください。
完全な契約については、ツール Pluginを参照してください。
api.registerTool(...) で登録するすべてのツールは、Plugin マニフェストでも
宣言する必要があります。
tools.allow でオプトインします。
name がない場合、execute が関数でない場合、またはツール記述子に parameters
オブジェクトがない場合です。
ツールファクトリーは、ランタイムから提供されるコンテキストオブジェクトを受け取ります。ツールが現在の
ターンでアクティブなモデルに応じてログ記録、表示、または動作の調整を行う必要がある場合は、ctx.activeModel
を使用します。これには provider、modelId、および modelRef が含まれることがあります。これは
情報提供用のランタイムメタデータとして扱い、ローカルオペレーター、インストール済み Plugin コード、
または変更された OpenClaw ランタイムに対するセキュリティ境界として扱わないでください。機密性の高い
ローカルツールでは、引き続き Plugin またはオペレーターによる明示的なオプトインを必須とし、
アクティブモデルのメタデータがない、または適切でない場合は安全側に失敗させる必要があります。
マニフェストは所有権と検出方法を宣言しますが、実行時には引き続き登録済みの
稼働中のツール実装が呼び出されます。OpenClaw がツールを明示的に許可リストへ追加するまで
その Plugin ランタイムを読み込まずに済むように、toolMetadata.<tool>.optional: true と
api.registerTool(..., { optional: true }) の整合性を保ってください。
インポート規則
目的別の SDK サブパスからインポートします。api.ts や
runtime-api.ts などのローカルバレルファイルを使用します。自身の Plugin を
SDK パス経由でインポートしないでください。プロバイダー固有のヘルパーは、
その境界が真に汎用的でない限り、プロバイダーパッケージ内に保持する必要があります。
カスタム Gateway RPC メソッドは高度なエントリポイントです。Plugin 固有の
プレフィックスを使用してください。config.*、exec.approvals.*、operator.admin.*、wizard.*、
update.* などのコア管理名前空間は予約済みであり、
operator.admin として解決されます。
openclaw/plugin-sdk/gateway-method-runtime ブリッジは、contracts.gatewayMethodDispatch: ["authenticated-request"] を宣言する Plugin HTTP
ルート用に予約されています。
完全なインポートマップについては、Plugin SDK の概要を参照してください。
OpenClaw SDK の互換性フィールドには TypeScript の @deprecated アノテーションが付いており、
エディターでは移行に関する警告として表示されます。ビルド時にこれを強制するには、
@typescript-eslint/no-deprecated のような
型情報を利用するルールを有効にしてください。
Oxlint は型情報を利用しないため、これらのアノテーションを強制できません。
提出前チェックリスト
package.json に正しい
openclaw メタデータがあるopenclaw.plugin.json マニフェストが存在し、有効である
エントリポイントが
defineChannelPluginEntry または definePluginEntry を使用しているすべてのインポートが対象を絞った
plugin-sdk/<subpath> パスを使用している内部インポートが SDK の自己インポートではなく、ローカルモジュールを使用している
テストが成功する(
pnpm test <bundled-plugin-root>/my-plugin/)pnpm check が成功する(リポジトリ内 Plugin)ベータリリースに対するテスト
- openclaw/openclaw のリリース(
Watch>Releases)をウォッチしてください。ベータタグはv2026.3.N-beta.1のような形式です。リリースのお知らせについては、X で @openclaw をフォローすることもできます。 - ベータタグが公開されたら、できるだけ早く Plugin をテストしてください。安定版までの猶予は通常、わずか数時間です。
- テスト後、
plugin-forumDiscord チャンネル(discord.gg/clawd)にある Plugin のスレッドへ、all goodまたは問題が発生した内容を投稿してください。スレッドがまだない場合は作成してください。 - 問題が発生した場合は、
Beta blocker: <plugin-name> - <summary>というタイトルの Issue を作成または更新し、beta-blockerラベルを付けてください。スレッドに Issue へのリンクを記載してください。 mainに、fix(<plugin-id>): beta blocker - <summary>というタイトルの PR を作成し、PR と Discord スレッドの両方に Issue へのリンクを記載してください。コントリビューターは PR にラベルを付けられないため、このタイトルがメンテナーと自動化システムに対する PR 側の合図になります。PR があるブロッカーはマージされますが、PR がないブロッカーがあってもそのままリリースされる可能性があります。- 連絡がなければ問題なしと見なされます。この期間を逃した場合、通常は修正が次のサイクルで取り込まれます。
次のステップ
チャンネル Plugin
メッセージングチャンネル Plugin を構築する
プロバイダー Plugin
モデルプロバイダー Plugin を構築する
CLI バックエンド Plugin
ローカル AI CLI バックエンドを登録する
SDK の概要
インポートマップと登録 API のリファレンス
ランタイムヘルパー
api.runtime を介した TTS、検索、サブエージェント
テスト
テスト用ユーティリティとパターン
Plugin マニフェスト
完全なマニフェストスキーマのリファレンス