AIDive

Claude Code mod 10個を検証、残す3つと消す7つ

AIDive · 公開

コーディングエージェントAI セキュリティ

イントロ: 10個のmod、残るのは3つ

Claude Code mods は、plugin の中に入れる TypeScript 関数で、Claude Code の画面を描き直したり、動作そのものを書き換えたりできます。10月初めのローンチから1日のうちに、3本の別々の動画ツアーが開発者に「10個とも入れろ」と勧めました。そのうち2人の作り手は、一部の mod は何も節約しないとカメラの前で認めていますが、1つでも実際に測った人はいません。このテストは測ります。話題の mod 10個すべてを実際の1週間の仕事で動かし、オーバーヘッド、節約量、残すか消すかの判定を数字で出しました。結論を先に言うと、現役の開発者のマシンに置く価値があるのは10個中3つだけで、そのうち1つは回答のたびに、こっそり token を消費しています。

ブームと、今回動かしたもの

Anthropic 自身の定義は一言で言えます。mod とはイベントにフックする関数で、イベントの前にも後にも、あるいは代わりにも動かせます。イベントとは、ツール呼び出し、送信された prompt、描画される画面の一部のことです。mod はただの TypeScript で、ほかと同じように入れる plugin の中に入っています。

ローンチのツイートは約1日で400万回表示を超え、2万のいいねがつき、ブックマークは返信とリポストを合わせた数より多くなりました。ローンチから2日後には、コミュニティのカタログがすでに数百のリポジトリにまたがる1,000以上の公開 mod をスキャンしていました。

このテストの検証環境は、実際の1週間の仕事です。4つのプロジェクトにまたがる85セッション、900近い prompt、6,000回弱のツール呼び出し。すべての mod をバリデーターの監査にかけ、何にフックして何に触れるかを一覧にしました。そのうえで、現行リリース、同じマシン、クリーンなベースラインに対して、すべての mod に同じタスクを実行させています。

結果の大きな割れ方はこうです。10個のうち6つは実行時に測れるコストがゼロ、3つは実際の時間か token を消費し、1つは自分が掲げるたった一つの約束を破ります。

装飾ティアを測る

静かな6つは、接続のばらつきの範囲に収まります。ゴールメーター、リポジトリのヒートマップ、フライトレコーダー、モデルルーター、セッションのブックマーク、自動ハンドオフは、約4秒のベースラインタスクに対して、0.25秒短縮から0.2秒増加の間に収まりました。

Mod 実行時の差 備考
ゴールメーター ばらつきの範囲内 装飾ペイン
リポジトリのヒートマップ ばらつきの範囲内 読まれたファイルが光る
フライトレコーダー ばらつきの範囲内 ターンのライブタイムライン
モデルルーター ばらつきの範囲内 subagent で効果が出る、判定を参照
セッションのブックマーク ばらつきの範囲内 権限の範囲が広い
自動ハンドオフ アイドル時に約70 ms コンテキストのしきい値で引き継ぎを1回書き込む

見た目は申し分なく、何も壊れませんでした。すべての設定のすべての実行が、タスクを正しく完了しています。ヘッドレスでは描画するものがないのでコストはゼロです。ターミナルではこれらのペインが毎秒最大30回再描画されるので、装飾ティアの本当のコストは token ではなく、あなたの注意力です。

ここから先は笑えなくなります。バリデーターの監査によると、ブックマークの mod はモデルを呼び出し、マシン上でプロセスを起動し、ファイルを書き込めて、環境変数から設定パスを読み取ります。隠されてはいませんし、悪意もありませんが、ブックマークにしては権限が大きすぎます。ここで4つが外れます。ゴールメーター、ヒートマップ、フライトレコーダーは、測れる利点がゼロの装飾だからです。ブックマークの mod は、得るものより多くを要求するからです。

目玉は毎ターン課金してくる

