Skip to main content
Claude Code プラグインはスキル、エージェント、フック、MCP サーバーなどのコンポーネントから構築されます。各コンポーネントはプラグイン内にデフォルトフォルダを持ち、.claude-plugin/plugin.json 内のオプションのマニフェストキーがそのフォルダを置き換えるか追加し、ユーザーが見る名前があります。各キーの完全なフィールドテーブルについては、マニフェストリファレンスを参照してください。 このページを使用して、既に読み込まれているプラグインにコンポーネントを追加します。 コンポーネントを追加した後、実行中のセッションで /reload-plugins を実行するか、新しいセッションを開始して Claude Code がそれを読み込むようにします。コンポーネントのファイルを読み込む前に確認するには、プラグインディレクトリからシェルで claude plugin validate . を実行します。
これらのケースは他のページで説明されています:

プラグインディレクトリを探索する

エクスプローラーは、デフォルトの場所にあらゆる種類のコンポーネントを 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 Code はプラグインルートの 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 を実行して、これらのファイルを見つけます。
各フィールドが何をするかと優先順位ルールについては、Subagents を参照してください。

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 つから来ても。/plugin Errors タブは警告 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
プラグインを読み込み、セッションを開始します。Claude はメイン会話で 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 に設定できます。どのフィールドがどの変数を置換するかについては、環境変数を参照してください。

次のステップ