本文へ移動
Claude Tips

Mod(モッド)を使う

Mod(モッド)で何ができるか、入れ方、信頼の見極め、オンとオフ、仕組み、動く場所、組織での管理、最初から入っている mod をまとめます。

Mod(モッド、mod)は、Claude Code の見た目と振る舞いを変えるプラグインです。JavaScript か TypeScript で書いたイベントのハンドラーでできています。ツール呼び出し・送信したプロンプト・画面の一部の描画などのイベントが起きると、Claude Code がハンドラーを呼びます。ハンドラーはそのイベントを見るだけにも、変えることにも、肩代わりすることにも使えます。たとえば、リクエストのたびにコンテキストの埋まり具合をグラフにするペインのような、自分用の機能を足せます。

補足

既存のフックもイベントで動きますが、設定ファイルに書いたシェルコマンド・HTTP リクエスト・プロンプトです。mod のハンドラーは Claude Code の中で動く関数です。どちらも「フック」と呼ばれるため、mod の4ページでは、「フック」は mod のハンドラー、設定ファイルのものは「設定のフック」と書き分けます。

mod は次の4ページに分けています。

  • このページ:何ができるか・入れ方・信頼・オンオフ・仕組み・組織での管理
  • Mod を作る・試す:作り方・自動テスト・トラブルシューティング
  • Mod で画面に描く:ペイン・帯・ボタン・入力欄・要素の見本
  • Mod のリファレンス:ファイルの形・イベント・API のメソッド・要素の一覧

mod でできること#

設定のフック・スキル・ステータスライン・MCP サーバーは、Claude Code の外から働きます(スクリプトを動かす、Claude にテキストやツールを渡す)。mod は Claude Code の中で動くので、これらにできないことができます。

  • 操作できる画面を描く:トランスクリプトの横のペインや、プロンプトの上の帯。タブ・ボタン・入力欄が使えます
  • Claude Code が描く画面を描き直す:ツール呼び出しの行・スピナー・Claude が質問するダイアログなど、本体が描く部分を差し替えたり見た目を変えたりします
  • ツール呼び出しやリクエストに割り込む:ユーザーに質問するあいだツール呼び出しを止める、ツールを実行せずに答える、1つのリクエストだけ別のモデルへ送る、など
  • コマンドで自分のコードを動かす:Claude のターンを挟まず、Claude が作業中でも、/command で関数をすぐ実行します
  • フック間でデータを共有する:1つの mod のフックは、そのファイルの変数を共有します。ツール呼び出しを数えるフックと、その数をスピナーの横に出すフックを分ける、リクエストごとのトークン使用量を読むフックと、それをペインにグラフで描くフックを分ける、などができます

mod は Claude Code の CLI と、Claude デスクトップアプリの Code タブで動きます。VS Code 拡張・claude -p・クラウドセッションでの動きは、下の「mod が動く場所」を見てください。設定のフック・スキル・MCP サーバーで足りるなら、mod を書く前に下の比較表で見比べます。

mod を手に入れる#

  • すでにあるものを使う:/diff のように、Claude Code 自体の機能の一部が mod です(下の「最初から入っている mod」)
  • 作る:やりたいことを Claude Code のセッションで説明すると、Claude が mod を書きます。コードの仕組みを知りたいときは自分で書きます(Mod を作る・試す)
  • 入れる:下の手順で入れるか、サンプルを試します

mod を入れる・更新する#

注意

mod は、あなたの権限で動くコードです。ファイルの読み書き・プロセスの起動・ネットワークへのリクエストができます。信頼できる作者とマーケットプレイスの mod だけを入れてください。

mod はマーケットプレイスからプラグインとして入れます。プラグイン名、@、マーケットプレイス名の順に書きます。次は、マーケットプレイス your-org のプラグイン token-chart を入れる例です。

  • セッションの中:/plugin install token-chart@your-org
  • シェル:claude plugin install token-chart@your-org

マーケットプレイス・スコープ・VS Code 拡張とデスクトップアプリ・更新の保ち方は、mod を含むプラグインでもそのまま当てはまります(プラグインを使う)。

セッションを開いたまま、シェルから mod を入れる・更新したときは、そのセッションで /reload-plugins を実行すると読み込まれます。実行しなければ、次に Claude Code を起動したときに読み込まれます。

サンプルの mod を試す#

Anthropic が、claude-code-playground リポジトリの claude-code/mods ディレクトリにサンプルの mod を公開しています。どれも完成したプラグインで、README に作り方が書いてあります。サポートなしで、そのまま共有されています。

サンプル 内容
token-weather プロンプトの上に、コンテキストウィンドウの予報を描く
blast-radius rm -rf や force push のような危険なシェルコマンドを止め、何が変わるかを見せる。続行・中止のボタン付き
replay-theater /replay コマンドを足し、直前のターンで Claude が行ったファイル編集を順に再生する

サンプルも、あなたの権限で動きます。読み込む前に何をするかを見るには、下の「入れる前に、mod がすることを一覧する」を使います。

試すには、リポジトリをクローンし、--plugin-dir で mod のディレクトリを1回のセッションだけ読み込みます。読み込まれたかは、下の「セッションが読み込んだ mod を見る」で確かめます。残すには、クローンの claude-code/mods ディレクトリをマーケットプレイスとして追加し、claude-code-playground-mods から入れます。マーケットプレイスはクローンを指すので、クローンを動かす・消すと mod は読み込まれなくなります。

