Claude Codeのフック(hooks)を非エンジニア目線で解説。「必ず実行される自動ルール」としての位置づけ、PreToolUse/PostToolUseなど代表イベント、settings.jsonへの最小設定例、exit 2でのブロックまで。CLAUDE.mdとの使い分けも整理しました。
フック(hooks)は「Claude Codeの決まったタイミングで、必ず実行される自動ルール」。CLAUDE.mdが"お願い"なのに対し、フックはLLMの判断に頼らず機械的に動くので、絶対に守らせたいこと(危険なコマンドの禁止・編集後の自動フォーマットなど)に向いています。設定はsettings.jsonのhooksブロックに書くだけです。
Claude Codeに「このフォルダは触らないで」とCLAUDE.mdに書いても、ごくたまに守られないことがあります。公式ドキュメントも「CLAUDE.mdはコンテキストであって強制ではない」という立場です。そこで用意されているのがフック(hooks)。動作の節目(ライフサイクルの特定時点)で実行される、ユーザー定義のシェルコマンドです。AIの気分に左右されず決定論的に(=毎回必ず同じように)動くのが最大の特徴です。
実体験メモ
非エンジニアの私は、CLAUDE.mdに「勝手にコミットしないで」と書いて運用していましたが、「書いたのに守られなかったらどうしよう」という不安は残っていました。フックを知って、「お願い(CLAUDE.md)と強制(フック)は別の仕組み」と整理できたのが大きな収穫。プログラミングは書けなくても、公式の例をコピペして通知を鳴らすくらいなら私でもできました。
フックは「自動で実行されるコマンド」です
フックは確認なしにシェルコマンドを実行する仕組みです。ネットで拾った設定を中身を理解しないまま貼り付けるのは避け、自分が意味を説明できるものだけを設定しましょう。書式や挙動の最新仕様は必ず公式ドキュメントで確認してください。
フック(hooks)とは
フックは、Claude Codeのライフサイクル(セッション開始、ツール実行の前後、応答完了など)の特定時点で自動実行されるユーザー定義のシェルコマンドです。ポイントは、実行するかどうかをLLMの判断に頼らないこと。条件に合えば必ず動きます。
💡 イメージは「職場の入退室ゲート」。口頭ルール(CLAUDE.md)は破られる可能性がありますが、ゲート(フック)は物理的に通さない。この確実さが違いです。
フックでできること
公式が挙げている代表的な使い道は次のとおりです。
- 編集後の自動フォーマット:ファイルを編集するたびにフォーマッターを自動でかける
- コマンドのブロック:危険な操作や触ってほしくないファイルへの変更を実行前に止める
- 通知:作業の節目に音やメッセージで知らせる
- コンテキスト注入:セッション開始時などに環境情報を自動で読み込ませる
イベントは約30種類。代表はこの7つ
フックを差し込めるイベント(タイミング)は約30種類ありますが、まず覚えるのは代表的なものだけで十分です。
| イベント | タイミング | 用途の例 |
|---|---|---|
| SessionStart | セッション開始時 | 環境情報などのコンテキスト注入 |
| UserPromptSubmit | プロンプト送信時 | 入力への情報追加・チェック |
| PreToolUse | ツール実行の直前 | 危険な操作のブロック(実行前に止められる) |
| PostToolUse | ツール実行の直後 | 編集後の自動フォーマット・通知 |
| Notification | 通知の発生時 | 音を鳴らす・外部に知らせる |
| Stop | 応答完了時 | 完了の通知 |
| PreCompact | コンテキスト圧縮の直前 | 圧縮前に必要な処理を挟む |
matcherを使うと、対象のツールを名前で絞り込めます。たとえば "Edit|Write" と書けば「ファイル編集か書き込みのときだけ」フックが動きます。
設定方法:settings.jsonのhooksブロック
フックはsettings.jsonのhooksブロックに書きます。置き場所は3つです。
| 置き場所 | 適用範囲 |
|---|---|
~/.claude/settings.json | 全プロジェクト共通(自分全体) |
.claude/settings.json | そのプロジェクト(チーム共有) |
.claude/settings.local.json | そのプロジェクトの自分だけ |
最小の例を1つ。「ファイルを編集・書き込みするたびに、確認用のコマンドを1つ実行する」設定はこう書きます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "echo 'ファイルが変更されました' >> ~/claude-edits.log"
}
]
}
]
}
}
これで、Claudeがファイルを編集するたびにログへ1行追記されます。ここを自動フォーマットのコマンドに差し替えれば「編集後に必ず整形」が実現します。設定済みのフックは /hooks コマンドで一覧できます(閲覧は読み取り専用)。すべてのフックを一時停止したいときは、設定に disableAllHooks: true を入れます。
ブロックの仕組み:exit 0とexit 2
フックのコマンドには、イベントのデータがJSONでstdin(標準入力)から渡されます。そしてコマンドの終了コードで挙動が決まります。
- exit 0 … そのまま続行
- exit 2 … その操作をブロック。stderr(標準エラー出力)に書いた内容が、Claudeへのフィードバックとして渡される
つまりPreToolUseフックで「条件に合ったらexit 2で終了する」スクリプトを用意すれば、危険な操作を実行される前に確実に止められます。
重要な性質がもうひとつ。PreToolUseのdeny(拒否)は、bypassPermissionsモードでも有効です。フックは権限の制限を強めることはできても、緩めることはできない設計になっています。
typeは5種類(commandだけ覚えればOK)
フックの実行方法(type)は5種類あります。ほとんどの用途は command で足ります。
| type | 内容 |
|---|---|
| command | シェルコマンドを実行(基本はこれ) |
| http | HTTP経由で外部に処理を渡す |
| mcp_tool | MCPツールを呼び出す |
| prompt | Haikuモデルの単発判定に委ねる |
| agent | エージェントに判断させる(実験的) |
prompt は「機械的な条件では書きにくいが、軽いAI判断で足りる」場合の選択肢です。それぞれの詳細な書式は公式ドキュメントを参照してください。
CLAUDE.mdとの使い分け
| 伝えたいこと | 使う仕組み |
|---|---|
| 方針・前提・好み(「日本語で」「この構成で」) | CLAUDE.md |
| 絶対に守らせたいルール(「本番を触らない」「勝手にコミットしない」) | フック(PreToolUse) |
| 作業後に毎回やること(フォーマット・通知) | フック(PostToolUse) |
なお、フックで縛る前に「そもそも指示が曖昧で暴走している」ケースも多いです。指示文そのものを整えたい方は、無料のAIプロンプトビルダーで依頼文を組み立ててから投げるのもおすすめです。
まとめ
- フックはライフサイクルの特定時点で必ず実行される自動ルール。LLMの判断に頼らず決定論的に動く。
- 用途は自動フォーマット・コマンドブロック・通知・コンテキスト注入など。
- 設定はsettings.jsonのhooksブロック(ユーザー/プロジェクト/ローカルの3箇所)。閲覧は
/hooks、全停止はdisableAllHooks: true。 - exit 0で続行、exit 2でブロック(stderrがClaudeへのフィードバック)。PreToolUseのdenyはbypassPermissionsでも有効。
- お願いはCLAUDE.md、強制はフック。フックは制限を強められるが緩められない。
関連記事:Claude Codeの全体像は Claude Codeとは?、“お願い”側の整え方は CLAUDE.mdの書き方、権限まわりは Plan modeと権限モード6種 もどうぞ。カテゴリ一覧は AI活用・ノウハウ へ。
よくある質問(FAQ)
フックとCLAUDE.mdはどう使い分ければいいですか?
CLAUDE.mdはClaudeが読んで従おうとする「お願い」で、100%の遵守は保証されません。フックはライフサイクルの決まった時点で必ず実行されるシェルコマンドなので、「勝手なコミットの禁止」のように確実に守らせたいルールはフック、方針や前提の共有はCLAUDE.md、と分けるのが基本です。
フックはどこに設定しますか?
settings.jsonのhooksブロックに書きます。置き場所は3つで、全プロジェクト共通なら ~/.claude/settings.json、チームで共有するプロジェクト用なら .claude/settings.json、自分だけのプロジェクト用なら .claude/settings.local.json です。設定済みのフックは /hooks コマンドで閲覧できます(読み取り専用)。
フックで危険な操作をブロックするにはどうしますか?
PreToolUseイベントを使います。ツール実行の直前に呼ばれ、フックがexit 2で終了するとその操作はブロックされ、stderrの内容がClaudeへのフィードバックとして渡されます。exit 0なら続行です。PreToolUseのdenyはbypassPermissionsモードでも有効で、フックは制限を強めることはできても緩めることはできません。
フックを一時的に全部止めることはできますか?
できます。設定に disableAllHooks: true を入れると、すべてのフックを無効化できます。個別の見直しは settings.json のhooksブロックを直接編集します。書式の最新仕様は公式ドキュメント(hooks-guide)で確認してください。