メインコンテンツへスキップ
Plugin のパッケージ化(package.json メタデータ)、マニフェスト(openclaw.plugin.json)、セットアップエントリ、構成スキーマのリファレンス。
ウォークスルーを探していますか? ハウツーガイドでは、文脈に沿ってパッケージ化を扱っています: チャネル Pluginプロバイダー Plugin

パッケージメタデータ

package.json には、Plugin システムにその Plugin が提供する内容を伝える openclaw フィールドが必要です。
{
  "name": "@myorg/openclaw-my-channel",
  "version": "1.0.0",
  "type": "module",
  "openclaw": {
    "extensions": ["./index.ts"],
    "setupEntry": "./setup-entry.ts",
    "channel": {
      "id": "my-channel",
      "label": "My Channel",
      "blurb": "Short description of the channel."
    }
  }
}
ClawHub で外部公開するには compatbuild が必要です。正規の公開スニペットは docs/snippets/plugin-publish/ にあります。

openclaw フィールド

extensions
string[]
エントリポイントファイル(パッケージルートからの相対パス)。ワークスペースと git checkout 開発で有効なソースエントリです。
runtimeExtensions
string[]
extensions に対応するビルド済み JavaScript ピア。OpenClaw がインストール済み npm パッケージを読み込む場合に優先されます。ソース/ビルド済みの解決順序については SDK エントリポイント を参照してください。
setupEntry
string
軽量なセットアップ専用エントリ(任意)。
runtimeSetupEntry
string
setupEntry に対応するビルド済み JavaScript ピア。setupEntry も設定されている必要があります。
plugin
object
{ id, label } のフォールバック Plugin アイデンティティ。Plugin に id または label を導出できるチャネル/プロバイダーメタデータがない場合に使用されます。
channel
object
セットアップ、ピッカー、クイックスタート、ステータス表示面向けのチャネルカタログメタデータ。
install
object
インストールヒント: npmSpeclocalPathdefaultChoiceminHostVersionexpectedIntegrityallowInvalidConfigRecoveryrequiredPlatformPackages
startup
object
起動動作フラグ。
compat
object
この Plugin がサポートする pluginApi バージョン範囲。外部 ClawHub 公開では必須です。
プロバイダー id(providers: string[])はパッケージメタデータではなく、マニフェストメタデータです。ここではなく openclaw.plugin.json で宣言してください — Plugin マニフェスト を参照してください。

openclaw.channel

openclaw.channel は、ランタイムの読み込み前にチャネル検出とセットアップ表示面で使う軽量なパッケージメタデータです。
フィールド意味
idstring正規のチャネル id。
labelstring主要なチャネルラベル。
selectionLabelstringlabel と異なるべき場合のピッカー/セットアップラベル。
detailLabelstringよりリッチなチャネルカタログとステータス表示面向けの補助詳細ラベル。
docsPathstringセットアップと選択リンク向けのドキュメントパス。
docsLabelstringチャネル id と異なるべき場合にドキュメントリンクで使用される上書きラベル。
blurbstring短いオンボーディング/カタログ説明。
ordernumberチャネルカタログでの並び順。
aliasesstring[]チャネル選択用の追加検索エイリアス。
preferOverstring[]このチャネルが優先されるべき、優先度の低い Plugin/チャネル id。
systemImagestringチャネル UI カタログ向けの任意のアイコン/システム画像名。
selectionDocsPrefixstring選択表示面のドキュメントリンク前の接頭テキスト。
selectionDocsOmitLabelboolean選択コピー内で、ラベル付きドキュメントリンクではなくドキュメントパスを直接表示します。
selectionExtrasstring[]選択コピーに追加される短い文字列。
markdownCapableboolean送信フォーマット判断のために、そのチャネルが Markdown 対応であることを示します。
exposureobjectセットアップ、構成済み一覧、ドキュメント表示面向けのチャネル可視性制御。
quickstartAllowFrombooleanこのチャネルを標準のクイックスタート allowFrom セットアップフローに参加させます。
forceAccountBindingbooleanアカウントが 1 つしか存在しない場合でも明示的なアカウント紐付けを要求します。
preferSessionLookupForAnnounceTargetbooleanこのチャネルの告知ターゲット解決時にセッション検索を優先します。
例:
{
  "openclaw": {
    "channel": {
      "id": "my-channel",
      "label": "My Channel",
      "selectionLabel": "My Channel (self-hosted)",
      "detailLabel": "My Channel Bot",
      "docsPath": "/channels/my-channel",
      "docsLabel": "my-channel",
      "blurb": "Webhook-based self-hosted chat integration.",
      "order": 80,
      "aliases": ["mc"],
      "preferOver": ["my-channel-legacy"],
      "selectionDocsPrefix": "Guide:",
      "selectionExtras": ["Markdown"],
      "markdownCapable": true,
      "exposure": {
        "configured": true,
        "setup": true,
        "docs": true
      },
      "quickstartAllowFrom": true
    }
  }
}
exposure は以下をサポートします。
  • configured: 構成済み/ステータス形式の一覧表示面にチャネルを含める
  • setup: 対話型のセットアップ/構成ピッカーにチャネルを含める
  • docs: ドキュメント/ナビゲーション表示面でチャネルを公開向けとしてマークする