サジェストエンジンは、どの動画も最初にデモする mod です。回答が終わると、composer の上に prompt の候補が3つ現れ、数字を押すと下書きが自動で埋まります。仕組みは作者自身がドキュメントに書いています。ターンが完了するとセッションを fork して、モデルにその候補を作らせます。fork はセッションの prompt キャッシュを共有するので、コストは短い返信1回分程度です。ツアー動画は、この一行に一度も触れません。

検証環境での実測では、対象になる回答1回あたり出力 token が約250増え、実時間が3秒近く増えました。対象になる回答とは、ほぼすべての回答のことで、約80文字を超えるものはすべて該当します。しかも fork には画面ごとのゲートがありません。候補が描画されるのはターミナルだけなのに、fork はどこでも発火し、何も描画できないヘッドレス実行でも動きます。

Mod 実測コスト 発火するタイミング
サジェストエンジン 対象の回答1回につき出力 token 約250 + 約2.9秒 約80文字を超えるすべての回答、ヘッドレスを含む
キャッシュキーパー 1ターンあたり約1.5秒 + ウォーミングモードのモデル呼び出し 毎ターン、何時間もウォーミング

キャッシュキーパーも同じ構造です。1ターンあたり約1.5秒かかり、ウォーミングモードでは、prompt キャッシュが冷えないように何時間も小さなモデル呼び出しを使い続けます。サブスクリプションプランではキャッシュの有効期間がすでに1時間あるので、プランがほぼ解決した問題のために ping の料金を払っていることになります。どちらもコストを明記した誠実な設計ですが、どちらも毎ターンにかかる税金で、インストール一覧に値段は載っていません。どちらもマシンから外します。

modとhook、同じ仕事で比較

Claude Code にはもともと hook がありました。同じイベントで発火する、設定に書いたシェルスクリプトです。ドキュメントは表の1行で選び方を答えています。mod は画面とイベントの書き換え用、hook はすでに持っているスクリプトでブロック、許可、ログを行う用です。

測れる違いはプロセスの起動です。設定の hook は、ツール呼び出しのたびに新しいプロセスを起動します。このマシンで計測すると、何もしないシェル hook で約8 ms、Node を起動する hook で約43 ms かかります。スクリプトが何かを始める前の時間で、毎回の呼び出しで発生します。検証した週のツール呼び出し5,993回で換算すると、インタプリタの起動だけで4分以上です。mod はこれを一切払いません。ハンドラはエンジン自身のプロセス内で動き、エンジンのログでは、この受け渡しは約1ミリ秒に収まっています。

ハンドラ 1回あたりのコスト 5,993回の1週間分
シェル hook(何もしない) 約8 ms 約48秒
Node hook(何もしない) 約43 ms 約4.3分
Mod(プロセス内) 約1 ms 約6秒

実際に出ている唯一の移行報告も同じことを言っています。27本のシェル hook が5つの mod にまとまり、毎回のプロセス起動もなくなりました。残るルールはこうです。画面やイベントの書き換えは mod。信頼できるスクリプトでブロック、許可、ログを行うなら hook。ただしプロセス起動のコストが効くのは数千回の呼び出しからです。何度も繰り返す知識は skill。読んだことのある hook は、読んでいない mod に勝ります。

何もしないガード

考えられるいちばん単純な安全 mod は、すべてのシェルコマンドを監視するガードです。今回は、わざとクラッシュするように書きました。Claude Code にマーカーファイルを作らせると、ガードは例外を投げ、それでもコマンドは実行されてファイルができました。これはバグではなく、ドキュメントに書かれたデフォルトです。hook が例外を投げる、タイムアウトする、形の違う値を返すと、Claude Code はそれを飛ばして先へ進みます。壊れた装飾でセッションが動かなくなるべきではありませんが、壊れたガードは黙って fail open になり、誰も読まないデバッグログに1行残るだけです。

