defineToolPlugin は、エージェントが呼び出せるツールのみを追加する Plugin を構築します。チャネル、モデルプロバイダー、フック、サービス、セットアップバックエンドは追加しません。Plugin のランタイムコードを読み込まずに OpenClaw がツールを検出するために必要なマニフェストメタデータを生成します。
プロバイダー、チャネル、フック、サービス、または複数の機能を持つ Plugin については、代わりに
Plugin の構築、チャネル Plugin、
またはプロバイダー Pluginから始めてください。
要件
- Node 22.22.3+、Node 24.15+、または Node 25.9+。
- TypeScript ESM パッケージ出力。
dependencies内のtypebox(devDependenciesだけでは不可。生成された Plugin が実行時にインポートします)。openclaw/plugin-sdk/tool-pluginをエクスポートする最初のバージョンであるopenclaw >=2026.5.17。dist/、openclaw.plugin.json、およびpackage.jsonを同梱するパッケージルート。
クイックスタート
plugins init は以下をスキャフォールドします。
npm run plugin:build は npm run build(tsc)を実行してから
openclaw plugins build --entry ./dist/index.js を実行します。npm run plugin:validate は
再ビルドして openclaw plugins validate --entry ./dist/index.js を実行します。
検証に成功すると、次のように出力されます。
openclaw plugins init <id> のオプション:
ツールを作成する
defineToolPlugin は、Plugin の識別情報、オプションの設定スキーマ、静的なツール一覧を受け取ります。パラメーター型と設定型は TypeBox スキーマから推論されます。
オプションツールとファクトリーツール
モデルに送信する前にユーザーがツールを明示的に許可リストへ追加する必要がある場合は、optional: true を設定します。openclaw plugins build は対応する
toolMetadata.<tool>.optional マニフェストエントリを書き込むため、OpenClaw は Plugin のランタイムコードを読み込まずに、そのツールがオプションであることを認識できます。
factory を使用します。具体的なツールは実行時に構築されますが、メタデータは静的なままです。
definePluginEntry を直接使用します。
戻り値
defineToolPlugin は、通常の戻り値を OpenClaw のツール結果形式でラップします。
- モデルにそのままのテキストを表示する場合は、文字列を返します。
- モデルに整形済み JSON を表示し、OpenClaw が元の値を
detailsに保持する場合は、JSON 互換の値を返します。
AgentToolResult が必要な場合や、既存の api.registerTool 実装を再利用する場合は、ファクトリーツールを使用します。
出力コントラクト
ツールが安定した JSON 互換データを返す場合は、outputSchema を追加します。これは content 内の整形済みテキストではなく、AgentToolResult.details に保存された元の値を記述します。
details の値を検証してから、ブリッジを通じて返します。
無効なスキーマではツールを実行できず、結果が一致しない場合は完了済みの呼び出しが失敗します。構造化されたエラーバリアントを含め、例外をスローしないすべての結果バリアントを含めてください。結果が安定していない場合は、スキーマを省略してください。信頼済みの出力メタデータはモデルから参照可能になる場合があるため、スキーマの説明にシークレットや機密値を含めないでください。
完全でコンパクトな出力ヒントが必要な場合は、オブジェクトの各階層で { additionalProperties: false } を使用してください。オープンまたは切り詰められたスキーマも tools.describe(...) を通じて利用できますが、完全なクイックインデックスコントラクトとしては提示されません。
ファクトリーツールは、返す具体的な AnyAgentTool に outputSchema を宣言します。静的な tool({ factory }) 宣言は、ランタイムツールと乖離する可能性があるため、個別の出力スキーマを受け付けません。
設定
configSchema はオプションです。省略すると OpenClaw は厳密な空オブジェクトスキーマを適用し、生成されたマニフェストには引き続き configSchema が含まれます。
configSchema がある場合、2 番目の execute 引数の型はそこから設定されます。
生成されるメタデータ
OpenClaw は Plugin のランタイムコードをインポートする前に、Plugin マニフェストを読み取る必要があります。defineToolPlugin はこのための静的メタデータを公開し、
openclaw plugins build はそれをパッケージに書き込みます。Plugin の ID、名前、説明、設定スキーマ、アクティベーション、またはツール名を変更した後は、ジェネレーターを再実行してください。
contracts.tools は重要な検出コントラクトです。インストール済みのすべての Plugin のランタイムを読み込むことなく、各ツールを所有する Plugin を OpenClaw に伝えます。マニフェストが古いと、ツールが検出対象から漏れたり、登録エラーが誤った Plugin のものと判断されたりする可能性があります。
パッケージメタデータ
openclaw plugins build は、package.json も選択されたランタイムエントリに合わせます。
./dist/index.js)を同梱してください。
ソースエントリはワークスペース内のローカル開発でのみ機能します。
CI で検証する
plugins build --check は、生成済みメタデータが古い場合、ファイルを書き換えずに失敗します。
@deprecated アノテーションがあり、エディターでは移行警告として表示されます。CI でこれらを強制するには、
@typescript-eslint/no-deprecated
などの型情報を使用するルールを有効にしてください。
Oxlint は型情報を使用しないため、これらのアノテーションを強制できません。そのため、生成される
plugins init スキャフォールドには非推奨 API 用の lint 設定は追加されません。
plugins validate は以下を確認します。
openclaw.plugin.jsonが存在し、通常のマニフェストローダーを通過します。- 現在のエントリは
defineToolPluginメタデータをエクスポートします。 - 生成されたマニフェストフィールドがエントリメタデータと一致します。
contracts.toolsが宣言されたツール名と一致します。package.jsonはopenclaw.extensionsが選択したランタイムエントリを指すようにします。
ローカルでインストールして確認する
別の OpenClaw チェックアウトまたはインストール済み CLI から、パッケージパスをインストールします。公開
パッケージの準備ができたら、ClawHub を通じて公開します。clawhub package publish
はソースとして、ローカルフォルダー、GitHub リポジトリ(owner/repo[@ref])、または
tarball URL を受け取ります。
トラブルシューティング
plugin entry not found: ./dist/index.js
選択したエントリファイルが存在しません。npm run build を実行してから、
openclaw plugins build --entry ./dist/index.js または
openclaw plugins validate --entry ./dist/index.js を再実行してください。
plugin entry does not expose defineToolPlugin metadata
エントリが defineToolPlugin によって作成された値をエクスポートしていません。モジュールの
デフォルトエクスポートが defineToolPlugin(...) の結果であることを確認するか、
--entry で正しいエントリを渡してください。
openclaw.plugin.json generated metadata is stale
マニフェストがエントリメタデータと一致しなくなっています。次を実行してください。
openclaw.plugin.json と package.json の両方の変更をコミットしてください。
package.json openclaw.extensions must include ./dist/index.js
パッケージメタデータが別のランタイムエントリを指しています。ジェネレーターが
パッケージメタデータをリリース対象のエントリに合わせるように、
openclaw plugins build --entry ./dist/index.js を実行してください。
Cannot find package 'typebox'
ビルドされた Plugin が実行時に typebox をインポートしています。これを dependencies に残したまま、
再インストールと再ビルドを行い、検証を再実行してください。
インストール後にツールが表示されない
次の項目を順番に確認してください。openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsonに、想定されるツール名を含むcontracts.toolsがあります。package.jsonにopenclaw.extensions: ["./dist/index.js"]があります。- Plugin のインストール後に Gateway が再起動または再読み込みされています。