Claude Code の Mod は、あなたの権限で動くコードです。ファイルを読み書きし、プログラムを起動し、通信できます。しかも、Mod にはサンドボックスがありません。便利な Mod ほど画面とツール呼び出しの深いところに入り込むので、他人が作ったものは、入れる前に中身を確かめる習慣をつけてください。この記事では、実行せずにできる確認の手順を、チェックリストにまとめます。内容は Anthropic の公式ドキュメントと照合してあり、validate の出力は Claude Code 2.1.289 で確かめました。
先に結論
- 入れる前に、リポジトリを clone して
claude plugin validate ./フォルダを実行します。Mod が受け取るイベント(hooks:)と、呼び出す機能(calls:)が、実行せずに分かります。 - 危険度は、単独の機能より組み合わせで決まります。「秘密を読める」と「通信できる」が揃うと、外に持ち出せます。
validateが教えるのは「何を呼ぶか」までで、「どこへ・何を」は教えません。通信先やコマンドの中身は、コードを読んで確かめます。- 入れるときは、自分が読んだコミットを入れます。作者が更新するたびに中身が変わる入れ方は避けてください。
- ModsCode は、どの Mod の安全性も保証しません。最終判断はあなたです。
Mod が届く範囲
公式ドキュメントは、読み込まれた Mod にできることを次のように整理しています。
- あなたとしてマシン上で動く:あなたのユーザーが読み書きできるファイルをどこでも読み書きし、プログラムを起動し、通信できます。
- 秘密を読む:環境変数と設定ファイルを読めます。そこにある API キーも含みます。
- セッションを見る:送ったプロンプトと、Claude のすべてのツール呼び出しが見えます。
- セッションを変える:プロンプトやツール呼び出しを書き換えられ、あなたが入力したかのようにプロンプトを送れます。別のセッションにメッセージも送れます。
- 確認なしで動く:ツール呼び出しを、あなたが聞かれる前に許可できます。
- 使用量を使う:あなたのプランや API キーで、モデルを呼べます。
サンドボックスを有効にしていても、守られるのは Claude が実行する Bash コマンドだけです。Mod が起動したプロセスは、その外で動きます。一方で、Mod にも変えられないものがあります。それは権限確認のプロンプトの表示内容です。
チェック 1:出どころ
- 作者とリポジトリは、誰が、いつから、どう更新しているか。
- マーケットプレイスは、信頼できる場所か。自分のものか、組織のものか、知らない人のものか。
- 入れる版は固定できるか。マーケットプレイスの追加時に、
#v1.2.0のようにタグを固定できます。作者の最新コミットを追う設定だと、作者が push するたびに、中身が変わります。
チェック 2:validate で、受け取るイベントと呼ぶ機能を一覧にする
リポジトリを clone してから、次を実行します。Mod のコードは実行されません。
claude plugin validate ./some-mod出力の最後の方に、次のような行が出ます(公式ドキュメントの例です)。
❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}
❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.openhooks: は Mod が受け取るイベントで、calls: は呼び出す Mods API です。Claude Code は、validate が読み取れない形で Mods API を使う Mod の読み込みを拒否します。そのため、一覧に出ない呼び出しを隠し持った Mod は、そもそも読み込まれません。
チェック 3:calls: の行を読む
| 見つけたら | 意味 | 次に確かめること |
|---|---|---|
$.fs.read、$.fs.write | あなたが読み書きできる場所を、どこでも読み書きする | どのパスを読み書きするか。設定ファイルや鍵のフォルダを読んでいないか |
$.process.run、$.process.spawn | あなたとしてプログラムを起動する | 起動するコマンドと引数は何か。シェル経由(sh -c)で、文字列を組み立てていないか |
$.http.fetch | 通信する | 宛先はどこか。何を送るか |
$.env.get、$.settings.read | 環境変数や設定を読む。API キーが入っていることがある | どの変数を読むか(env reads: の行に名前が出る) |
$.env.set | Claude Code と、その後に起動するすべてのコマンドや MCP サーバーの環境変数を変える | どの変数か(env writes: の行)。プログラムの動作が変わらないか |
$.mcp.call | つながっている MCP サーバーのツールを呼ぶ | どのサーバーのどのツールか |
$.model.complete | あなたのプランや API キーで、モデルを呼ぶ | どれくらいの頻度で、何を送るか |
$.prompt.submit | プロンプトを送る。あなたの言葉として送ることもできる | 本人の言葉として送っていないか(asUser) |
$.session.send | 別のセッション、サブエージェント、チームメイトに、メッセージを送る | 何を送るか |
私たちが作った検証用の Mod でも、$.process.run (via showBranch) のように、関数を経由した呼び出しの名前は出ますが、実行するコマンドの中身は出ませんでした。validate が示すのは機能の名前までです。引数は、コードを読んで確かめてください。
チェック 4:hooks: の行を読む
| 見つけたら | 意味 |
|---|---|
tool.call | すべてのツール呼び出しを見られ、変えたり、止めたり、代わりに答えたりできる |
prompt.submit | あなたが送るすべてのプロンプトを見られ、書き換えられる |
session.append | 会話に残るすべての行を、保存される前に書き換えられる |
tool.check | 権限の確認が出る前に、ツール呼び出しを許可または拒否できる |
ui.render{component=AskUserQuestion} | Claude がユーザーに質問するときのダイアログを、描き換えられる |
tool.check を持つ Mod は、特に注意が必要です。ask ルールで確認が出るはずの呼び出しや、設定ファイルのフックが止めたはずの呼び出しを、許可してしまえます。deny ルールで拒否される呼び出しは、ガードが読み込まれている環境では許可できません(次の節)。
危険な組み合わせの例
次は、私たちの判断による目安です。公式が危険と断定したものではありません。
$.env.get+$.http.fetch:環境変数を読んで、外に送れる形です。API キーの持ち出しが可能な組み合わせなので、何を読んで、どこへ送るのかを必ず確認します。$.fs.read+$.http.fetch:ファイルを読んで、外に送れます。読むパスと宛先を確認します。$.session.messages(会話の読み取り)+$.http.fetch:会話の内容が外に出る形です。$.process.run+sh -c:文字列を組み立ててシェルに渡すと、意図しないコマンドが動く余地が増えます。tool.check+ 無条件の許可:確認を出さずに通す動きがないか確認します。$.prompt.submit(asUser: true):あなた自身の言葉として Claude に指示を出せます。
反対に、ui.render だけで描くだけの Mod や、$.store に自分の設定を保存するだけの Mod は、触れる範囲が小さくなります。
チェック 5:コードを読む
多くの Mod は、数百行までの 1〜2 ファイルです。Mod が外に出る呼び出しは、すべて $ を通ります。ファイルを開いて、$.http、$.process、$.fs、$.env を検索し、なぜそこにあるのかを確かめてください。この手順は、ModsCode の英語版の ルールのページ にも、3 段階(読む・Claude Code に一覧を出させる・読んだコミットを入れる)でまとめています。Claude に「この Mod のコードを読んで、通信先と読み取るファイルを一覧にして」と頼むのも有効ですが、結論を鵜呑みにせず、自分でも該当の行を開いてください。
組織のガードで守られること・守られないこと
Claude Code には、sec-default という内蔵のガードがあり、/plugin では cc-plugin-sec-default と表示されます。管理設定のあるマシン、または Team / Enterprise プランでサインインしているユーザーでは、ユーザーの Mod より先に読み込まれます。守られるのは、組織が管理する次の範囲です。
- 管理設定のフックが受け取るもの・決めること
- システムプロンプト、組織の管理する
CLAUDE.mdなどの指示 - 管理 MCP サーバーのツールと説明
また、ガードが読み込まれている環境では、ユーザーの Mod は、deny ルールで拒否される呼び出しを許可できません。ただし、ここにも穴があります。deny ルールは、Claude のツール呼び出しに適用されますが、Mod 自身の $.fs や $.process の呼び出しには適用されません。Read(.env) を拒否していても、Mod は $.fs.read でそのファイルを読めます。この守りは、あなた個人の環境では当てにしないでください。
入れた後にできること
/pluginのmods activeで、読み込まれた Mod の名前を確認する。- おかしな挙動があれば、
claude --safe-modeで起動し、Mod のせいかを切り分ける。 - 使わない Mod は削除する。
- 更新するときは、更新前に、もう一度
validateを実行する。hooks:とcalls:が増えていたら、何が増えたかを確かめる。
まとめ
入れる前の確認は、①出どころ、②validate で hooks: と calls: を見る、③危険な組み合わせを探す、④コードを読む、⑤読んだコミットを入れる、の 5 つです。探す段階から条件を絞りたいなら、ModsCode の MCP の search_mods で、通信やプログラム起動をする Mod を除外して探せます(使い方)。入れ方は Mod のインストール方法 に書きました。組織の管理者の方は 組織で Mods を管理する をご覧ください。原文は 公式のドキュメント です。