このページの内容
このページの内容
Building plugins
Plugin の構築
Plugin はコアを変更せずに OpenClaw を拡張します。Plugin はメッセージング チャネル、モデルプロバイダー、ローカル CLI バックエンド、エージェントツール、フック、メディアプロバイダー、 または Plugin が所有する別の機能を追加できます。
外部 Plugin を OpenClaw リポジトリに追加する必要はありません。パッケージを ClawHub に公開すると、ユーザーは次のコマンドでインストールできます。
ローンチ移行期間中は、プレフィックスなしのパッケージ指定も引き続き npm からインストールされます。ClawHub で解決する場合は
clawhub: プレフィックスを使用してください。
要件
- Node 22.22.3+、Node 24.15+、または Node 25.9+、および
npmまたはpnpm。 - TypeScript ESM モジュール。
- リポジトリ内のバンドル済み Plugin を扱う場合は、リポジトリをクローンして
pnpm installを実行します。 OpenClaw はextensions/*ワークスペースパッケージから バンドル済み Plugin を検出するため、ソースチェックアウトでの Plugin 開発では pnpm のみを使用できます。
Plugin の形態を選択する
OpenClaw をメッセージングプラットフォームに接続します。
モデル、メディア、検索、取得、音声、またはリアルタイムプロバイダーを追加します。
OpenClaw のモデルフォールバックを通じてローカル AI CLI を実行します。
エージェントツールを登録します。
クイックスタート
必須のエージェントツールを 1 つ登録して、最小構成のツール Plugin を構築します。これは 実用的な Plugin の最小構成であり、パッケージ、マニフェスト、エントリポイント、および ローカルでの検証を網羅します。
パッケージメタデータを作成する
公開する外部 Plugin のランタイムエントリは、ビルド済みの JavaScript ファイルを参照する必要があります。エントリポイントの完全な契約については、SDK エントリポイントを 参照してください。
設定がない場合でも、すべての Plugin にマニフェストが必要です。OpenClaw が
すべての Plugin ランタイムを即時に読み込むことなく所有者を検出できるように、ランタイムツールを
contracts.tools に含める必要があります。activation.onStartup は意図を持って設定してください。
この例では Gateway の起動時に読み込みます。
ホストから信頼される Plugin サーフェスもマニフェストによって制限され、インストール済み
Plugin では明示的な宣言が必要です。api.registerAgentToolResultMiddleware(...) では
各対象ランタイムを contracts.agentToolResultMiddleware に列挙する必要があり、
api.registerTrustedToolPolicy(...) では各ポリシー ID を
contracts.trustedToolPolicies に含める必要があります。これらの宣言により、インストール時の
検査とランタイム登録の整合性が保たれます。
すべてのマニフェストフィールドについては、Plugin マニフェストを参照してください。
ツールを登録する
チャネル以外の Plugin では definePluginEntry を使用します。チャネル Plugin では代わりに
openclaw/plugin-sdk/core の defineChannelPluginEntry を使用します。
ランタイムをテストする
インストール済みまたは外部の Plugin では、読み込まれたランタイムを確認します。
Plugin が CLI コマンドを登録する場合は、そのコマンドも実行して出力を確認します。
例: openclaw demo-plugin ping。
このリポジトリ内のバンドル済み Plugin では、OpenClaw は extensions/* ワークスペースから
ソースチェックアウトの Plugin パッケージを検出します。最も対象範囲の近い
テストを実行します。
パッケージのインストールをテストする
パッケージとして公開可能な 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 の依存関係解決を参照してください。
公開する
公開する前にパッケージを検証します。
正規の ClawHub パッケージスニペットは docs/snippets/plugin-publish/ にあります。
インストールする
公開済みパッケージを ClawHub 経由でインストールします。
ツールの登録
ツールは必須または任意にできます。必須ツールは、Plugin が有効な場合は常に 使用できます。任意ツールでは、OpenClaw が所有元の Plugin ランタイムを 読み込む前に、ユーザーによる明示的なオプトインが必要です。
ツールファクトリーは、deliveryContext、利用可能な場合はアクティブなプラットフォーム会話の
nativeChannelId、および requesterSenderId を含む、信頼済みのランタイムコンテキストを受け取ります。
outputSchema は任意です。コードモードとツール検索で使用される
構造化された details 値を記述します。カタログ呼び出しは実行前に無効なスキーマを拒否し、
ツールフックの後に最終値を検証します。安定した JSON 結果を持たないツールでは省略してください。
完全な契約については、ツール Pluginを参照してください。
api.registerTool(...) で登録するすべてのツールは、Plugin マニフェストでも
宣言する必要があります。
ユーザーは tools.allow でオプトインします。
任意ツールは、ツールをモデルに公開するかどうかを制御します。モデルがツールまたはフックを選択した後、 アクションを実行する前に承認を求める必要がある場合は、 Plugin 権限リクエストを使用してください。
副作用、一般的でないバイナリ、またはデフォルトで公開すべきでない機能には、
任意ツールを使用します。ツール名はコアツール名と競合してはなりません。競合した場合はスキップされ、
Plugin 診断で報告されます。不正な登録も同じ方法でスキップされ、報告されます。たとえば、空でない
name がない場合、execute が関数でない場合、またはツール記述子に parameters
オブジェクトがない場合です。
ツールファクトリーは、ランタイムから提供されるコンテキストオブジェクトを受け取ります。ツールが現在の
ターンでアクティブなモデルに応じてログ記録、表示、または動作の調整を行う必要がある場合は、ctx.activeModel
を使用します。これには provider、modelId、および modelRef が含まれることがあります。これは
情報提供用のランタイムメタデータとして扱い、ローカルオペレーター、インストール済み Plugin コード、
または変更された OpenClaw ランタイムに対するセキュリティ境界として扱わないでください。機密性の高い
ローカルツールでは、引き続き Plugin またはオペレーターによる明示的なオプトインを必須とし、
アクティブモデルのメタデータがない、または適切でない場合は安全側に失敗させる必要があります。
マニフェストは所有権と検出方法を宣言しますが、実行時には引き続き登録済みの
稼働中のツール実装が呼び出されます。OpenClaw がツールを明示的に許可リストへ追加するまで
その Plugin ランタイムを読み込まずに済むように、toolMetadata.<tool>.optional: true と
api.registerTool(..., { optional: true }) の整合性を保ってください。
インポート規則
目的別の SDK サブパスからインポートします。
Plugin パッケージ内では、内部インポートに 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 は型情報を利用しないため、これらのアノテーションを強制できません。
提出前チェックリスト
ベータリリースに対するテスト
- 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 を構築する
ローカル AI CLI バックエンドを登録する
インポートマップと登録 API のリファレンス
api.runtime を介した TTS、検索、サブエージェント
テスト用ユーティリティとパターン
完全なマニフェストスキーマのリファレンス