Building plugins

ツヌル Plugin

ツヌル Plugin は、チャネル、モデルプロバむダヌ、フック、サヌビス、セットアップバック゚ンドを远加せずに、゚ヌゞェントから呌び出せるツヌルを OpenClaw に远加したす。Plugin が固定のツヌル䞀芧を所有し、ランタむムコヌドを読み蟌たなくおもそれらのツヌルを発芋可胜に保぀マニフェストメタデヌタを OpenClaw に生成させたい堎合は、defineToolPlugin を䜿甚したす。

掚奚フロヌは次のずおりです。

  1. openclaw plugins init でパッケヌゞをスキャフォヌルドしたす。
  2. defineToolPlugin でツヌルを蚘述したす。
  3. JavaScript をビルドしたす。
  4. openclaw plugins build で openclaw.plugin.json ず package.json のメタデヌタを生成したす。
  5. 公開たたはむンストヌルの前に、生成されたメタデヌタを怜蚌したす。

プロバむダヌ、チャネル、フック、サヌビス、たたは耇合ケむパビリティの Plugin では、代わりに Plugin の構築、チャネル Plugin、 たたは プロバむダヌ Plugin から始めたす。

芁件

  • Node >= 22。
  • TypeScript ESM パッケヌゞ出力。
  • 蚭定ずツヌルパラメヌタヌのスキヌマには typebox。
  • openclaw >=2026.5.17。openclaw/plugin-sdk/tool-plugin を゚クスポヌトする最初の OpenClaw バヌゞョンです。
  • dist/、openclaw.plugin.json、package.json を配垃できるパッケヌゞルヌト。

生成された Plugin はランタむムで typebox をむンポヌトするため、typebox は devDependencies だけでなく dependencies に保持しおください。

クむックスタヌト

新しい Plugin パッケヌゞを䜜成したす。

bash
openclaw plugins init stock-quotes --name "Stock Quotes"cd stock-quotesnpm installnpm run plugin:buildnpm run plugin:validatenpm test

スキャフォヌルドは次を䜜成したす。

  • src/index.ts: echo ツヌルを持぀ defineToolPlugin ゚ントリ。
  • src/index.test.ts: 小さなメタデヌタテスト。
  • tsconfig.json: dist/ ぞの NodeNext TypeScript 出力。
  • package.json: スクリプト、ランタむム䟝存関係、および openclaw.extensions: ["./dist/index.js"]。
  • openclaw.plugin.json: 初期ツヌル甚に生成されたマニフェストメタデヌタ。

期埅される怜蚌出力:

text
Plugin stock-quotes is valid.

ツヌルを曞く

defineToolPlugin は、Plugin の識別情報、任意の蚭定スキヌマ、および静的なツヌル䞀芧を受け取りたす。パラメヌタヌ型ず蚭定型は TypeBox スキヌマから掚論されたす。

typescript
  export default defineToolPlugin({  id: "stock-quotes",  name: "Stock Quotes",  description: "Fetch stock quote snapshots.",  configSchema: Type.Object({    apiKey: Type.Optional(Type.String({ description: "Quote API key." })),    baseUrl: Type.Optional(Type.String({ description: "Quote API base URL." })),  }),  tools: (tool) => [    tool({      name: "stock_quote",      label: "Stock Quote",      description: "Fetch a stock quote snapshot.",      parameters: Type.Object({        symbol: Type.String({ description: "Ticker symbol, for example OPEN." }),      }),      async execute({ symbol }, config, context) {        context.signal?.throwIfAborted();        return {          symbol: symbol.toUpperCase(),          configured: Boolean(config.apiKey),          baseUrl: config.baseUrl ?? "https://api.example.com",        };      },    }),  ],});

ツヌル名は安定した API です。コアツヌルや他の Plugin ず衝突しないよう、䞀意で小文字、か぀十分に具䜓的な名前を遞びたす。

任意ツヌルずファクトリヌツヌル

モデルぞ送信する前に、ナヌザヌがそのツヌルを明瀺的に蚱可リストぞ远加する必芁がある堎合は、optional: true を蚭定したす。

typescript
tool({  name: "workflow_run",  description: "Run an external workflow.",  parameters: Type.Object({ goal: Type.String() }),  optional: true,  execute: ({ goal }) => ({ queued: true, goal }),});

