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

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

エクスプローラーは、デフォルトの場所にあらゆる種類のコンポーネントを 1 つずつ持つ例のプラグイン my-plugin を示しています:
  • レビュースキルと about コマンド
  • セキュリティレビューサブエージェント
  • Claude がファイルを編集した後にファイルをフォーマットするフック、およびそれが呼び出す scripts/ フォルダ
  • ログモニター
  • 出力スタイルとカラーテーマ
  • ルート監査ワークフロー
  • hello-plugin 実行可能ファイル
  • デフォルト設定
  • ローカル MCP サーバーと Go 言語サーバー
各ファイルはその形式の最小限の有効な例であり、有用であるためではなく形状を示すためにあります:実際のスキルまたはエージェントは完全な指示を持ち、多くの場合サポートファイルを含み、実際のフックまたはモニターは実際の作業を行います。エクスプローラーの後のセクションはエクスプローラーと同じファイルを例として使用し、より完全なものへのリンクを提供します。ファイルまたはフォルダを選択して、それが何のためにあるのか、何が含まれるのか、それをカバーするセクションを見つけます。

各種類のコンポーネントを追加する

以下の各セクションでは、コンポーネントの種類ごとに、プラグイン内でのファイルの配置場所、検証に通る例、プラグインの読み込み後にユーザーに表示される内容、およびデフォルトの場所を変更するマニフェストキーを説明します。プラグインに必要なものを追加してください。必須のものはありません。

スキル

スキルは、説明がタスクに一致したときに Claude が読み込める SKILL.md ファイルです。ユーザーはコマンドとして実行することもできます。各スキルは skills/ 配下の個別のディレクトリに保存します。
Claude がいつ使用すべきかを判断できるよう、SKILL.md に description を指定します。
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 という警告を出します。 保護されたファイルへの編集のブロックのように、常に守られる必要があるルールは、スキルではなくフックとしてプラグインに追加してください。どちらを選ぶべきかについては、類似機能の比較の「Hook vs Skill」タブを参照してください。 フロントマターのフィールドとサポートファイルについては、スキルを参照してください。

コマンド

コマンドは、/my-plugin:about のように、ユーザーが名前で実行する単一の Markdown ファイルです。
コマンドは古い形式であり、新規の作業ではスキルがこれに代わります。スキルも同じように名前で実行でき、さらにディレクトリ内にサポートファイルを含めることもできます。commands/ は .claude/commands/ から移行するファイルのために残しておいてください。
コマンドを commands/<file>.md に保存すると、/<plugin>:<file> になります。サブディレクトリはセグメントを追加するため、commands/db/migrate.md は /my-plugin:db:migrate になります。 コマンドファイルはスキルと同じフロントマターを受け付けます。

マニフェストでコマンドを定義する

これが必要なのは、コマンドファイルを commands/ 以外の場所に置きたい場合か、別の Markdown ファイルを用意せずに plugin.json 内で短いコマンドを定義したい場合だけです。commands マニフェストキーを設定すると、Claude Code は commands/ をスキャンする代わりにそれを読み取ります。このキーには、パス、パスの配列、または各コマンド名を source ファイルかインラインの content にマッピングするオブジェクトを指定できます。 このマニフェストは、Markdown ファイルなしで /my-plugin:about をインラインで定義します。
.claude-plugin/plugin.json
プラグインを読み込み、セッションで /my-plugin:about を実行して、読み込まれたことを確認してください。 キーの完全な構文については、commands を参照してください。

エージェント

サブエージェントは、独自の指示とコンテキストウィンドウを持つ別のアシスタントで、Claude はタスクを委任できます。agents/ 配下の各 Markdown ファイルが 1 つのサブエージェントを定義します。
agents/security-reviewer.md
このエージェントの名前は my-plugin:security-reviewer で、ユーザーは @agent-my-plugin:security-reviewer で明示的に呼び出すことができます。名前の形式は <plugin>:<name> で、<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、autoCompactWindow、tools、disallowedTools、skills、memory、background、omitClaudeMd、isolation、color、および experimental の cacheTtl キーです。isolation の有効な値は "worktree" のみです。各フィールドの役割については、サポートされるフロントマターフィールドを参照してください
  • 無視されるフィールド: permissionMode、hooks、mcpServers、initialPrompt です。エージェントファイル単独ではフックや MCP サーバーを追加できないため、代わりにプラグインのフックと MCP サーバーとして追加してください
  • 256 文字を超える name: Claude Code はこれを無視し、このフィールドがない場合と同様に、エージェントの名前をファイル名にします
  • 解析できないフロントマター: エージェントはすべてのフィールドが無視された状態で読み込まれます。名前はファイル名になり、説明は Agent from my-plugin plugin になります。このようなファイルを見つけるには、シェルで claude plugin validate を実行してください
