Hooks とは
Hooks(フック)は、Claude Code の決まったタイミングで、自分で用意したコマンドを自動で動かす仕組みです。
たとえば次のようなことができます。
- ツールを使う前に中身を調べて、危ないものは止める
- ファイルを書き換えたあとに、lint やテストを自動で走らせる
- Claude が止まったら、通知を出す
CLAUDE.md に書いたルールは「お願い」なので、守られないことがあります。 Hooks は Claude Code 自身が毎回動かすので、守らせたいことを機械的に守らせられるのが違いです。
いつ動くか(主なイベント)
イベントは 30 以上ありますが、よく使うのは次のものです。「止められる」は、そのイベントで処理を止められるかどうかです。
| イベント | 動くとき | 止められる |
|---|---|---|
SessionStart |
セッションの開始・再開 | いいえ |
UserPromptSubmit |
プロンプトを送った直後(Claude が読む前) | はい |
PreToolUse |
ツールを使う直前 | はい |
PermissionRequest |
ツールの使用に許可が要るとき | 許可・拒否を JSON で返す(終了コード 2 では止まらない) |
PostToolUse |
ツールが成功したあと | いいえ |
PostToolUseFailure |
ツールが失敗したあと | いいえ |
Notification |
Claude Code が通知を出すとき | いいえ |
Stop |
Claude が応答を終えたとき | はい(※) |
SubagentStop |
サブエージェントが終わったとき | はい(※) |
PreCompact |
会話の圧縮の前 | はい |
SessionEnd |
セッションの終了 | いいえ |
※ Stop と SubagentStop で「止める」と、終わるのを止めて、作業を続けさせる意味になります。ほかのイベントとは逆なので注意してください。
全部の一覧は 公式ドキュメント にあります。
設定の書き方
設定は settings.json の hooks に書きます。主な置き場所は次の 3 つで、内容は合わさって効きます(上書きではありません)。ほかに、組織の管理設定・プラグイン・スキルにも書けます。
~/.claude/settings.json: 自分のすべてのプロジェクト.claude/settings.json: そのプロジェクト(リポジトリに入れて共有する).claude/settings.local.json: そのプロジェクトで自分だけ(共有しない)
Bash を使う前にスクリプトを動かす例です。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/check-bash.sh",
"timeout": 30
}
]
}
]
}
}
matcher: どのツールで動かすか。"Bash"、"Edit|Write"のように書く。省略するとすべてに当たるtype: ふつうは"command"(コマンドを動かす)。ほかに"http"、"prompt"などがあるtimeout: 秒。省略すると、コマンドは 600 秒(UserPromptSubmitでは 30 秒)
フックには、何が起きたかが JSON で標準入力に渡されます(ツール名、ツールへの入力 tool_input など)。
止める・通すの決まり
フックの結果は、終了コードか、標準出力の JSON で伝えます。
終了コード
| 終了コード | 意味 |
|---|---|
| 0 | 成功。標準出力が JSON なら読まれる |
| 2 | 止める(止められるイベントのとき)。標準エラーの文が理由として Claude に渡る |
| それ以外 | 通常は止めない。エラーの表示だけ出て、処理は続く(下の onFailure: "block" を付けたフックなどは例外) |
よくある勘違い: 終了コード 1 では止まりません。 止めたいときは 2 を返します。
JSON で返す(PreToolUse の例)
ツールの使用を止めるとき:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": ".env は読まない決まりです"
}
}
permissionDecision は allow(許可)・deny(拒否)・ask(人に聞く)などを返せます。updatedInput を返すと、ツールへの入力を書き換えられます。
フック自体が失敗したら止める(onFailure)
2.1.295 から、command と http のフックに "onFailure": "block" を書けます。
スクリプトが見つからない・時間切れなど、フック自体が失敗したときにも止める設定です。書かないと、フックが失敗しても処理は続きます。
よく使われる使い方
Hiroba に集まった記事から、実例を紹介します。
危ないファイルを開かせない
.env などを読む前に PreToolUse で止める。permissions.deny(拒否のルール)と 2 段構えにするのが定番です。
→ Claude Code が .env を開く前に止める—deny ルールと PreToolUse フックの最小構成
書き換えのたびに検査する
PostToolUse で、ファイルを書き換えたら lint・型チェック・テストを走らせる。CI やテストとの役割分担も考える。
→ Claude Code で品質を担保する仕組みを設計する — Hooks・CI・テストの役割分担
止まったことに気づく
Notification や Stop で、許可待ち・入力待ちなどの理由ごとに通知を出し分ける。
→ Claude Code が止まった理由ごとに通知を出し分ける hooks レシピと、効かないときの確認リスト
受託開発で安全側に倒す CLAUDE.md・権限設定・Hooks の 3 層で、指示していないファイルの変更を防ぐ。
気をつけること
フック自体の間違いに気づきにくい。 検査する側のスクリプトが間違っていると、誰も気づけません。フックにもテストを書く、という考え方の記事があります。
→ Claude Code の Hook を「誰が検査するのか」問題 ― 観点・テスト・変異テストで品質を育てる
増やしすぎない。 70 本あったフックを 6 本に減らしてトークンを 71% 減らした、という記録もあります。
→ Claude Code の常駐エージェントを再構築:トークン71%削減も、根本的な誤りパターンは改善されず
書き換え(updatedInput)が不正だと止まる。 ツールが受け付けない形に書き換えると、実行前に止まります。Hiroba 編集部で旧版と比べて試しました。
→ Claude Code 2.1.300 のフック updatedInput 検証を旧版と比べた
PermissionRequest は、許可の要らない操作では呼ばれなかった。 Hiroba 編集部の試験では echo では呼ばれず、mkdir で呼ばれました(公式ドキュメントに明記はありません)。すべてのツールの使用を見たいなら PreToolUse を使います。
最近の変更
- 2.1.295:
onFailure: "block"を追加 → v2.1.294〜v2.1.295 主要アップデート - 2.1.300:
PreToolUse・PermissionRequestのupdatedInputを、Claude 自身の入力と同じように検査するように変更
この記事は Hiroba 編集部(Koji)が、Claude Code の公式ドキュメント(Hooks)と Hiroba に集まった記事をもとにまとめました(2026-10-21 時点)。