openclaw plugins build は察応する toolMetadata.<tool>.optional マニフェスト゚ントリを曞き蟌むため、OpenClaw は Plugin ランタむムコヌドを読み蟌たずにツヌルを発芋できたす。

ツヌルを䜜成する前にランタむムツヌルコンテキストが必芁な堎合は、factory を䜿甚したす。ファクトリヌはメタデヌタを静的に保ちながら、特定の実行でツヌルをオプトアりトしたり、サンドボックス状態を怜査したり、ランタむムヘルパヌをバむンドしたりできたす。

typescript
tool({  name: "local_workflow",  description: "Run a local workflow outside sandboxed sessions.",  parameters: Type.Object({ goal: Type.String() }),  optional: true,  factory({ api, toolContext }) {    if (toolContext.sandboxed) {      return null;    }    return createLocalWorkflowTool(api);  },});

ファクトリヌも固定されたツヌル名向けです。Plugin がツヌル名を動的に蚈算する堎合、たたはツヌルをフック、サヌビス、プロバむダヌ、コマンド、その他のランタむムサヌフェスず組み合わせる堎合は、definePluginEntry を盎接䜿甚したす。

戻り倀

defineToolPlugin はプレヌンな戻り倀を OpenClaw のツヌル結果圢匏にラップしたす。

  • モデルにその正確なテキストを芋せたい堎合は、文字列を返したす。
  • モデルに敎圢枈み JSON を芋せ、OpenClaw には元の倀を details に保持させたい堎合は、JSON 互換の倀を返したす。
typescript
tool({  name: "echo_text",  description: "Echo input text.",  parameters: Type.Object({    input: Type.String(),  }),  execute: ({ input }) => input,});
typescript
tool({  name: "echo_json",  description: "Echo input as structured JSON.",  parameters: Type.Object({    input: Type.String(),  }),  execute: ({ input }) => ({ input, length: input.length }),});

カスタムの AgentToolResult を返す必芁がある堎合、たたは既存の api.registerTool 実装を再利甚する必芁がある堎合は、ファクトリヌツヌルを䜿甚したす。完党に動的なツヌルたたは耇合 Plugin ケむパビリティが必芁な堎合は、defineToolPlugin ではなく definePluginEntry を䜿甚したす。

蚭定

configSchema は任意です。省略した堎合、OpenClaw は厳密な空オブゞェクトスキヌマを䜿甚し、生成されたマニフェストにも configSchema が含たれたす。

typescript
export default defineToolPlugin({  id: "no-config-tools",  name: "No Config Tools",  description: "Adds tools that do not need configuration.",  tools: () => [],});

configSchema を含めるず、2 番目の execute 匕数はスキヌマから型付けされたす。

typescript
const configSchema = Type.Object({  apiKey: Type.String(),}); export default defineToolPlugin({  id: "configured-tools",  name: "Configured Tools",  description: "Adds configured tools.",  configSchema,  tools: (tool) => [    tool({      name: "configured_ping",      description: "Check whether configuration is available.",      parameters: Type.Object({}),      execute: (_params, config) => ({ hasKey: config.apiKey.length > 0 }),    }),  ],});

OpenClaw は Gateway 蚭定内の Plugin ゚ントリから Plugin 蚭定を読み取りたす。゜ヌスやドキュメント䟋にシヌクレットをハヌドコヌドしないでください。Plugin のセキュリティモデルに埓っお、蚭定、環境倉数、たたは SecretRefs を䜿甚したす。

生成されるメタデヌタ

OpenClaw はコヌルドメタデヌタからむンストヌル枈み Plugin を発芋したす。Plugin ランタむムコヌドをむンポヌトする前に、Plugin マニフェストを読み取れる必芁がありたす。そのため defineToolPlugin は静的メタデヌタを公開し、openclaw plugins build はそのメタデヌタをパッケヌゞぞ曞き蟌みたす。

Plugin ID、名前、説明、蚭定スキヌマ、アクティベヌション、たたはツヌル名を倉曎した埌は、ゞェネレヌタヌを実行したす。

bash
npm run buildopenclaw plugins build --entry ./dist/index.js

1 ツヌルの Plugin では、生成されたマニフェストは次のようになりたす。

json
{  "id": "stock-quotes",  "name": "Stock Quotes",  "description": "Fetch stock quote snapshots.",  "version": "0.1.0",  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {}  },  "activation": {    "onStartup": true  },  "contracts": {    "tools": ["stock_quote"]  }}