各フィールドの役割と優先順位のルールについては、サブエージェントを参照してください。

フック

フックは、ファイル編集のたびなど、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 マニフェストキー内のフックは、どちらも読み込まれます。すべてのイベントとそのペイロードについては、フックイベントを参照してください。 有効な別のプラグインが同じ名前を持つ場合、2 つのうち一方の hooks/hooks.json のフックが登録され、もう一方のフックは除外されます。どちらが登録されるか、およびそれを知らせる /plugin 内の通知については、有効な 2 つのプラグインが同じ名前を持つ場合のフックを参照してください。 Claude Code 内で実行され、そのインターフェースに描画できる JavaScript 関数としてフックを記述するには、同じ hooks/hooks.json の modules キーの下にモジュールファイルを列挙します。これを含むプラグインは mod です。mod を作成するを参照してください。

プラグインのフックが発火するタイミング

プラグインのフックは、そのプラグインのスキルやコマンドが使用されるのを待ちません。Claude Code はセッションがプラグインを読み込んだ時点でフックを登録し、それ以降、フックはそれぞれのイベントで発火します。フックが実行されるタイミングを限定するには、その matcher を絞り込んでください。 フックがまったく発火しない場合は、発火しないフックを参照してください。

環境、クォート、MCP ツールのマッチング

フックの環境、${CLAUDE_PLUGIN_ROOT} のクォート、プラグイン自身の MCP ツールに対する matcher は、次のように動作します。
  • 環境: すべてのフックプロセスは、環境変数として CLAUDE_PLUGIN_ROOT と CLAUDE_PLUGIN_DATA、さらに各ユーザー設定値に対応する CLAUDE_PLUGIN_OPTION_<KEY> を受け取るため、スクリプトはそこからこれらを読み取れます
  • クォート: command に args がない場合はシェルを介して実行されるため、フックの hooks/hooks.json の例のように ${CLAUDE_PLUGIN_ROOT} のパスを二重引用符で囲み、展開後のパスが 1 つのシェルワードになるようにしてください。代わりに args を渡す場合、各要素はシェルを介さずに 1 つの引数として渡されるため、クォートは不要です。exec 形式と shell 形式を参照してください
  • プラグイン自身の MCP ツールのマッチング: このプラグインが宣言する MCP サーバーのツールは mcp__plugin_<plugin>_<server>__<tool> という名前になるため、matcher にはこの完全な名前を記述してください。サーバー名だけの matcher は決して発火しません。MCP ツールのマッチングを参照してください

MCP サーバー

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 のユーザーに届ける

MCP サーバーの db サーバーのようなローカルの stdio サーバーは、Claude Code と、Claude Desktop アプリでユーザーのマシン上で実行される Cowork セッションでは動作しますが、claude.ai では動作しません。claude.ai のユーザーにも届けるには、MCP コネクタをスキルと一緒にバンドルするで示されているように、リモートサーバーを 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 になります。これが権限ルールとフックの matcher で使用する名前です
  • 置換: ${CLAUDE_PLUGIN_ROOT} とその他のパス変数は、command、args、env 内で置換されます。args では各要素が 1 つの引数として渡されるため、クォートは不要です
  • 再読み込み: ユーザーが /reload-plugins を実行し、再読み込みが適用されると、設定が変更されていないサーバーは接続を維持します。設定が変更されたサーバーは再接続し、削除したサーバーは切断されます

パッケージ化された MCPB サーバーを含める