showConfiguredshowInSetup はレガシーエイリアスとして引き続きサポートされます。exposure を優先してください。

openclaw.install

openclaw.install はパッケージメタデータであり、マニフェストメタデータではありません。
フィールド意味
clawhubSpecstringインストール/更新とオンボーディングのオンデマンドインストールフロー向けの正規 ClawHub spec。
npmSpecstringインストール/更新のフォールバックフロー向けの正規 npm spec。
localPathstringローカル開発またはバンドル済みインストールパス。
defaultChoice"clawhub" | "npm" | "local"複数のソースが利用可能な場合の優先インストール元。
minHostVersionstringサポートされる最小 OpenClaw バージョン、>=x.y.z または >=x.y.z-prerelease
expectedIntegritystringピン留めインストール用の期待 npm dist 整合性文字列。通常は sha512-...
allowInvalidConfigRecoverybooleanバンドル済み Plugin の再インストールフローが特定の古い構成失敗から復旧できるようにします。
requiredPlatformPackagesstring[]npm install 中に検証される、必要なプラットフォーム固有 npm エイリアス。
対話型オンボーディングは、オンデマンドインストール表示面で openclaw.install を使用します。Plugin がランタイム読み込み前にプロバイダー認証選択肢またはチャネルのセットアップ/カタログメタデータを公開している場合、オンボーディングは ClawHub、npm、またはローカルインストールを促し、Plugin をインストールまたは有効化してから、選択されたフローを続行できます。ClawHub の選択肢は clawhubSpec を使用し、存在する場合は優先されます。npm の選択肢には、レジストリ npmSpec を含む信頼済みカタログメタデータが必要です(正確なバージョンと expectedIntegrity は任意のピンで、設定されている場合はインストール/更新時に強制されます)。「何を表示するか」は openclaw.plugin.json に、「どうインストールするか」は package.json に置いてください。
minHostVersion が設定されている場合、インストールと非バンドルのマニフェストレジストリ読み込みの両方で適用されます。古いホストは外部 Plugin をスキップします。不正なバージョン文字列は拒否されます。バンドル済みソース Plugin は、ホスト checkout と同じバージョンであると見なされます。
ピン留め npm インストールでは、npmSpec に正確なバージョンを保持し、期待されるアーティファクト整合性を追加してください。
{
  "openclaw": {
    "install": {
      "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3",
      "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",
      "defaultChoice": "npm"
    }
  }
}
allowInvalidConfigRecovery は壊れた構成に対する一般的なバイパスではありません。これは狭い範囲のバンドル済み Plugin 復旧専用であり、バンドル済み Plugin パスの欠落や、その同じ Plugin の古い channels.<id> エントリなど、既知のアップグレード残存物を再インストール/セットアップで修復できるようにします。無関係な理由で構成が壊れている場合、インストールは引き続き fail closed し、オペレーターに openclaw doctor --fix の実行を促します。

遅延フルロード

