.claude-plugin/plugin.json 内のオプションのマニフェストキーがそのフォルダを置き換えるか追加し、ユーザーが見る名前があります。各キーの完全なフィールドテーブルについては、マニフェストリファレンスを参照してください。
このページを使用して、既に読み込まれているプラグインにコンポーネントを追加します。
コンポーネントを追加した後、実行中のセッションで /reload-plugins を実行するか、新しいセッションを開始して Claude Code がそれを読み込むようにします。コンポーネントのファイルを読み込む前に確認するには、プラグインディレクトリからシェルで claude plugin validate . を実行します。
これらのケースは他のページで説明されています:
- 最初のプラグインを構築する:プラグインを作成するから始めます
- 他のユーザーのプラグインをインストールする:プラグインをインストールするを参照してください
- プラグインのユーザーが claude.ai または Cowork にいる:異なるセットのコンポーネントがそこに読み込まれます。claude.ai と Cowork のプラグインを参照してください
プラグインディレクトリを探索する
エクスプローラーは、デフォルトの場所にあらゆる種類のコンポーネントを 1 つずつ持つ例のプラグインmy-plugin を示しています:
- レビュースキルと
aboutコマンド - セキュリティレビューサブエージェント
- Claude がファイルを編集した後にファイルをフォーマットするフック、およびそれが呼び出す
scripts/フォルダ - ログモニター
- 出力スタイルとカラーテーマ
- ルート監査ワークフロー
hello-plugin実行可能ファイル- デフォルト設定
- ローカル MCP サーバーと Go 言語サーバー
各種コンポーネントを追加する
以下の各セクションでは、1 つの種類のコンポーネントについて説明します。プラグイン内のファイルの場所、検証するサンプル、プラグインが読み込まれた後にユーザーが見るもの、デフォルトの場所を変更するマニフェストキーです。プラグインに必要なものを追加してください。どれも必須ではありません。Skills
skill は、Claude がその説明がタスクと一致するときに読み込めるSKILL.md ファイルです。ユーザーはコマンドとして実行することもできます。各スキルを skills/ の下の独自のディレクトリに保存します。
SKILL.md に description を付けて、Claude がいつそれを使用するかを知るようにします。
skills/review/SKILL.md
/my-plugin:review がスキルを実行します。コマンド名と誰がそれを呼び出せるかは、以下のルールに従います。
- コマンド名:
/<plugin>:<directory>なので、my-pluginのskills/review/SKILL.mdは/my-plugin:reviewです。フロントマターでnameを設定すると、最後のセグメントが置き換わり、プラグインプレフィックスは残ります。スキルがコマンド名を取得する方法を参照してください。 - 誰が呼び出すか: Claude、ユーザー、またはその両方。フロントマターで制御されます。スキルの呼び出し者を制御するを参照してください。
skills/ ディレクトリの外に配置することもできます。
- 追加ディレクトリ:
skillsマニフェストキーにリストします。commandsとagentsとは異なり、デフォルトのskills/スキャンを置き換えるのではなく、追加します。 - プラグインルートの単一スキル:
skills/ディレクトリがなく、skillsマニフェストキーがない場合、プラグインルートのSKILL.mdは 1 つのスキルとして読み込まれます。フロントマターでnameを設定してください。そうしないと、マーケットプレイスのインストールはスキルをプラグイン名ではなく、そのキャッシュディレクトリの後に名前を付けます。
CLAUDE.md を読み込まず、claude plugin validate は CLAUDE.md at the plugin root is not loaded as project context と警告します。
フロントマターフィールドとサポートファイルについては、Skills を参照してください。
Commands
コマンドは、ユーザーが/my-plugin:about などの名前で実行する単一の Markdown ファイルです。
コマンドは古い形式であり、スキルは新しい作業ではそれに取って代わります。スキルは同じ方法で名前で実行でき、ディレクトリ内にサポートファイルを含めることもできます。
.claude/commands/ から移動しているファイルについては、commands/ を保持してください。commands/<file>.md に保存すると、/<plugin>:<file> になります。サブディレクトリはセグメントを追加するため、commands/db/migrate.md は /my-plugin:db:migrate です。
コマンドファイルはスキルと同じフロントマターを取ります。
マニフェストでコマンドを定義する
これが必要なのは、コマンドファイルをcommands/ 以外の場所に保持したい場合、または plugin.json 内に個別の Markdown ファイルなしで短いコマンドを定義したい場合のみです。commands マニフェストキーを設定すると、Claude Code は commands/ をスキャンする代わりにそれを読み取ります。キーはパス、パスの配列、または各コマンド名を source ファイルまたはインライン content にマップするオブジェクトを取ります。
このマニフェストは /my-plugin:about をインラインで定義し、Markdown ファイルはありません。
.claude-plugin/plugin.json
/my-plugin:about を実行して、読み込まれたことを確認します。
完全なキー構文については、commands を参照してください。
Agents
subagent は、独自の指示とコンテキストウィンドウを持つ別のアシスタントで、Claude がタスクを委譲できます。agents/ の下の各 Markdown ファイルは 1 つを定義します。
agents/security-reviewer.md
my-plugin:security-reviewer という名前で、ユーザーは @agent-my-plugin:security-reviewer で明示的に呼び出すことができます。名前の形式は <plugin>:<name> で、<name> はフロントマターから、またはファイル名がない場合はファイル名から来ます。
agents マニフェストキーは agents/ スキャンを置き換えます。
エージェントをサブフォルダに整理する
プラグインエージェントファイルをagents/ のサブフォルダに配置できます。Claude Code はそれらを再帰的に読み込み、プラグイン名、各サブフォルダ名、ファイル名をコロンで結合して、エージェントのスコープ付き名を形成します。たとえば、my-plugin という名前のプラグインの agents/review/security.md は my-plugin:review:security として読み込まれます。2 つの設定がその名前を変更します。
- フロントマター
name: ファイル名のみを置き換えるため、agents/review/security.mdのname: auditはmy-plugin:review:auditとして読み込まれます。 - マニフェスト
agentsフィールド: そこにリストされたファイルはサブフォルダ名なしで読み込まれるため、"agents": "./custom/review/security.md"はmy-plugin:securityとして読み込まれます。
プラグインエージェントのフロントマターフィールド
プラグインエージェントのフロントマターは、以下のルールに従います。- サポートされているフィールド:
name、description、model、effort、maxTurns、tools、disallowedTools、skills、memory、background、omitClaudeMd、isolation、color、およびexperimentalのcacheTtlキー。唯一の有効なisolation値は"worktree"です。各フィールドが何をするかについては、サポートされているフロントマターフィールドを参照してください。 - 無視されるフィールド:
permissionMode、hooks、mcpServers、およびinitialPrompt。エージェントファイルは独自にフックまたは MCP サーバーを追加できないため、代わりにプラグインフックとMCP サーバーとして追加してください。 - 解析されないフロントマター: エージェントはすべてのフィールドが無視された状態で読み込まれます。ファイルの後に名前が付けられ、その説明は
Agent from my-plugin pluginと読みます。シェルでclaude plugin validateを実行して、これらのファイルを見つけます。
Hooks
フックは、Claude Code のライフサイクルの特定の時点(すべてのファイル編集後など)で自動的に何かを実行します。シェルコマンド、HTTP リクエスト、MCP ツール呼び出し、モデルへのプロンプト、またはサブエージェント。プラグインのフックを、プラグインルートのhooks/hooks.json に保存し、トップレベルの "hooks" キーの下に、settings.json の hooks オブジェクトと同じ形で保存します。これにより、既存の設定フックを変更なしでコピーできます。
このフックは、すべての Write または Edit の後にバンドルされたスクリプトを実行します。
hooks/hooks.json
scripts/format.sh に保存し、実行可能にします。
プラグインを読み込み、Claude にファイルを編集するよう依頼します。終了 0 の PostToolUse フックはトランスクリプトに何も表示しないため、デバッグログで実行されたことを確認するか、スクリプト自体が変更したもので確認します。
hooks/hooks.json のフックと hooks マニフェストキーの両方が読み込まれます。すべてのイベントとそのペイロードについては、Hook events を参照してください。
プラグインフックが発火するとき
プラグインのフックは、プラグインのスキルまたはコマンドの 1 つが使用されるのを待ちません。Claude Code はセッションがプラグインを読み込むときにそれらを登録し、その後、それらのイベントで発火します。フックが実行されるときを制限するには、そのmatcher を絞ります。
フックが発火しない場合は、発火しないフックを参照してください。
環境、クォート、および MCP ツールのマッチング
フックの環境、${CLAUDE_PLUGIN_ROOT} のクォート、およびプラグイン独自の MCP ツールのマッチャーは、以下のように機能します。
- 環境: すべてのフックプロセスは、その環境で
CLAUDE_PLUGIN_ROOTとCLAUDE_PLUGIN_DATAを受け取り、各ユーザー設定値に対してCLAUDE_PLUGIN_OPTION_<KEY>を受け取るため、スクリプトはそこからそれらを読み取ることができます。 - クォート:
commandにargsがない場合、シェルを通じて実行されるため、hooks/hooks.jsonの例の下の Hooks で行うように、${CLAUDE_PLUGIN_ROOT}パスを二重引用符で囲んで、展開されたパスを 1 つのシェルワードに保ちます。代わりにargsを渡す場合、各要素は 1 つの引数として渡され、シェルなしで、クォートは不要です。exec form と shell form を参照してください。 - プラグイン独自の MCP ツールのマッチング: このプラグインが宣言する MCP サーバーからのツールは
mcp__plugin_<plugin>_<server>__<tool>という名前が付けられるため、マッチャーにその完全な名前を記述します。サーバー名だけのマッチャーは発火しません。MCP ツールのマッチングを参照してください。
MCP servers
MCP サーバーは、外部システムから Claude にツールを提供します。プラグインルートの.mcp.json で宣言し、プロジェクト .mcp.json と同じ形で宣言します。この .mcp.json は db という名前の 1 つのサーバーを宣言します。
.mcp.json
mcpServers ラッパーを省略して、db をファイルのトップレベルに配置することもできます。
プラグインを読み込み、/mcp を実行して、サーバーが plugin:my-plugin:db として表示されることを確認します。
claude plugin validate は .mcp.json をチェックし、Claude Code が読み込み時にドロップするサーバーエントリをエラーとして報告します。Claude Code v2.1.281 以降が必要です。
不正なエントリが読み込み時にどこに表示されるかについては、開始しない MCP サーバーを参照してください。
mcpServers マニフェストキーは、インラインサーバーマップ、JSON ファイルへのパス、またはそれらの配列を取ります。マニフェストサーバーが .mcp.json のものと同じ名前を持つ場合、マニフェストサーバーがそれを置き換えます。
claude.ai と Cowork でユーザーに到達する
ローカル stdio サーバー(MCP サーバーの下のdb サーバーなど)は Claude Code と、Claude Desktop アプリでマシン上で実行される Cowork セッションで実行されますが、claude.ai では実行されません。そこでもユーザーに到達するには、https:// URL でリモートサーバーを参照します。これは claude.ai と Cowork がコネクタとしてユーザーに提供します。
サーバー名、ツール名、およびリロード
サーバーの名前、変数置換、およびリロード動作は、以下のルールに従います。- サーバー名:
plugin:<plugin>:<server>なので、my-pluginのdbサーバーは/mcpのplugin:my-plugin:dbです。mcp_toolフックでサーバーに名前を付けるときに同じ形式を使用します。 - ツール名:
mcp__plugin_<plugin>_<server>__<tool>なので、そのdbサーバーのqueryツールはmcp__plugin_my-plugin_db__queryです。これは権限ルールとフックマッチャーで使用する名前です。 - 置換:
${CLAUDE_PLUGIN_ROOT}および他のパス変数は、command、args、およびenvで置換されます。各要素が 1 つの引数として渡されるため、argsではクォートは不要です。 - リロード: ユーザーが
/reload-pluginsを実行し、リロードが適用される場合、構成が変更されていないサーバーは接続を保持します。構成が変更されたサーバーは再接続し、削除したサーバーは切断されます。
パッケージ化された MCPB サーバーを含める
mcpServers キーは、拡張子が .mcpb または古い .dxt であるMCPB ファイルとしてパッケージ化されたサーバーも受け入れます。キーをファイルに指定します。プラグイン内のパスまたは https:// URL として。
.claude-plugin/plugin.json
name からその名前を取ります。
トランスポートと認証については、MCP を参照してください。
LSP servers
LSP サーバーは、Claude に言語の診断とコードナビゲーションを提供します。公式コードインテリジェンスプラグインがすでに言語をカバーしている場合は、1 つを記述する代わりにそれをインストールしてください。そうでない場合は、プラグインルートの.lsp.json で宣言します。
.lsp.json
command はバイナリの名前で、その引数は args にあります。extensionToLanguage には少なくとも 1 つの拡張子が必要で、各拡張子は . で始まります。
claude plugin validate はこのファイルを読み取りません。エントリが無効な場合、ファイル全体は読み込み時にスキップされ、Invalid LSP server config for ".lsp.json" が /plugin Errors タブに表示されます。
プラグインは接続を構成しますが、サーバーバイナリをインストールしません。各ファイル拡張子は 1 つのサーバーを取得します。
- バイナリがない: Claude Code はユーザーの
PATHから名前でcommandを開始します。バイナリがない場合、サーバーは開始に失敗し、claude --debugはLSP server <name> failed to startをログに記録します。 - 拡張子の競合: 2 つの有効なサーバーが同じ拡張子を要求する場合、最初に登録されたサーバーがそれらのファイルを処理し、もう 1 つはそれらのファイルには使用されません。サーバーが 1 つのプラグインから来ても 2 つから来ても。
/pluginErrors タブは警告LSP server "<name>" is not used for <ext> filesを表示します。
lspServers マニフェストキーは同じマップをインラインで、JSON ファイルへのパス、またはそれらの配列として取り、そのサーバーは .lsp.json のものに追加されます。マニフェストサーバーが .lsp.json のものと同じ名前を持つ場合、マニフェストサーバーがそれを置き換えます。
transport、タイムアウト、再起動、およびその他のフィールドについては、lspServers を参照してください。
ログ出力を stdout ではなく stderr に送信します。Claude Code はサーバーの stdout をプロトコルメッセージとしてのみ読み取り、メッセージヘッダーは最大 64 KiB、メッセージ本体は最大 32 MiB を受け入れます。
Claude Code は、いずれかの制限を超えるサーバーを切断するか、stdout に非プロトコル出力を書き込み、切断を restartOnCrash と maxRestarts のクラッシュとしてカウントします。--debug で実行すると、Claude Code は原因を名前で指定するエラーをデバッグログに書き込みます。
Executables
プラグインルートのbin/ 内のファイルは、プラグインが有効な間、Bash ツールのシェルの PATH 上にあるため、Claude はそれらをベアコマンドとして実行できます。実行可能なスクリプトを追加します。
bin/hello-plugin
chmod +x bin/hello-plugin で実行可能にし、プラグインを読み込みます。Claude に hello-plugin を実行するよう依頼すると、Bash ツールの結果はスクリプトの出力を表示します。
プラグイン bin/ ディレクトリはユーザー独自の PATH エントリの後に来るため、プラグインは git、ls、または別のシステムコマンドをシャドウできません。
claude.ai と Cowork は、トップレベルの bin/ ディレクトリを持つプラグイン(claude.ai 組織設定を通じて配布するものを含む)をインストールしません。
Default settings
プラグインが有効な間に適用されるデフォルトを設定するには、プラグインルートにsettings.json を追加するか、同じオブジェクトを settings マニフェストキーにインラインで配置します。2 つのキーが有効になり、agent と subagentStatusLine で、他のすべてのキーは削除されます。
プラグイン独自のエージェントの 1 つをメインスレッドとして実行するように agent を設定します。
settings.json
security-reviewer エージェントのシステムプロンプトとモデルで応答します。
キーが制御するすべてのものについては、agent 設定を参照してください。
同じキーが複数の場所で設定されている場合、これらのルールは、どの値が適用されるかを決定します。
- ファイルがマニフェストより優先: 両方が存在し、
settings.jsonが少なくとも 1 つのサポートされているキーを設定する場合、settings.jsonが適用され、マニフェストのsettingsは無視されます。 - ユーザー設定がプラグインのデフォルトより優先: 設定ソース全体で、プラグインのデフォルトは最下位レイヤーであるため、ユーザー独自の
~/.claude/settings.jsonのagentはあなたのものをオーバーライドします。 - 2 つのプラグインが同じキーを設定: 最後に読み込まれたプラグインからの値が適用され、
claude --debugはoverrides settingをログに記録します。
subagentStatusLine の形状については、subagent status lines を参照してください。
Themes and output styles
プラグインはカラーテーマと出力スタイルを含めることができます。どちらもユーザー独自のものと同じピッカーに表示されます。どちらかについて、マニフェストキーを設定するとフォルダスキャンが置き換わります。
プラグインテーマは読み取り専用であるため、ユーザーが
/theme で 1 つを編集すると、編集は独自のテーマディレクトリにコピーとして保存されます。
このテーマは、ダークプリセットのプロンプトアクセントとエラーテキストを再色付けします。
themes/dracula.json
Channels
チャネルにより、チャットアプリなどの外部システムがメッセージをセッションに送信できます。プラグインでは、チャネルは MCP サーバーの 1 つと、それにバインドし、独自の構成を求めることができるchannels エントリです。このマニフェストはチャネルを telegram サーバーにバインドし、ボットトークンを要求します。
.claude-plugin/plugin.json
server は mcpServers のキーと一致する必要があります。チャネルごとの userConfig は、トップレベルの userConfig キーと同じ形を取ります。
サーバーが実装する必要があるもの、およびユーザーがチャネルプラグインを有効にする方法については、チャネルリファレンスのプラグインとしてパッケージ化するを参照してください。フィールドテーブルについては、channels を参照してください。
Monitors
モニターは、セッション全体でバックグラウンドで実行されるシェルコマンドです。それが出力するものは Claude に通知として到達するため、Claude は見るよう求められることなく、ログまたはステータス変更に反応できます。エントリをmonitors/monitors.json に保存します。
monitors/monitors.json
- 対話型セッションのみ: プラグインモニターは対話型セッションで開始され、
-pフラグを使用した非対話型モードでは開始されません。また、Monitor ツールが利用可能な場所でのみ開始されます。 - ユーザー設定なし:
commandはパス変数と環境からの${ENV_VAR}を取得しますが、${user_config.*}は取得しません。1 つを参照するモニターは開始されず、モニタープロセスはCLAUDE_PLUGIN_OPTION_<KEY>も受け取りません。 - セッション中の無効化: セッション中にプラグインを無効にする場合、Claude Code は既に実行されているモニターを停止しません。セッションが終了するときに停止します。
experimental.monitors マニフェストキーは同じ配列をインラインで、または JSON ファイルへのパスとして取り、monitors/monitors.json の代わりに読み取られます。
when トリガーおよび他のフィールドについては、monitors を参照してください。
ユーザーに設定値を求める
プラグインが必要とする値をuserConfig マニフェストキーで宣言すると、ユーザーが settings.json を自分で編集する必要がなくなります。各オプションはダイアログに表示され、その title がラベルとして、その description がその下に表示されます。
トークンまたはパスワードの場合は "sensitive": true を設定してください。ダイアログは入力をマスクし、値は settings.json ではなくセキュアストレージに保存されます。
このマニフェストはエンドポイントとトークンを求めます。
.claude-plugin/plugin.json
設定ダイアログが表示されるとき
ダイアログは対話型の/plugin インターフェースにのみ表示されます。ユーザーが以下のいずれかを実行したときに、まだ設定されていないオプションに対して開きます。
/pluginでプラグインをインストールする- セッション内で
/plugin install <plugin>@<marketplace>を実行する /pluginの Installed タブからプラグインを有効にする
/plugin configure <plugin>@<marketplace> を実行します。
claude plugin install シェルコマンドは userConfig 値のプロンプトを表示しません。シェルから値を設定するには、各値を --config KEY=VALUE として渡します。オプションが設定されていない場合、コマンドは userConfig options not yet set という行を出力し、それらを設定する両方の方法を示します。userConfig ダイアログが表示されない場合、その行が引用されます。
オプションフィールド、各値が保存される場所、コンポーネントが保存された値を参照する方法、および ${user_config.*} を拒否するフィールドについては、ユーザー設定を参照してください。
プラグインパスを参照し、データを保存する
プラグインがどこにインストールされるかわからないため、固定パスではなく、これらの変数を通じてそのファイルとデータを参照します。スキル、コマンド、エージェントコンテンツ、フックおよびモニターコマンド、MCP および LSP サーバー構成で置換されます。また、フック、MCP、および LSP プロセスにエクスポートされます:${CLAUDE_PLUGIN_ROOT}:プラグインのインストールディレクトリ。各バージョンは独自のキャッシュディレクトリを持つため、プラグインが更新されるとパスが変更されます。そこに状態を書き込まないでください${CLAUDE_PLUGIN_DATA}:更新を生き残るディレクトリ。node_modules、仮想環境、キャッシュ用。~/.claude/plugins/data/<id>/に解決され、最初に参照されるときに作成されます${CLAUDE_PROJECT_DIR}:プロジェクトルート。フックが受け取るのと同じ値
<id> はプラグイン識別子で、文字、数字、_、- 以外のすべての文字が - に置き換わるため、my-plugin@my-marketplace は my-plugin-my-marketplace になります。
Windows では、置換されたパスはシェルがバックスラッシュをエスケープとして読み込まないように前方スラッシュを使用します。
データディレクトリに依存関係をインストールする
マーケットプレイスでインストールされたプラグインの場合、Claude Code はプラグインをキャッシュするときに適格なNode.js パッケージ依存関係を自動的にインストールするため、自分でインストールする必要がない場合があります。インストールする場合、このSessionStart フックは最初の実行時に ${CLAUDE_PLUGIN_DATA} に node_modules をインストールし、更新が package.json を変更した後に再度インストールします:
hooks/hooks.json
~/.claude/plugins/data/<id>/node_modules が存在します。MCP サーバーは NODE_PATH を ${CLAUDE_PLUGIN_DATA}/node_modules に設定できます。どのフィールドがどの変数を置換するかについては、環境変数を参照してください。
次のステップ
- プラグインマニフェストリファレンス:
plugin.jsonフィールド、パスルール、標準レイアウト - evals でプラグインをテストする:追加したコンポーネントが Claude の動作を意図した方法で変更することを確認します
- プラグインを公開および配布する:プラグインをバージョン管理し、マーケットプレイスに配置します
- プラグインのトラブルシューティング:コンポーネントが読み込まれない場合またはフックが発火しない場合の対処方法