mcpServers キーには、パッケージ化されたサーバーを MCPB ファイルとして指定することもできます。拡張子は .mcpb または旧形式の .dxt です。キーには、プラグイン内のパスまたは https:// URL としてファイルを指定します。
.claude-plugin/plugin.json
サーバーの名前は、バンドルのマニフェスト内の name から取られます。 バンドル自体のマニフェストでは、サーバーがユー��ーから必要とする設定を user_config ブロックで宣言できます。必須の設定に保存済みの値がないバンドルサーバーは起動しません。/plugin の Errors タブには Bundled MCP server "<name>" was not started: it needs configuration と表示されます。 ユーザーは次の 2 つのいずれかの方法で値を指定します。
  • /plugin で指定する: Installed タブでプラグインを選択し、Configure を選びます
  • インストール時にシェルから指定する: claude plugin install に --config <server>.<key>=<value> を渡します。Claude Code v2.1.285 以降が必要で、プラグイン内にパッケージ化されたバンドルに対してのみ機能します。
トランスポートと認証については、MCP を参照してください。

LSP サーバー

LSP サーバーは、言語の診断とコードナビゲーションを Claude に提供します。使用する言語を公式のコードインテリジェンスプラグインがすでにカバーしている場合は、自分で作成する代わりにそれをインストールしてください。そうでない場合は、プラグインルートの .lsp.json でサーバーを宣言します。
.lsp.json
このファイルは各サーバー名をその設定に直接マッピングし、マップを囲むラッパーオブジェクトはありません。command はバイナリの名前で、その引数は args に指定します。extensionToLanguage には少なくとも 1 つの拡張子が必要で、それぞれ . で始まる必要があります。 claude plugin validate はこのファイルを読み取りません。いずれかのエントリが無効な場合、読み込み時にファイル全体がスキップされ、/plugin の Errors タブに Invalid LSP server config for ".lsp.json" と表示されます。 プラグインは接続を設定しますが、サーバーのバイナリはインストールしません。また、各ファイル拡張子に割り当てられるサーバーは 1 つです。
  • バイナリがない場合: Claude Code はユーザーの PATH から名前で command を起動します。バイナリがそこにない場合、サーバーは起動に失敗し、claude --debug は LSP server <name> failed to start をログに記録します
  • 拡張子の競合: 有効な 2 つのサーバーが同じ拡張子を要求する場合、サーバーが 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 のメッセージ本文を受け付けます。 いずれかの上限を超えたサーバー、または stdout にプロトコル以外の出力を書き込んだサーバーを、Claude Code は切断し、その切断を restartOnCrash と maxRestarts におけるクラッシュとして数えます。--debug を付けて実行すると、Claude Code は原因を示すエラーをデバッ���ログに書き込みます。

実行可能ファイル

プラグインルートの bin/ 内のファイルは、プラグインが有効な間、Bash ツールのシェルの PATH に含まれるため、Claude はそれらをコマンド名だけで実行できます。Claude がサンドボックスの外で PowerShell ツールを使って実行するコマンドも、PATH 上でそれらを見つけられますが、サンドボックス化された PowerShell コマンドでは見つけられません。実行可能なスクリプトを追加します。
bin/hello-plugin
chmod +x bin/hello-plugin で実行可能にし、プラグインを読み込みます。Claude に hello-plugin の実行を依頼すると、Bash ツールの結果にスクリプトの出力が表示されます。 プラグインの bin/ ディレクトリはユーザー自身の PATH エントリの後に置かれるため、プラグインが git、ls、その他のシステムコマンドを隠すことはできません。 claude.ai と Cowork は、トップレベルに bin/ ディレクトリを持つプラグインをインストールしません。これには、claude.ai の組織設定を通じて配布するプラグインも含まれます。

デフォルト設定

プラグインが有効な間に適用されるデフォルトを設定するには、プラグインルートに settings.json を追加するか、同じオブジェクトを settings マニフェストキーにインラインで記述します。有効になるキーは agent と subagentStatusLine の 2 つで、それ以外のキーはすべて破棄されます。 プラグイン自身のエージェントの 1 つをメインスレッドとして実行するには、agent を設定します。
settings.json
プラグインを読み込み、セッションを開始します。すると Claude は、メインの会話で security-reviewer エージェントのシステムプロンプトとモデルを使って応答します。 このキーが制御するすべての内容については、agent 設定を参照してください。 同じキーが複数の場所で設定されている場合、どの値が適用されるかは次のルールで決まります。
  • マニフェストよりファイルを優先: 両方が存在し、settings.json がサポートされるキーを少なくとも 1 つ設定している場合、settings.json が適用され、マニフェストの settings は無視されます
  • プラグインのデフォルトよりユーザー設定を優先: 設定ソースの中で、プラグインのデフォルトは最も低いレイヤーであるため、~/.claude/settings.json 内のユーザー自身の agent がプラグインの値を上書きします
  • 2 つのプラグインが同じキーを設定する場合: 最後に読み込まれたプラグインの値が適用され、claude --debug は overrides setting をログに記録します