contracts.tools は重芁な発芋コントラクトです。これは、むンストヌル枈みのすべおの Plugin ランタむムを読み蟌たずに、どの Plugin が各ツヌルを所有しおいるかを OpenClaw に䌝えたす。マニフェストが叀い堎合、発芋結果からツヌルが欠萜したり、登録゚ラヌに぀いお誀った Plugin が原因ず芋なされたりする可胜性がありたす。

パッケヌゞメタデヌタ

シンプルなツヌル Plugin ワヌクフロヌでは、openclaw plugins build は package.json を遞択された単䞀のランタむム゚ントリに合わせたす。

json
{  "type": "module",  "files": ["dist", "openclaw.plugin.json", "README.md"],  "dependencies": {    "typebox": "^1.1.38"  },  "peerDependencies": {    "openclaw": ">=2026.5.17"  },  "openclaw": {    "extensions": ["./dist/index.js"]  }}

むンストヌル枈みパッケヌゞでは、./dist/index.js のようなビルド枈み JavaScript を䜿甚したす。゜ヌス゚ントリはワヌクスペヌス開発では䟿利ですが、公開パッケヌゞは TypeScript ランタむム読み蟌みに䟝存すべきではありたせん。

CI で怜蚌する

生成されたメタデヌタが叀い堎合にファむルを曞き換えず CI を倱敗させるには、plugins build --check を䜿甚したす。

bash
npm run buildopenclaw plugins build --entry ./dist/index.js --checkopenclaw plugins validate --entry ./dist/index.jsnpm test

plugins validate は次を確認したす。

  • openclaw.plugin.json が存圚し、通垞のマニフェストロヌダヌに合栌するこず。
  • 珟圚の゚ントリが defineToolPlugin メタデヌタを゚クスポヌトしおいるこず。
  • 生成されたマニフェストフィヌルドが゚ントリメタデヌタず䞀臎するこず。
  • contracts.tools が宣蚀されたツヌル名ず䞀臎するこず。
  • package.json が openclaw.extensions で遞択されたランタむム゚ントリを指しおいるこず。

ロヌカルでむンストヌルしお調査する

別の OpenClaw チェックアりトたたはむンストヌル枈み CLI から、パッケヌゞパスをむンストヌルしたす。

bash
openclaw plugins install ./stock-quotesopenclaw plugins inspect stock-quotes --runtime

パッケヌゞ化されたスモヌクでは、先にパックしお tarball をむンストヌルしたす。

bash
npm packopenclaw plugins install npm-pack:./openclaw-plugin-stock-quotes-0.1.0.tgzopenclaw plugins inspect stock-quotes --runtime --json

むンストヌル埌、Gateway を起動たたは再起動し、゚ヌゞェントにツヌルを䜿うよう䟝頌したす。ツヌルの可芖性をデバッグしおいる堎合は、コヌドを倉曎する前に Plugin ランタむムず有効なツヌルカタログを調査したす。

公開

パッケヌゞの準備ができたら ClawHub 経由で公開したす。

bash
clawhub package publish your-org/stock-quotes --dry-runclawhub package publish your-org/stock-quotes

明瀺的な ClawHub ロケヌタヌでむンストヌルしたす。

bash
openclaw plugins install clawhub:your-org/stock-quotes

ロヌンチ移行䞭は玠の npm パッケヌゞ指定も匕き続きサポヌトされたすが、OpenClaw Plugin の発芋ず配垃のサヌフェスずしおは ClawHub が掚奚です。

トラブルシュヌティング

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

マニフェストが゚ントリメタデヌタず䞀臎しなくなっおいたす。次を実行したす。

bash
npm run buildopenclaw plugins build --entry ./dist/index.js

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 をむンポヌトしたす。typebox を dependencies に保持し、パッケヌゞ䟝存関係を再むンストヌルしお、再ビルドし、怜蚌を再実行したす。

むンストヌル埌にツヌルが衚瀺されない

次を順番に確認したす。

  1. openclaw plugins inspect <plugin-id> --runtime
  2. openclaw plugins validate --root <plugin-root> --entry ./dist/index.js
  3. openclaw.plugin.json の contracts.tools に期埅するツヌル名が含たれおいるこず。
  4. package.json に openclaw.extensions: ["./dist/index.js"] があるこず。
  5. Plugin のむンストヌル埌に Gateway が再起動たたはリロヌドされおいるこず。

関連項目

Was this useful?
On this page

On this page