チャネル Plugin は、次のように遅延読み込みにオプトインできます。
{
  "openclaw": {
    "extensions": ["./index.ts"],
    "setupEntry": "./setup-entry.ts",
    "startup": {
      "deferConfiguredChannelFullLoadUntilAfterListen": true
    }
  }
}
有効にすると、OpenClaw はすでに構成済みのチャネルであっても、listen 前の起動フェーズでは setupEntry のみを読み込みます。Gateway が listen を開始した後にフルエントリが読み込まれます。
setupEntry が Gateway の listen 開始前に必要なすべて(チャネル登録、HTTP ルート、Gateway メソッド)を登録する場合にのみ、遅延読み込みを有効にしてください。必要な起動機能をフルエントリが所有している場合は、既定の動作を維持してください。
セットアップ/フルエントリが Gateway RPC メソッドを登録する場合は、Plugin 固有のプレフィックスに置いてください。予約済みのコア管理名前空間(config.*exec.approvals.*wizard.*update.*)はコア所有のままで、常に operator.admin に正規化されます。

Plugin マニフェスト

すべてのネイティブ Plugin は、パッケージルートに openclaw.plugin.json を同梱する必要があります。OpenClaw はこれを使い、Plugin コードを実行せずに config を検証します。
{
  "id": "my-plugin",
  "name": "My Plugin",
  "description": "Adds My Plugin capabilities to OpenClaw",
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "webhookSecret": {
        "type": "string",
        "description": "Webhook verification secret"
      }
    }
  }
}
チャネル Plugin では、channels を追加します(provider Plugin では providers を追加します)。
{
  "id": "my-channel",
  "channels": ["my-channel"],
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {}
  }
}
config がない Plugin でも schema を同梱する必要があります。空の schema は有効です。
{
  "id": "my-plugin",
  "configSchema": {
    "type": "object",
    "additionalProperties": false
  }
}
完全な schema リファレンスについては、Plugin manifest を参照してください。

ClawHub での公開

Skills と Plugin パッケージは別々の ClawHub publish コマンドを使用します。Plugin パッケージでは、パッケージ固有のコマンドを使用します。
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
clawhub skill publish <path> は skill フォルダーを公開するための別コマンドであり、Plugin パッケージ用ではありません。ClawHub での公開 を参照してください。

Setup entry

setup-entry.tsindex.ts の軽量な代替で、OpenClaw がセットアップ surface(オンボーディング、config 修復、無効なチャネルの検査)だけを必要とする場合に読み込まれます。
// setup-entry.ts
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
import { myChannelPlugin } from "./src/channel.js";

export default defineSetupPluginEntry(myChannelPlugin);
これにより、セットアップフロー中に重いランタイムコード(crypto ライブラリ、CLI 登録、バックグラウンドサービス)を読み込まずに済みます。 セットアップセーフな export を sidecar モジュールに保持するバンドル済みワークスペースチャネルは、defineSetupPluginEntry(...) の代わりに openclaw/plugin-sdk/channel-entry-contractdefineBundledChannelSetupEntry(...) を使用できます。そのバンドル済み contract は任意の runtime export もサポートするため、セットアップ時の runtime wiring を軽量かつ明示的に保てます。
  • チャネルは無効だが、セットアップ/オンボーディング surface が必要な場合。
  • チャネルは有効だが未設定の場合。
  • 遅延読み込みが有効な場合(deferConfiguredChannelFullLoadUntilAfterListen)。
  • チャネル Plugin オブジェクト(defineSetupPluginEntry 経由)。
  • Gateway listen 前に必要な HTTP routes。
  • 起動中に必要な Gateway methods。
これらの起動時 Gateway methods は、引き続き config.*update.* などの予約済み core admin namespaces を避けるべきです。
  • CLI 登録。
  • バックグラウンドサービス。
  • 重い runtime imports(crypto、SDK)。
  • 起動後にのみ必要な Gateway methods。

狭いセットアップ helper import

ホットなセットアップ専用パスでは、セットアップ surface の一部だけが必要な場合、広範な plugin-sdk/setup umbrella よりも狭いセットアップ helper seam を優先してください。
import path用途主な export
plugin-sdk/setup-runtimesetupEntry / 遅延チャネル起動で利用可能なままにするセットアップ時 runtime helperscreateSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy
plugin-sdk/setup-adapter-runtime非推奨の互換 alias。plugin-sdk/setup-runtime を使用してくださいcreateEnvPatchedAccountSetupAdapter
plugin-sdk/setup-toolsセットアップ/インストール CLI/archive/docs helpersformatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR
moveSingleAccountChannelSectionToDefaultAccount(...) などの config patch helpers を含む、完全な共有セットアップ toolbox が必要な場合は、より広範な plugin-sdk/setup seam を使用してください。 固定のセットアップ ウィザード文言には createSetupTranslator(...) を使用してください。これは CLI ウィザードの locale(OPENCLAW_LOCALE、次にシステム locale 変数)に従い、英語にフォールバックします。Plugin 固有のセットアップテキストは Plugin 所有のコードに置き、共有 catalog keys は共通のセットアップ labels、status text、公式バンドル Plugin のセットアップ文言にのみ使用してください。 セットアップ patch adapters は import 時にホットパス安全です。バンドル済み単一アカウント昇格の contract-surface lookup は lazy なので、plugin-sdk/setup-runtime を import しても、adapter が実際に使われる前にバンドル済み contract-surface discovery を eager に読み込むことはありません。