mod を信頼してよいか決める#

mod は、Claude Code の中であなたの権限で動くコードです。信頼できる作者とマーケットプレイスのものだけを入れます。

mod が届く範囲#

読み込まれた mod は、あなたのアカウントでできることを一通りできます。

範囲 できること
端末 アカウントが届く場所のファイルの読み書き、プログラムの起動、ネットワークへのリクエスト
秘密 環境変数と設定ファイルを読む(そこに置いた API キーも)
セッションを見る 送るプロンプトと、Claude のツール呼び出しのすべて
セッションを変える プロンプトやツール呼び出しの書き換え、あなたが打ったことにしたプロンプトの送信、別のセッションへのメッセージ
確認を飛ばす 確認が出る前にツール呼び出しを承認する
利用枠 あなたのプランや API キーでモデルを呼ぶ

とくに気をつけたいのは次の3点です。

  • サンドボックスの外で動く:サンドボックスが隔離するのは Claude が実行する Bash コマンドで、mod が起動したプロセスは対象外です
  • 確認やフックを越えて承認できる:ツール呼び出しを承認する mod は、ask ルールの確認や、自分の PreToolUse フックの拒否があっても承認できます。deny ルールの呼び出しまで承認できる場合を含め、一覧は権限ルールにあります
  • 権限の確認画面だけは変えられない:画面の多くを描き直せても、確認画面が見せる内容は変えられません

入れる前に、mod がすることを一覧する#

実行せずに、mod が扱うイベントと、Claude Code に頼むこと(ファイルの読み込み・ネットワークリクエストなど)を一覧できます。先にプラグインのファイルを手に入れ(リポジトリをクローンするなど)、シェルでそのディレクトリに claude plugin validate を実行します。

bash
claude plugin validate ./some-mod

出力の hooks: の行が mod の扱うイベント、calls: の行が頼むことの一覧です。出力例と、見るべき呼び出しは、下の「組織で mod を管理する」の「mod ができることを点検する」にあります。

mod をオン・オフする#

mod には Claude Code v2.1.287 以降が要り、既定でオンです。claude --version で版を確かめ、古ければ更新します。

オフにするには、止める数と期間を選びます。戻すときは同じ変更を取り消します。

止めたいもの 方法
1つの mod /plugin の「Installed」タブで、そのプラグインを無効にするか、アンインストールする
入れたすべての mod(1セッション) --safe-mode で起動する(ほかのカスタマイズも無効になる)
入れたすべての mod(すべてのセッション) ~/.claude/settings.json に "disableAllHooks": true を書く

"disableAllHooks": true は、設定のフックとカスタムのステータスラインも止めます。組織が管理するものは動き続けます。

組織で Claude Code を使っているときは、管理者がどの mod を読み込むかを制限することもできます(下の「組織で mod を管理する」)。

disableAllHooks と組織の allowManagedModsOnly が止めるのは mod だけで、プラグインのほかの部分は残ります。プラグインは入ったままで、スキル・コマンド・エージェント・MCP サーバーは読み込まれます。ほかの設定やフラグは、もっと広く効きます。それぞれがプラグインと設定のフックに何をするかは、設定キー一覧にあります。

自分に mod が読み込めるかを調べるには、Mod を作る・試すのトラブルシューティングを見ます。

補足

早期アクセスのあいだに CLAUDE_CODE_ENABLE_FUNCTION_HOOKS を設定していたら、消してください。v2.1.287 以降の Claude Code はこの変数を無視します。0 を設定しても mod はオフになりません。

セッションが読み込んだ mod を見る#

ターミナルのセッションが読み込んだ mod は、プロンプトで /plugin を実行すると分かります。タブの下の薄い行に、数と名前が出ます(例:1 mod active · first-mod)。入れたはずの mod の名前がないときは、Mod を作る・試すの「Mod が何もしない原因を探す」を見てください。

mod の仕組み#

mod は、コードがイベントのハンドラー(フック)を登録するプラグインです。Claude が1つのツールを呼ぶとき、スピナーが描かれるときなど、そのイベントが起きると、Claude Code がフックを実行します。小さな mod のファイルは3つです。

text
first-mod/
├── .claude-plugin/
│   └── plugin.json
└── hooks/
    ├── hooks.json
    └── register.js
  • plugin.json:プラグインのマニフェスト
  • hooks.json:コードのファイルを指す
  • register.js:自分のコード(フックのモジュール)。どのイベントでどの関数を動かすかを Claude Code に伝える

次は完成した register.js です。Claude が呼んだツールの数を数え、作業中にスピナーの横に Thinking · tool calls: 3… のように出します。

javascript
// 下の2つのフックが共有する数
let calls = 0

// mod が読み込まれたとき、Claude Code が1回呼ぶ
export function register(on) {
  // Claude がツールを使おうとするたびに動く
  on('tool.call', async ($, e, next) => {
    calls += 1
    // 新しい数が出るよう、画面の描き直しを頼む
    $.ui.invalidate('ui.render')
    // ツールはいつもどおり動かす
    return next(e)
  })

  // Claude Code がスピナーを描くたびに動く
  on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
    // 本体のスピナーに、言葉のあとへ数を足して使う
    return next({ ...e, props: { ...e.props, suffix: ' · tool calls: ' + calls + '…' } })
  })
}

