Claude Code にディレクトリの掃除を頼むと、削除コマンドの前に確認ダイアログが出ます。ただしどのファイルが消えるのかは表示されません。この「判断の前」に割り込めるようにするのが、2026 年 10 月 1 日にアナウンスされた Mods です。本稿は公式アナウンスとドキュメント(2026-10 時点、v2.1.287 以降が対象)に基づき、Skill・MCP・Mods の役割の違いを整理し、最初の Mod を動かす手順をまとめます。筆者は未検証のため、実際の挙動は手元のバージョンを優先してください。
3 層の違い
- Skill:モデルに見せる操作マニュアル。やり方を教えるが、実行を止められない。
- MCP:データベース・API・ブラウザを接続する外付けレイヤー。道具は増えるが、判断の流れは変わらない。
- Mods:Claude Code 内部のイベントに掛ける TypeScript 関数。ツール呼び出し・プロンプト・モデルリクエスト・UI に対して、観測・書き換え・遮断の 3 つができる。
公式定義:「small TypeScript functions that change how Claude Code works」。プラグインとして配布・インストールされ、CLI とデスクトップアプリの両方で動きます。
最初の Mod を動かす(2 セッション)
セッション 1:Claude に書かせる。
依頼文:
「現在の git ブランチを入力ボックスの上に表示する Mod を作って」
流れ:
1. Claude がプラグイン雛形を生成
(.claude-plugin/plugin.json + hooks/hooks.json + hooks/register.js)
2. 最初のファイル保存時にホットリロードの承認を求められる
3. ターン終了後、入力ボックスの上にブランチ名が表示される
セッション 2:1 行変える。
表示内容をブランチ名から「このセッションのツール呼び出し回数」へ変更して保存。ターン終了で反映されます。Node.js もバンドラも不要で、.js / .ts が直接読み込まれます。
Mods がフックできる場所
- tool.call:ツール実行前に割り込み。deny を返すと、その理由がツール結果として Claude に読まれます。引数の書き換えや、元ツールを無視して自前の結果を返すことも可能。
- prompt 系:送信前の入力書き換え、システムプロンプトのセクション単位の差し替え・削除。
- turn.step:モデルリクエスト直前に model フィールドを変更可能(ドキュメント上の能力。タスク別ルーティングの公式サンプルはまだない)。
- ui.render:サイド pane や入力ボックス上部の帯、ツール行やスピナー描画の差し替え。
ハンドラは on(event, matcher, handler) で登録し、($, e, next) のミドルウェアチェーンで動きます。next(e) で観測、next({...e}) で書き換え(イベントは不変)、next を呼ばずに結果を返せば遮断です。
内蔵 Mod が仕組みの証拠
anthropics/claude-code リポジトリの mods/ ディレクトリには 4 つの内蔵 Mod があります:diff(/diff コマンド)、agents-md(AGENTS.md サポート、デフォルト claude-md-or-agents-md)、telemetry、sec-default。日常的に使っている機能がこの仕組みで実装されています。
セキュリティ
公式アナウンス原文:「Mods run with the same access to your machine as Claude Code itself. They aren’t sandboxed.」読み込まれた Mod は、あなたの権限でファイルや環境変数(API キー含む)を読み、すべての prompt を見て、ツール呼び出しを代理承認し、クォータを消費できます。信頼できるソースからのみ導入し、導入前に登録イベントを確認しましょう(公式ドキュメントに手順があります)。
今はやらないこと
- モデルルーティング Mod の自作(公式サンプル待ち)
- 監査 Mod のゼロからの実装(公式 blast-radius の改造から)
- Mod をバックアップ代わりに使うこと