チャネル所有の単一アカウント昇格

チャネルが単一アカウントのトップレベル config から channels.<id>.accounts.* にアップグレードされると、デフォルトの共有動作では、昇格された account-scoped 値が accounts.default に移動されます。 バンドル済みチャネルは、setup contract surface を通じてその昇格を絞り込むか上書きできます。
  • singleAccountKeysToMove: 昇格されたアカウントに移動すべき追加のトップレベル keys
  • namedAccountPromotionKeys: named accounts がすでに存在する場合、これらの keys のみが昇格されたアカウントに移動します。共有 policy/delivery keys はチャネルルートに残ります
  • resolveSingleAccountPromotionTarget(...): どの既存アカウントが昇格された値を受け取るかを選択します
Matrix が現在のバンドル済み例です。named Matrix account がちょうど 1 つすでに存在する場合、または defaultAccountOps のような既存の非正規 key を指している場合、昇格は新しい accounts.default entry を作成せず、そのアカウントを保持します。

Config schema

Plugin config は manifest 内の JSON Schema に対して検証されます。ユーザーは次のように Plugin を設定します。
{
  plugins: {
    entries: {
      "my-plugin": {
        config: {
          webhookSecret: "abc123",
        },
      },
    },
  },
}
Plugin は登録中にこの config を api.pluginConfig として受け取ります。 チャネル固有の config には、代わりにチャネル config section を使用してください。
{
  channels: {
    "my-channel": {
      token: "bot-token",
      allowFrom: ["user1", "user2"],
    },
  },
}

チャネル config schema の構築

buildChannelConfigSchema を使用して、Zod schema を Plugin 所有の config artifacts で使われる ChannelConfigSchema wrapper に変換します。
import { z } from "zod";
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";

const accountSchema = z.object({
  token: z.string().optional(),
  allowFrom: z.array(z.string()).optional(),
  accounts: z.object({}).catchall(z.any()).optional(),
  defaultAccount: z.string().optional(),
});

const configSchema = buildChannelConfigSchema(accountSchema);
すでに contract を JSON Schema または TypeBox として作成している場合は、OpenClaw が metadata paths 上で Zod-to-JSON-Schema 変換をスキップできるように、直接 helper を使用してください。
import { Type } from "typebox";
import { buildJsonChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";

const configSchema = buildJsonChannelConfigSchema(
  Type.Object({
    token: Type.Optional(Type.String()),
    allowFrom: Type.Optional(Type.Array(Type.String())),
  }),
);
サードパーティ Plugin では、cold-path contract は引き続き Plugin manifest です。生成された JSON Schema を openclaw.plugin.json#channelConfigs に mirror し、runtime code を読み込まずに config schema、setup、UI surfaces が channels.<id> を検査できるようにしてください。

セットアップ ウィザード

チャネル Plugin は openclaw onboard 用の対話型セットアップ ウィザードを提供できます。ウィザードは ChannelPlugin 上の ChannelSetupWizard オブジェクトです。
import type { ChannelSetupWizard } from "openclaw/plugin-sdk/channel-setup";

const setupWizard: ChannelSetupWizard = {
  channel: "my-channel",
  status: {
    configuredLabel: "Connected",
    unconfiguredLabel: "Not configured",
    resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token),
  },
  credentials: [
    {
      inputKey: "token",
      providerHint: "my-channel",
      credentialLabel: "Bot token",
      preferredEnvVar: "MY_CHANNEL_BOT_TOKEN",
      envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?",
      keepPrompt: "Keep current token?",
      inputPrompt: "Enter your bot token:",
      inspect: ({ cfg, accountId }) => {
        const token = (cfg.channels as any)?.["my-channel"]?.token;
        return {
          accountConfigured: Boolean(token),
          hasConfiguredValue: Boolean(token),
        };
      },
    },
  ],
};
ChannelSetupWizardtextInputsdmPolicyallowFromgroupAccesspreparefinalize などもサポートします。完全なバンドル済み例については、Discord Plugin の src/setup-core.ts を参照してください。
標準の note -> prompt -> parse -> merge -> patch フローだけが必要な DM allowlist prompts では、openclaw/plugin-sdk/setup の共有セットアップ helpers、createPromptParsedAllowFromForAccount(...)createTopLevelChannelParsedAllowFromPrompt(...)createNestedChannelParsedAllowFromPrompt(...) を優先してください。
labels、scores、任意の追加行だけが異なるチャネルセットアップ status blocks では、各 Plugin で同じ status オブジェクトを手作りする代わりに、openclaw/plugin-sdk/setupcreateStandardChannelSetupStatus(...) を優先してください。
特定のコンテキストでのみ表示されるべき任意のセットアップ surfaces には、openclaw/plugin-sdk/channel-setupcreateOptionalChannelSetupSurface を使用してください。
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup";