直し方は、deny を返す catch ハンドラを1つ足すことです。同じクラッシュするガードに catch を付けると、コマンドは拒否され、失敗の内容も示されます。1行で、ガードが fail open か fail closed かが決まります。ドキュメントはまさにこのパターンを載せていますが、入れている人はほとんどいません。

あるコミュニティのチームが現行リリースでこのケースをやり直し、モデルの発言ではなくマーカーファイルで判定しました。catch パターンは3回中3回とも fail closed でした。ただし1つの経路は今も黙って壊れています。呼び出しがすでに転送されたあとに返した deny は、ツールを止めません。モデルには書き込みが失敗したと伝えられたのに、ファイルは3回中3回とも作られました。

この問題に名前を付けたフィールドレポートでは、何日もガードを動かしていましたが、有効で、ロードされていて、何もしていませんでした。古いフラグが裏でガードを切っていたのです。緑のステータスチップが3つ並び、その下でカウンターは0のまま止まっていました。健康な状態と見分けがつかない沈黙です。

衝突ガードが最初の「残す」を勝ち取ります。2つの開いたチャットが同じファイルを編集するという現実の問題を解きます。失敗の仕方も派手で、ダイアログで確認を求め、黙って許可することはありません。編集に約0.5秒かかり、prompt には何も加えません。入れてください。それでも catch ハンドラは付けましょう。

貼り付けたときに許可するもの

Anthropic はローンチ当日にはっきり書いています。mod は Claude Code 自身と同じ権限でマシンにアクセスします。サンドボックスはありません。パソコンに入れるほかのコードと同じ心構えで入れてください。具体的には、mod はあなたとしてマシン上で動けます。API キーのある環境変数や設定を読み、すべての prompt とすべてのツール呼び出しを見て、書き換え、あなたに確認が来る前にツール呼び出しを承認し、プランの利用枠を自分のモデル呼び出しに使えます。

注意深いユーザーでも引っかかる落とし穴が2つあります。permission rule が縛るのは Claude のツール呼び出しで、mod 自身の呼び出しではありません。Claude に env ファイルを拒否しても、mod は自前のファイルアクセスでそのファイルを直接読めますし、読めるプログラムを起動することもできます。ネットワークポリシーにも同じ抜け穴があります。Web 通信を切ると mod 自身の fetch 呼び出しは拒否されますが、mod が起動した子プロセスはフルアクセスでネットワークに届きます。すべてに先立ってロードされる組み込みのガード mod はありますが、それは管理されたマシンの、Team または Enterprise の席だけです。個人サブスクリプションの1席には何もありません。

これは理論の話ではありません。ローンチの数日後に、ある利用者が概念実証を公開しました。ボタンを押すとプログラムを起動し、ホームディレクトリに書き込む mod で、カタログから警告なしにインストールできました。彼の指摘はそのとおりです。カタログはアプリストアのように見えるので、存在しない審査があるかのような印象を与えます。別の hook のバグでは、1日のあいだ subagent の分離が壊れていました。メンテナーは大きなやらかしだと認め、1リリース後に修正されました。

カタログ自身による1,000以上の公開 mod のスキャン結果は次のとおりです。400以上がホストのプロセスを起動し、400近くがファイルを読み、300以上がすべてのツール呼び出しを見ています。カタログの但し書きが正しい見方です。これは判定ではなく、足跡です。PR トラッカーなら git を実行する必要があります。対策にかかるのは2分です。何かを有効にする前にバリデーターを実行し、逃げ道を知っておくこと。1セッション限りのセーフモードと、インストール済みの hook をすべて止める1つの設定があります。

3つ残して、7つ消す

10個のうち3つが居場所を勝ち取りました。衝突ガード、モデルルーター、自動ハンドオフです。