subagentStatusLine の形式については、サブエージェントのステータスラインを参照してください。

テーマと出力スタイル

プラグインにはカラーテーマと出力スタイルを含めることができます。どちらも、ユーザー自身のものと同じピッカーに表示されます。どちらの場合も、マニフェストキーを設定するとフォルダーのスキャンが置き換えられます。 プラグインのテーマは読み取り専用であるため、ユーザーが /theme でテーマを編集すると、その編集はユーザー自身のテーマディレクトリにコピーとして保存されます。 このテーマは、dark プリセット上でプロンプトのアクセントカラーとエラーテキストの色を変更します。
themes/dracula.json

チャネル

チャネルを使うと、チャットアプリなどの外部システムがセッションにメッセージを送信できます。プラグインにおけるチャネルは、MCP サーバーの 1 つと、それにバインドし独自の設定をユーザーに求めることができる channels エントリで構成されます。このマニフェストは、チャネルを telegram サーバーにバインドし、ボットトークンを求めます。
.claude-plugin/plugin.json
server は mcpServers 内のキーと一致する必要があります。チャネルごとの userConfig は、トップレベルの userConfig キーと同じ形式です。 サーバーが実装する必要がある内容と、ユーザーがチャネルプラグインを有効にする方法については、チャネルリファレンスのプラグインとしてパッケージ化するを参照してください。フィールドの表については、channels を参照してください。

モニター

モニターは、セッション全体を通じてバックグラウンドで実行されるシェルコマンドです。出力した内容は通知として Claude に届くため、Claude は監視を依頼されなくても、ログやステータスの変化に反応できます。エントリは monitors/monitors.json に保存します。
monitors/monitors.json
コマンドは、セッションの現在の作業ディレクトリでシェル内で実行されます。ユーザーの完全な権限で、サンドボックスの外で実行されます。 モニターのコマンドには、起動する場所と参照できる内容に制限があります。
  • 対話セッションのみ: プラグインのモニターは、-p フラグを使用した非対話モードでは起動しません
  • 最小バージョン: Amazon Bedrock、Claude Platform on AWS、Google Cloud の Agent Platform、Microsoft Foundry のいずれかを使用している場合、または DISABLE_TELEMETRY か CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC が設定されている場合、モニターには Claude Code v2.1.310 以降が必要です。この要件は機能フラグの取得がオフの場合に適用されます
  • ユーザー設定は使用不可: command はパス変数と環境からの ${ENV_VAR} を取得しますが、${user_config.*} は決して取得しません。これを参照するモニターは起動せず、モニタープロセスは 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> を実行します。 VS Code 拡張機能の プラグイン管理ダイアログは、インストール後にフォームとして未設定のオプションを求め、プラグインの行のギアアイコンはすべてのオプションを含むフォームを再度開きます。 claude plugin install シェルコマンドは userConfig 値のプロンプトを表示しません。シェルから値を設定するには、インストール時に各値を --config KEY=VALUE として渡すか、その後 claude plugin configure --values-stdin にJSON オブジェクトをパイプします。 オプションが設定されていない場合、claude plugin install は 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 では、置換されたパスのほとんどは C:/Users/you/... のように前方スラッシュを使用します。exec 形式のフックと、PowerShell を通じて実行されるフック(Git Bash がインストールされていない場合の Windows のデフォルトシェル)では、ネイティブのバックスラッシュが維持されます。

データディレクトリに依存関係をインストールする

マーケットプレイスでインストールされたプラグインの場合、Claude Code はプラグインをキャッシュするときに適格なNode.js パッケージ依存関係を自動的にインストールするため、自分でインストールする必要がない場合があります。インストールする場合、この SessionStart フックは最初の実行時に ${CLAUDE_PLUGIN_DATA} に node_modules をインストールし、更新が package.json を変更した後に再度インストールします:
hooks/hooks.json
最初のセッションの後、~/.claude/plugins/data/<id>/node_modules が存在します。MCP サーバーは、その env で NODE_PATH を ${CLAUDE_PLUGIN_DATA}/node_modules に設定できます。どのフィールドがどの変数を置換するかについては、環境変数を参照してください。

次のステップ