2つのフックは、先頭の calls を共有します。

  • tool.call のフック:Claude がツールを使おうとするたびに動き、calls に1を足し、画面の描き直しを頼み、ツールをそのまま動かす
  • ui.render のフック:Claude Code がスピナーを描くたびに動き、本体のスピナーを残したまま、言葉のあとに数を足す

フックがイベントにできること#

Claude Code は、イベントに対して動く前にフックを実行するので、次に何が起きるかをフックが決められます。

  • 見る(observe):何が起きているかを記録し、変えずに先へ進める。例の tool.call のフックがこれ
  • 書き換える(rewrite):先へ進む前にイベントを変える。例の ui.render のフックが、スピナーに数を足すのがこれ
  • 答える(answer):イベントを自分で処理し、通常の動作を走らせない。コマンドを断る、など

自分のコードの外のこと(描く・コマンドを足す・モデルを呼ぶ・ファイルを読む・プロセスを起動する・ネットワークへリクエストする)をするには、フックが mod の API を呼びます。ほかの方法はありません。そのため、入れる前に Claude Code が mod のすることを一覧できます。

各選択肢のコードはMod のリファレンスを見てください。

mod が動く場所#

mod のフックは、そのプラグインを読み込むあらゆる種類のセッションで動きます。描画は範囲が狭く、mod のペイン・帯・差し替えた行を表示するのは、ターミナルとデスクトップアプリだけです。

Claude Code を動かす場所 フックが動く mod が描いたものが出る
ターミナルの claude(エディタの統合ターミナル・JetBrains のプラグインを含む) 動く 出る
デスクトップアプリの Code タブ(WSL のセッションを除く) 動く 出る(要素の表でターミナル専用とされたものを除く)
デスクトップアプリの WSL のセッション 動かない(WSL のセッションではプラグインが使えない) 出ない
VS Code 拡張のチャットパネル 動く 出ない
claude -p と Agent SDK 動く 出ない
claude.ai やモバイルアプリからのリモートコントロール 動く(手元の端末のセッションで) 手元の端末のターミナルに出る
クラウドセッション 動く(クラウドセッションに届くプラグインの場合) 出ない

描く mod は、どのアプリで動いているかを調べて、何も描けない場所ではトランスクリプトの1行やコマンドのテキストの返事に切り替えられます。

mod・設定のフック・スキル・MCP サーバーの比べ方#

4つは役割が重なります。それぞれが何で、いつ選ぶかを表にします。

項目 mod 設定のフック スキル MCP サーバー
何か Claude Code が自分のプロセスで呼ぶ、プラグインの中の関数 ライフサイクルのイベントで Claude Code が動かすシェルコマンド・HTTP リクエスト・プロンプト Claude が読む指示の SKILL.md Claude にツールを渡す外部のプロセスやサービス
変えられるもの ツール呼び出し・プロンプト・コマンド・ターン・画面の描画 ツール呼び出しやプロンプトを通すか、ツール呼び出しの引数と結果、Claude に足す文脈 Claude が知っていることとすること Claude が持つツール
画面に描けるか 描ける 描けない 描けない 描けない
書くもの JavaScript か TypeScript スクリプトと settings.json の項目 Markdown 任意の言語のサーバー
選ぶとき ペイン・プロンプトの上の帯・自分のコマンドがほしい、またはイベントを書き換えたい 手持ちのスクリプトでイベントを止める・許す・記録したい 同じ指示を何度もチャットに貼っている Claude が外部のシステムへ届く必要がある

それぞれの詳しい説明は、フックの使い方・スキル・MCP サーバーをつなぐにあります。プラグインはこれらをすべて持てるので、mod はスキルや MCP サーバーと同じプラグインで配れます。

最初から入っている mod#

Claude Code 自体の機能の一部は mod です。いまのセッションにあるものは、/plugin の「Installed」タブの「Built-in」に並びます。組み込みの mod は更新もアンインストールもできません。止め方は表の最後の列のとおりです。上の mods active の行には、組み込みの mod は数えられません。

次の表は、/plugin に出る名前ごとの一覧です。

/plugin での名前 役割 動く場面 止め方
cc-plugin-agents-md AGENTS.md をプロジェクトの指示として読み込む AGENTS.md を読めないセッションを除く、すべてのセッション /plugin で無効にするか、読み込む指示ファイルを選ぶ
cc-plugin-diff /diff を引き受けてペインを描く 対話のターミナルのセッション /plugin で無効にする。/diff は残り、本体の版のコマンドが答える
cc-plugin-plugin-authoring mod を書くための plugin-authoring スキルを Claude に渡す。スキルだけで mod のコードは持たない Anthropic が、入れた mod を遠隔でオフにしていないとき /plugin で無効にする
cc-plugin-sec-default 組織が管理するものを、ユーザーが入れた mod から守る 守りが読み込まれる場面(下の「既定で何が起きるか」) 止められない。管理者が管理設定で順番を決める
cc-plugin-telemetry Claude Code と組み込みの mod が記録する分析のレコードを送る Claude Code 自身の分析がオンの場所 /plugin で無効にするか、DISABLE_TELEMETRY などで分析をオフにする
cc-plugin-you-should-know Claude が長めの作業をしているあいだ、見落としそうなことを見張る別のエージェントを走らせ、知っておくとよいことが見つかるとプロンプトの上にメモを出す 既定では無効。組織で使えるなら /plugin の「Installed」の「Show disabled」に出る /plugin で無効にする。有効にするのは /plugin enable cc-plugin-you-should-know@builtin