Mod 判定 根拠の数字
衝突ガード 残す 編集に約0.5秒、失敗が目に見える、prompt には何も加えない
モデルルーター 残す subagent が安いモデルで課金され、価格は3分の1
自動ハンドオフ 残す 70 msの無負荷、しきい値で引き継ぎを1回書き込む
サジェストエンジン 消す 対象の回答ごとに出力 token 約250 + 約2.9秒
キャッシュキーパー 消す 1ターンあたり約1.5秒、1時間のキャッシュ期間に対するウォーミング ping
録画モード 消す 画面は隠すがディスクは隠さない
ゴールメーター 消す 装飾、測れる利点はゼロ
リポジトリのヒートマップ 消す 装飾、測れる利点はゼロ
フライトレコーダー 消す 装飾、測れる利点はゼロ
セッションのブックマーク 消す 役割をはるかに超える権限

モデルルーターには証拠があります。大きなモデルのセッションが subagent を1つ起動し、実行自身の使用量表示で、その subagent が安いモデルで課金されていました。同じ小さな仕事で、価格は3分の1です。subagent を多用する週なら、これは実際のお金になります。自動ハンドオフは、効く瞬間までコストがかかりません。無負荷のオーバーヘッドは70ミリ秒で、コンテキストのしきい値を超えたときに、コールドスタート用の引き継ぎを1回だけ書き込みます。この波の作り手の1人は、手動のハンドオフボタンは時間をあまり節約しないと認めていますが、しきい値での自動書き込みなら、実際に節約になります。

このテストのあとに残る規律はこうです。何かを有効にする前にバリデーターの監査を読むこと。すべてのガードに catch ハンドラを付けて fail closed にすること。デモの録画は、隠す mod を信用せず、セーフモードで行うこと。限界は現実のものです。1週間、1台のマシン、1つのワークロード、小さいモデルでの測定点ごとに3回の実行。あなたの3つは違うかもしれませんが、見つけ方はもう分かっています。

出典

よくある質問

Claude Code mods とは何ですか?
mod は Claude Code の plugin の中に入れる TypeScript 関数で、ツール呼び出し、送信した prompt、描画される画面の一部といったイベントにフックし、その前でも後でも、代わりにでも動かせます。画面を描き直したり、Claude Code の動作を書き換えたりできます。
実際に入れる価値のある Claude Code mods はどれですか?
実際の1週間の仕事で測った結果、話題の10個のうち残す価値があったのは3つです。衝突ガード(2つのチャットが同じファイルを編集するのを防ぎ、失敗が目に見える)、モデルルーター(subagent が3分の1の価格で課金される)、自動ハンドオフ(アイドル時のコストは70 ms、引き継ぎの書き込みは自動で1回)です。
Claude Code mods は token を消費しますか?
ほとんどは消費しませんが、サジェストエンジンは対象の回答のたびにセッションを fork し、1ターンあたり出力 token 約250と3秒近い実時間がかかります。キャッシュキーパーのウォーミングモードも、何時間も小さなモデル呼び出しを使い続けます。
Claude Code mods は安全に入れられますか?
mod は Claude Code 自身と同じ権限でマシンにアクセスし、サンドボックスもありません。permission rule が縛るのは Claude のツール呼び出しで mod 自身の呼び出しではないため、mod は Claude には拒否しているファイルを読んだり、プロセスを起動したりできます。何かを有効にする前に、バリデーターの監査を実行してください。
Claude Code の mod と hook の違いは何ですか?
どちらも同じイベントで発火します。hook はシェルスクリプトで、ツール呼び出しのたびに新しいプロセスの起動コストがかかります(シェルで約8 ms、Node で約43 ms)。mod のハンドラはエンジンのプロセス内で動き、約1ミリ秒です。画面やイベントの書き換えは mod、信頼できるスクリプトでブロック、許可、ログを行うなら hook を使います。
Claude Code のガード mod がクラッシュするとどうなりますか?
デフォルトでは fail open になります。Claude Code は壊れたハンドラを飛ばし、コマンドはそのまま実行され、デバッグログに1行残るだけです。deny を返す catch ハンドラを足すとガードは fail closed になり、ドキュメントにもまさにこのパターンが載っています。

関連動画