const setupSurface = createOptionalChannelSetupSurface({
  channel: "my-channel",
  label: "My Channel",
  npmSpec: "@myorg/openclaw-my-channel",
  docsPath: "/channels/my-channel",
});
// Returns { setupAdapter, setupWizard }
plugin-sdk/channel-setup は、その optional-install surface の片側だけが必要な場合に使える、より低レベルの createOptionalChannelSetupAdapter(...)createOptionalChannelSetupWizard(...) builders も公開しています。生成された任意のアダプター/ウィザードは、実際の設定書き込みではフェイルクローズします。validateInputapplyAccountConfigfinalize 全体でインストール必須を示す同じメッセージを再利用し、docsPath が設定されている場合はドキュメントリンクを追加します。
バイナリを使うセットアップ UI では、同じバイナリ/ステータスの接着コードを各チャネルにコピーする代わりに、共有の委任ヘルパーを優先してください。
  • ラベル、ヒント、スコア、バイナリ検出だけが異なるステータスブロックには createDetectedBinaryStatus(...)
  • パスを保持するテキスト入力には createCliPathTextInput(...)
  • setupEntry がより重い完全なウィザードへ遅延して転送する必要がある場合は createDelegatedSetupWizardStatusResolvers(...)createDelegatedPrepare(...)createDelegatedFinalize(...)createDelegatedResolveConfigured(...)
  • setupEntrytextInputs[*].shouldPrompt の判断だけを委任する必要がある場合は createDelegatedTextInputShouldPrompt(...)

公開とインストール

外部 Plugin: ClawHub に公開してからインストールします。
openclaw plugins install @myorg/openclaw-my-plugin
ベアパッケージ指定は、名前がバンドル済みまたは公式の Plugin ID と一致しない限り、起動時の切り替え中に npm からインストールされます。一致する場合、OpenClaw は代わりにそのローカル/公式コピーを使用します。決定的なソース選択には clawhub:npm:git:、または npm-pack: を使用してください。Plugin の管理 を参照してください。
リポジトリ内 Plugin: バンドル済み Plugin ワークスペースツリーの下に配置します。ビルド中に自動的に検出されます。
npm 由来のインストールでは、openclaw plugins install はライフサイクルスクリプトを無効化した状態(--ignore-scripts)で、パッケージを ~/.openclaw/npm/projects 配下の Plugin ごとのプロジェクトにインストールします。Plugin の依存関係ツリーは純粋な JS/TS に保ち、postinstall ビルドを必要とするパッケージは避けてください。
Gateway の起動時に Plugin の依存関係はインストールされません。npm/git/ClawHub のインストールフローが依存関係の収束を所有します。ローカル Plugin は、依存関係がすでにインストールされている必要があります。
バンドル済みパッケージのメタデータは明示的であり、Gateway 起動時にビルド済み JavaScript から推論されるものではありません。ランタイム依存関係は、それを所有する Plugin パッケージに属します。パッケージ化された OpenClaw の起動処理が Plugin の依存関係を修復したりミラーしたりすることはありません。

関連