disableAllHooks・--bare・--safe-mode のように、入れた mod を止める設定やフラグは、組み込みの mod を止めません。

組み込みの mod のソースを読む#

一部の mod は、Claude Code のリポジトリの mods ディレクトリでソースが公開されています。どれもフックのモジュールとテストを持つ完成したプラグインです。

名前 見どころ
diff /diff のペイン。ボタンをキー操作に結び付け、スクロールを mod 自身が処理する
agents-md AGENTS.md をプロジェクトの指示として読み込む。userConfig のオプション付き
sec-default 下の「既定で何が起きるか」の守り。ポリシーを強制する mod の見本
telemetry ほかの mod が呼べるメソッドを足し、その型も配る

組織で mod を管理する#

ここからは管理者向けです。mod を動かすか、どの mod を動かすかは管理設定で決めます。管理設定をファイル・MDM・claude.ai の管理コンソールのどれで配っても同じです。v2.1.287 以降、mod は既定でオンです。

mod はプラグインのほかの部分より強い力を持ちます。Claude Code の中で動くので、すべてのプロンプトとツール呼び出しを見て変えられ、権限の確認より前にツール呼び出しを許可・拒否できます。

ユーザーがインストールした mod を読み込ませない#

組み込みの守り(下の「既定で何が起きるか」)のオプション allowManagedModsOnly を使います。守りは、ユーザーのどの mod よりも先に読み込まれるポリシー mod です。管理設定の pluginConfigs に、cc-plugin-sec-default@builtin をキーにして書きます。

json
{
  "pluginConfigs": {
    "cc-plugin-sec-default@builtin": {
      "options": {
        "allowManagedModsOnly": true
      }
    }
  }
}

これを管理設定に置いたときの効き方です。

対象 どうなるか
ユーザーが持ち込む mod(入れたプラグインの mod・--plugin-dir で読み込んだ mod・セッション中に Claude が書いた mod) 読み込まれない
組織のものと数えられる mod(下の「組織の mod を入れ、順番を決める」) 検査されずに読み込まれる
それ以外の mod(GitHub などのリモートのマーケットプレイスから有効にしたもの、組織が claude.ai でメンバー向けにオンにしたものも含む) ユーザーのものとして扱われ、読み込まれない。組織のものが1つもなければ、入れた mod は何も読み込まれない
設定ファイルのフック・ステータスライン・/goal 影響を受けない
組み込みの mod(AGENTS.md への対応など) 動き続ける。それぞれに専用のスイッチがある

守りはこのオプションを管理設定からだけ読みます。ユーザー・プロジェクト・ローカルの設定ファイルや --settings のファイルに同じ項目を書いても変わらないので、ユーザーには取り消せません。ファイルか MDM で配れば、Amazon Bedrock・Google Cloud の Agent Platform・Microsoft Foundry でも同じように効きます。claude.ai の管理コンソールから配るときの提供状況は、サーバー管理設定で確かめます。

効いているかは、ユーザーの端末で claude --plugin-dir ./first-mod のように mod のディレクトリを指して起動すると分かります。効いていれば mod のフックは動かず、mod の名前と allowManagedModsOnly を挙げる守りのメッセージが、トランスクリプトとデバッグログに出ます。mod が読み込まれてしまったら、管理設定が端末に届いているか(確かめ方は組織への導入と管理設定)と、下の「守りのオプション」の規則を見直します。

補足

早期アクセスのあいだに CLAUDE_CODE_ENABLE_FUNCTION_HOOKS を 0 にしていたなら、このオプションに置き換えてください。v2.1.287 以降はこの変数をどの値でも無視するので、0 のままでは mod はオンです。

既定で何が起きるか#

mod の設定を何も足さないときの状態です。

  • mod はオン:プラグイン設定が許すマーケットプレイスから、mod を含むプラグインを入れられます。--plugin-dir でディレクトリから読み込むこともできます
  • 組み込みの守りが先に入る:sec-default@builtin(/plugin とデバッグログでは cc-plugin-sec-default)という組み込みの mod が、ユーザーのどの mod よりも先に読み込まれ、ユーザーには止められません。入るのは、端末に管理設定があるとき、または Team か Enterprise のプランでサインインしているときです。API キー・Amazon Bedrock・Google Cloud の Agent Platform・Microsoft Foundry で認証する人には、管理設定のある端末でだけ入ります

守りが入った場所では、ユーザーの mod にできることが次のように分かれます。

ユーザーの mod が 中身
変えられない 管理されたフックが受け取るものと決めること、システムプロンプト、管理された CLAUDE.md などの指示、どの mod にも設定として読まれる内容、管理された MCP サーバーのツールと説明
承認できない deny ルールが拒む呼び出し(ルールがどの設定ファイルにあっても)。管理設定の PreToolUse フックの拒否も覆せない
承認できる ask ルールが確認するはずの呼び出しと、管理設定の外の PreToolUse フックが止めた呼び出し。自動モードでは、mod が承認した呼び出しは分類器の検査なしで動く
そのほかできること ファイルの読み書き・プロセスの起動・ネットワークへのリクエスト・ツール呼び出しやプロンプトの書き換え・ツール呼び出しの拒否・確認が出るはずの呼び出しの承認・画面の描画。どれもそのユーザーの権限で。守りはこれ以上の制限を足さない

deny ルールと管理されたフックが効くのは、Claude のツール呼び出しだけです。mod 自身の $.fs・$.process の呼び出しには効きません。Read(.env) を deny にしても、mod は $.fs.read でそのファイルを読めますし、そのファイルを読むプログラムを起動することもできます。これを止めるには、mod を読み込ませないか、ポリシー mod でその呼び出しを扱います(下の「自前の mod でポリシーを強制する」)。

守りのソースは、Claude Code のリポジトリの mods/sec-default ディレクトリで公開されています。

いまの管理が引き続き効くところ#

mod は、すでにある管理を置き換えません。ただし、どの管理も mod をサンドボックスに入れるものではありません。許した mod は、ユーザーのファイル・プロセス・ネットワークへのアクセスで動きます。

いまの管理 mod があるときの効き方
設定のフック 設定ファイルとプラグインの hooks/hooks.json の command・HTTP・prompt・agent のフックは、mod と並んで従来どおり動く。非推奨にはなっていない
deny ルール 守りが入る場所では、allowModsToOverrideDenyRules を設定しない限り、ユーザーの mod より優先される
管理設定の PreToolUse フック どの mod よりも先にツール呼び出しを見て、拒否は最終。mod が呼び出しを書き換えると、書き換え後の呼び出しに対してもう一度動くので、拒否は効いたまま
ほかの設定ファイルとプラグインの PreToolUse フック 最後の mod のあとに動く。ツールを動かさずに自分の結果を返す mod があると、これらは動かない
ネットワークの方針 組織が Web 取得をオフにしている、またはセッションで必須でない通信がオフだと、mod の $.http.fetch は拒否される。$.process.run で起動したプログラムには及ばず、そのプログラムはユーザー自身のアクセスで通信する
プラグインのインストール制限 mod もプラグインなので、strictKnownMarketplaces などの設定が、入れられるかどうかを決める
権限の確認画面 mod には変えられない。確認が出る前にツール呼び出しを承認・拒否することはできる
信頼の確認 対話セッションでは、まだ信頼していないディレクトリで確認に答えるまで、mod は読み込まれない
--safe-mode 組織のものも含め、入れた mod を止める。mod が問題の原因かを調べるのに claude --safe-mode を使う

mod をオンのままにするかを決める#

ユーザーが mod として読み込めるものは、いまのプラグイン管理で決まります。

いまのプラグイン管理 ユーザーが読み込める mod
なし どのマーケットプレイスの mod、--plugin-dir の任意のディレクトリの mod、セッション中に Claude が書いた mod
マーケットプレイスの許可リスト 許可したマーケットプレイスの mod と、--plugin-dir の任意のディレクトリの mod。セッション中に Claude が書いた mod は、許可リストが skills-dir を含むときだけ読み込まれる
許可リストと disableSideloadFlags 許可したマーケットプレイスの mod だけ

プラグインが読み込まれる経路と、それぞれを制御する設定は組織への導入と管理設定にあります。ユーザーが入れる前にマーケットプレイスの mod を点検するには、次の節を使います。

mod ができることを点検する#

実行せずに、mod にできることを見られます。シェルでプラグインのディレクトリに claude plugin validate を実行します。

bash
claude plugin validate ./some-mod

出力の2行が、mod のコードを表します。

text
  ❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}
  ❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.open

hooks: の行は mod が受け取るイベント、calls: の行は mod のコードが呼ぶ mod API のメソッドです。mod のコードで $ と書く mod API が、ファイル・プロセス・ネットワークへ届く手段です。このコマンドが読めない形で mod API を使う mod は、Claude Code が読み込みを拒みます。

calls: の行では、次を見ます。

呼び出し 意味
$.fs.read・$.fs.write ユーザーが届くどこでも、ファイルを読み書きする
$.process.run・$.process.spawn ユーザーとしてプログラムを起動する
$.http.fetch ネットワークにリクエストする
$.env.get・$.settings.read 環境変数と設定を読む(API キーがあるかもしれない)。出力の env reads: の行に変数名が出る
$.env.set Claude Code と、そのあとで起動するすべてのコマンドと MCP サーバーの環境変数を設定する。それらの動きが変わりうる。env writes: の行に変数名が出る
$.mcp.call 接続中の MCP サーバーのツールを、セッションの権限ルールのもとで呼ぶ
$.model.complete ユーザーのプランか API キーでモデルを呼ぶ
$.prompt.submit プロンプトを送る。ユーザー自身の言葉として送ることもできる
$.session.send 別のセッションかサブエージェントの Claude が読むメッセージを送る

hooks: の行では、次の意味があります。

  • tool.call、prompt.submit:すべてのツール呼び出し・プロンプトを見て、変えられる
  • session.append:保存前の会話の各行を書き換えられる
  • ui.render{component=AskUserQuestion}:Claude がユーザーに質問するダイアログを描き直せる
  • tool.check:権限の確認が出る前に、ツール呼び出しを承認・拒否できる

どのルールとフックがその答えより優先されるかは、上の「既定で何が起きるか」にあります。

どれだけ許すかを選ぶ#

mod の方針は、入れた mod を1つも許さないものから、ユーザーが選ぶどの mod も許し、自前の mod がほかを検査するものまであります。どれも数個の管理設定です。1列目から方針を選び、2列目の設定をします。

したいこと 設定
入れた mod は不可、フックはそのまま allowManagedModsOnly を設定し、自前の mod は配らない
入れた mod も、フックも一切なし(管理されたフックも) disableAllHooks を true にする
組織の mod だけ 守りの allowManagedModsOnly を設定し、組織の mod として数えられるように mod を入れる
承認したマーケットプレイスの mod なら可 マーケットプレイスの制限を保ち、disableSideloadFlags を true にする
どの mod も可、自前の mod がほかを検査する 自前の mod を入れ、prependPlugins で sec-default@builtin と並べて挙げる

4つの設定は、止める範囲の広さが違います。

設定 入れた mod ほかに止まるもの
allowManagedModsOnly 組み込みの守りのオプション。ユーザー自身の mod が読み込まれない なし(設定のフック・ステータスライン・/goal は動く)
allowManagedHooksOnly もっと広い。組織の mod と Claude Code に組み込みの mod だけが読み込まれ、ユーザーが自分で入れた mod は読み込まれない ユーザー自身の設定ファイルのフック
disableAllHooks いちばん広い。管理設定に書くと、組織のものも含め、入れたすべてのプラグインの mod が止まる 設定ファイルのすべてのフック(管理設定の PreToolUse フックも何も止めなくなる)、カスタムのステータスライン、/goal
disableSideloadFlags 起動時に --plugin-dir と --plugin-url を拒み、セッション中に Claude が書いた mod を読み込ませない 起動時の --agents と --mcp-config も拒む

allowManagedHooksOnly・disableAllHooks・disableSideloadFlags は、設定する前に設定キー一覧の各項目を読んでください。AGENTS.md への対応のような組み込みの mod は、どの設定の影響も受けず、それぞれ専用のスイッチで止めます。

mod が読み込まれなかった理由は、ユーザーのデバッグログに出ます。allowManagedHooksOnly と disableAllHooks の行はMod を作る・試すの「拒否のメッセージ」に、allowManagedModsOnly の行は同じページの「組み込みのガードのメッセージ」にあります。

組織の mod だけを許す#

組織の mod を動かし、ユーザーが持ち込む mod を止めるには、上の方針の表の「組織の mod だけ」の行の設定に disableSideloadFlags を足して配ります。次の managed-settings.json では、ユーザー自身の mod は拒まれてフックが1つも動かず、ポリシー mod がほかの mod より先に動きます。

json
{
  "extraKnownMarketplaces": {
    "acme-tools": {
      "source": { "source": "directory", "path": "/opt/acme/claude-plugins" }
    }
  },
  "enabledPlugins": { "acme-guard@acme-tools": true },
  "prependPlugins": ["acme-guard@acme-tools", "sec-default@builtin"],
  "pluginConfigs": {
    "cc-plugin-sec-default@builtin": {
      "options": { "allowManagedModsOnly": true }
    }
  },
  "disableSideloadFlags": true
}
  • extraKnownMarketplaces・enabledPlugins・prependPlugins:自前の mod を、組織のものと数えられるように入れ、守りをあとにして先頭で動かす
  • pluginConfigs:守りの allowManagedModsOnly を設定し、ユーザー自身の mod を拒む。設定のフック・ステータスライン・/goal は動く
  • disableSideloadFlags:起動時に拒むフラグを決める

テスト用の端末で確かめるには、シェルで claude --debug で起動し、デバッグログを読みます。

  • 自前の mod:hooks module の行に tier prepend がある
  • ユーザーが入れた mod:refused by cc-plugin-sec-default: mods are limited to your organization's by policy (allowManagedModsOnly) の行がある。それより前の行に、その mod の hooks module が loaded と出ているので、拒否の行を探す
  • プラグインのディレクトリ:claude --plugin-dir ./any-mod は、--plugin-dir is disabled by your organization's managed settings (disableSideloadFlags) で始まるメッセージで終了する

ユーザーが追加できるマーケットプレイスも制限するには、このファイルにマーケットプレイスの制限を組み合わせます。

mod にプラグインの管理を当てる#

mod はプラグインなので、組織のプラグインの管理のやり方は、mod を持つプラグインにも当てはまります。

  • フリート全体で読み込まれるプラグインを見る:監査と点検
  • 点検したプラグインをいつ更新してよいかを決める:更新ポリシーの設定
  • 試験導入などで、グループごとに別の方針にする:管理設定で強制できないことへの備え
  • プラグインのキーをどのアプリとセッションが適用するかを調べる:各アプリがプラグインのキーを適用する時期
  • CI とコンテナを設定する:コンテナと CI の初期設定
  • ユーザーが入れてよい mod を提供する:マーケットプレイスをホストする。GitHub・git・URL・npm のソースから Claude Code がコピーした mod は、組織のものではなくユーザーのものと数えられる

守りのオプション#

組み込みの守りにはオプションがあります。管理設定の pluginConfigs に、cc-plugin-sec-default@builtin をキーにして書きます(上の「ユーザーがインストールした mod を読み込ませない」の例と同じ)。

オプション 未設定のとき true のとき
allowManagedModsOnly ユーザー自身の mod が読み込まれる 組織の mod と、Claude Code に組み込みの mod だけが読み込まれる。ユーザーが入れた mod や --plugin-dir で指した mod を含め、ほかはすべて拒まれる
allowModsToOverrideDenyRules deny ルールがユーザーの mod より優先される ツール呼び出しを承認するユーザーの mod が、deny ルールが拒む呼び出しも承認できる

オプションが効かないのは、次のどれかに当たるときです。

  • キーの id が違う:オプションは cc-plugin-sec-default@builtin のもとからだけ読まれます。prependPlugins は sec-default@builtin でも通りますが、pluginConfigs では通りません
  • 管理設定の外に書いた:ユーザー・プロジェクト・ローカルの設定ファイルや --settings のファイルでは、設定することも緩めることもできません
  • 守りが読み込まれていない:prependPlugins を設定するなら、そのリストに守りを入れます。守りが入らない場所では、どちらのオプションも効きません

守りは安全側に倒れます。管理設定を読めないときはユーザーの mod をすべて読み込みの時点で拒み、ユーザーの mod が承認した呼び出しの deny ルールを調べられないときは、その呼び出しを拒みます。

組織自身の mod を動かす#

自前の mod を全ユーザーに配り、ユーザーの mod の前とあとのどちらで動かすかを選び、ポリシーの強制に使えます。

組織の mod を入れ、順番を決める#

組織の mod は、ユーザーの mod が止められている場面でも読み込まれ、先に動かせます。そのため、次の3つがすべてそろった mod だけが組織のものと数えられます。

  • 管理設定の enabledPlugins が、その mod のプラグインを true にしている
  • 管理設定が、プラグインのマーケットプレイスを、ユーザーの端末上のディレクトリとして絶対パスで指している(extraKnownMarketplaces の項目がこれに当たり、ユーザーにもマーケットプレイスを登録する)
  • マーケットプレイスがプラグインを相対パスで挙げていて、Claude Code がそのディレクトリからその場で読み込む

実際には、デバイス管理でマーケットプレイスのディレクトリを全端末の同じパスへ置きます。そこに書き込める人は mod を書き換えられるので、そのディレクトリと上のすべてのディレクトリを、管理設定のファイルと同じく管理者だけが書けるようにします。claude.ai の管理コンソールから配る管理設定は、キーは運べてもディレクトリは置けません。

ディレクトリには、マーケットプレイスのマニフェストとプラグインを置きます。

text
/opt/acme/claude-plugins/
├── .claude-plugin/
│   └── marketplace.json
└── plugins/
    └── acme-guard/
        ├── .claude-plugin/
        │   └── plugin.json
        └── hooks/
            ├── hooks.json
            └── register.js

マニフェストは、そのディレクトリからの相対パスでプラグインを挙げます。

json
{
  "name": "acme-tools",
  "owner": { "name": "Acme" },
  "plugins": [
    { "name": "acme-guard", "source": "./plugins/acme-guard", "description": "Acme policy mod" }
  ]
}

逆に、Claude Code がキャッシュへコピーするプラグイン(GitHub・git・URL・npm のソースのものはすべて)は、管理設定の enabledPlugins で有効にしてもユーザーのものと数えられます。その mod はユーザーの mod の中で動き、prependPlugins・appendPlugins からは読み飛ばされ、allowManagedModsOnly や allowManagedHooksOnly のもとでは読み込まれません。ユーザーのデバッグログには、プラグインの id と is enabled by managed settings, but で始まる行が出ます。

Claude Code は、ツールを動かすなど何かをする前にイベントを起こし、各 mod へ順に渡します。組織の mod は、どこにも挙げなくてもユーザーの mod より先に動きます。位置を決めるには、id(プラグイン名、@、マーケットプレイス名。例:acme-guard@acme-tools)を次のどちらかに書きます。

設定 動く位置 見えるもの
prependPlugins ユーザーのすべての mod より前 すべてのイベントを先に、すべての結果をあとから見る。イベントを変える・拒む・ユーザーの mod を飛ばすことができる
appendPlugins ユーザーのすべての mod のあと ユーザーの mod が先へ渡したイベントだけを、渡された形で見る

次の例は、/opt/acme/claude-plugins のマーケットプレイス acme-tools から acme-guard を有効にし、先頭で動かして、組み込みの守りをその次に置きます。

json
{
  "extraKnownMarketplaces": {
    "acme-tools": {
      "source": { "source": "directory", "path": "/opt/acme/claude-plugins" }
    }
  },
  "enabledPlugins": { "acme-guard@acme-tools": true },
  "prependPlugins": ["acme-guard@acme-tools", "sec-default@builtin"]
}

path は .claude-plugin/marketplace.json を含むディレクトリの絶対パスです。enabledPlugins はこの管理設定を受け取る全ユーザーで acme-guard をオンにし、prependPlugins は書いた順のとおり、acme-guard、守りの順で、どちらもユーザーの mod より前に並べます。

どこで動いているかは、その端末で claude --debug でセッションを始め、デバッグログで mod の id を探すと分かります。

  • hooks module acme-guard@acme-tools loaded と tier prepend:組織の mod と数えられ、先頭で動いている
  • 同じ行に tier user:ユーザーの mod として扱われている。2行目に prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped があれば、リストから読み飛ばされている

2つのリストには、次の規則があります。

  • 既定の並びを置き換える:管理設定に prependPlugins を書いたら、守りを残すために sec-default@builtin も挙げます。守りは組み込みなので enabledPlugins の項目は要りません
  • 組織のものでない id は読み飛ばされる:管理設定でも、組織の mod の条件を満たさないプラグインの id は効きません
  • リポジトリからは設定できない:どちらも管理設定から読み、リポジトリの設定ファイルからは読みません。ユーザーが ~/.claude/settings.json で自分の mod を並べられるのは、管理設定がなく、Team・Enterprise のプランでサインインしていない端末だけです。それ以外ではユーザー設定のこの2つは無視され、守りを足すことも外すこともできません

自前の mod でポリシーを強制する#

ユーザーの mod をすべて締め出すだけなら、allowManagedModsOnly で足ります。一部のユーザーの mod だけを許したいとき、または mod のしたことを記録したいときに、ポリシー mod を書きます。手がかりは2つです。

  • plugin.register イベント:ほかの mod が読み込まれる直前に、claude plugin validate が出すのと同じ一覧を受け取ります。prependPlugins にある mod は、これを見てその mod を拒めます
  • API の呼び出しの名前のフック:$. を除いたメソッド名でフックを登録すると、ほかのすべての mod のその呼び出しを記録・拒否できます。fs.write のフックなら、すべての $.fs.write の呼び出しを見ます

次の acme-guard/hooks/register.js は、自分のコードで $.process.run か $.process.spawn を呼ぶユーザーの mod を拒みます。あわせて、ツール呼び出しと、mod が書いたファイルをデバッグログに記録します。先頭で動くので、ユーザーの mod が変える前の要求が記録されます。

javascript
// どのユーザーの mod にも呼ばせないメソッド。namespace.method の形で書く
const BLOCKED_CALLS = ['process.run', 'process.spawn']

export function register(on) {
  // ほかの mod が読み込まれようとするたびに動く
  on('plugin.register', async ($, e, next) => {
    const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
    if (e.tier === 'user' && blocked.length > 0) {
      // refuse を返すと mod は読み込まれず、文字列が理由になる
      return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }
    }
    return next(e)
  })

  // ツール呼び出しを記録し、変えずに通す
  on('tool.call', async ($, e, next) => {
    $.ui.log('audit tool.call ' + e.tool, { to: 'debug' })
    return next(e)
  })

  // ファイルを書いた mod の名前とパスを記録する。パスは mod が決めるので引用符で囲む
  on('fs.write', async ($, e, next) => {
    $.ui.log('audit fs.write by ' + next.origin.plugin + ' ' + JSON.stringify(e.path), { to: 'debug' })
    return next(e)
  })
}

記録の2つのフックは何も変えず、audit tool.call Bash や audit fs.write by reader "/tmp/notes.md" のような行を書くだけです。mod の名前を先に置き、パスを引用符で囲むので、mod が選んだパスが行のほかの項目になりすますことはありません。

plugin.register のフックが読むイベントのフィールドは2つです。

フィールド 中身
e.tier mod が動く場所。prepend・user・append・builtin のどれか。人が入れた mod はすべて user
e.uses.calls mod が呼ぶ mod API のメソッド。claude plugin validate が出す $. を除き、process.run のように namespace.method の形

拒まれた mod は読み込まれず、ユーザーのデバッグログに refused by acme-guard: と自前の理由で終わる行が出ます。プラグインのディレクトリをホットリロードするセッションでは、トランスクリプトにも出ます。mod 全体ではなく1つの呼び出しだけを止めるなら、その呼び出しの名前のフックから { deny: 'your reason' } を返します。記録をデバッグログ以外へ送るなら、同じフックから $.http.fetch を呼びます。

補足

自前の mod なしで動くセッションもあります。入れた mod を動かすワーカースレッドが3回クラッシュすると、自前の mod も含め、組み込みでない mod はすべて外れ、ユーザーが /reload-plugins を実行するか新しいセッションを始めるまで戻りません。ユーザーが --safe-mode で起動したときも、自前の mod は動きません。

mod に要るファイルと、このポリシー mod のテストは、Mod を作る・試すにあります。

検査が失敗したときに mod を拒む

plugin.register のフックが例外を投げるか制限時間を超えると、そのフックは飛ばされ、検査中の mod は読み込まれます。つまり開けた側に倒れます。拒む側に倒すには、検査を名前付きの関数へ移し、.catch で拒否を返します。次は plugin.register の部分だけです。記録の2つのフックは register に残します。

javascript
const BLOCKED_CALLS = ['process.run', 'process.spawn']

// 上と同じ検査を、名前付きの関数へ移したもの
async function checkMod($, e, next) {
  const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
  if (e.tier === 'user' && blocked.length > 0) {
    return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }
  }
  return next(e)
}

export function register(on) {
  // checkMod が例外を投げるか制限時間を超えたときだけ動く
  on('plugin.register', checkMod).catch(async ($, e, next) => {
    // 組織の mod と組み込みの mod は通す
    if (e.tier !== 'user') return next(e)
    // 検査できなかったユーザーの mod を拒む
    return { refuse: 'Acme policy check failed, so this mod was not loaded' }
  })
}

検査に失敗した mod は読み込まれず、拒否の行に2つ目の理由が出ます(refused by acme-guard: Acme policy check failed, so this mod was not loaded)。user 以外の層の mod は next(e) で通すので、組織が挙げた mod は止まりません。ほかのイベントでの .catch はMod のリファレンスにあります。

次に読むページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