Claude Code のフックイベント
リファレンスには 30 以上のイベントが載っています。ここでは多くのフックが使うものを挙げます。matcher を使うと、フックの対象を特定のツール、ファイル、ソースに絞り込めます。
| イベント | 発火するタイミング | 主な用途 |
|---|---|---|
SessionStart | セッションの開始時または再開時 | コンテキストの読み込み、環境のチェック |
UserPromptSubmit | プロンプトを送信した後、Claude が見る前 | コンテキストの追加、機密性の高いプロンプトのブロック |
PreToolUse | ツール呼び出しの実行前(ブロック可能) | 危険なコマンドのブロック、ファイルの保護 |
PermissionRequest | ツール呼び出しに権限の判断が必要なとき | 特定の確認を自動で許可・拒否 |
PostToolUse | ツール呼び出しが成功した後 | 編集したファイルのフォーマット、lint、テスト |
Notification | Claude Code が通知を送るとき | Claude があなたを必要としたときのデスクトップ通知 |
SubagentStart, SubagentStop | サブエージェントの開始時・終了時 | 委任した作業の記録やチェック |
Stop | Claude が応答を終えたとき | タスクが本当に終わったかの確認 |
PreCompact, PostCompact | コンテキスト圧縮の前後 | 重要なコンテキストの保存や再注入 |
FileChanged, CwdChanged | 監視中のファイルまたは作業ディレクトリが変わったとき | 環境の再読み込み、ファイルの再フォーマット |
SessionEnd | セッションの終了時 | 後片付け、ログの書き出し |
フックを置く場所
| 場所 | 適用範囲 | 共有 |
|---|---|---|
~/.claude/settings.json | 自分のすべてのプロジェクト | しない |
.claude/settings.json | 1 つのプロジェクト | する(コミットする) |
.claude/settings.local.json | 1 つのプロジェクト | しない(gitignore 済み) |
| 管理ポリシー設定(managed policy settings) | 組織全体 | 管理者が管理 |
プラグインの hooks/hooks.json | プラグインが有効な間 | する(プラグインと一緒に) |
| スキルまたはサブエージェントの frontmatter | スキルが呼び出された後、またはサブエージェントの実行中 | する(ファイル内) |
Claude Code のフックの例をステップごとに
各ブロックを設定ファイルの hooks キーの下に追加します。ファイルにすでに hooks オブジェクトがある場合は、置き換えずにイベントを同じ階層のキーとして追加してください。/hooks を実行すると、Claude Code が読み込んだか確認できます。Claude にフックを書いてもらうこともできます。
Claude があなたを必要としたらデスクトップ通知を受け取る
~/.claude/settings.jsonにNotificationフックを追加します。この例は macOS のosascriptを使っています。Linux ではnotify-send、Windows では PowerShell を使います。{ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" } ] } ] } }Claude が編集したファイルをすべて自動フォーマットする
Edit|WriteにマッチするPostToolUseフックが、stdin の JSON から編集されたファイルのパスをjqで読み取り、Prettier を実行します。.claude/settings.jsonに置けばチームで共有できます。{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" } ] } ] } }危険なコマンドをブロックする
Bashに対するPreToolUseフックがこのスクリプトを実行します。終了コード 2 で呼び出しをブロックし、stderr に書いた内容は Claude へのフィードバックになるので、Claude は方針を変えられます。終了コード 0 は「判断なし」を意味し、通常の権限チェックがそのまま適用されます。#!/bin/bash # .claude/hooks/block-drop-table.sh。Bash の PreToolUse フックとして実行 INPUT=$(cat) COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command') if echo "$COMMAND" | grep -q "drop table"; then echo "Blocked: dropping tables is not allowed" >&2 # Claude へのフィードバックになる exit 2 # 2 = 操作をブロック fi exit 0 # 判断なし:通常の権限フローが適用されるタスクが終わるまで Claude に作業を続けさせる
promptタイプのStopフックが、すべて終わったかをモデルに確認します。答えがok: falseなら、Claude はreasonを次の指示として作業を続けます。これが Stop フックの定番の例です。{ "hooks": { "Stop": [ { "hooks": [ { "type": "prompt", "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}." } ] } ] } }
フックが動作を決める仕組み
- 入力:各フックは、ツール名や
tool_input、セッション ID、cwdなどのイベント情報を JSON として stdin で受け取ります。 - 終了コード 0:異議なし。
SessionStartやUserPromptSubmitなど一部のイベントでは、通常の stdout が Claude のコンテキストに追加されます。 - 終了コード 2:イベントが許す場合はブロック。stderr はイベントに応じて Claude またはあなたに返されます。
- stdout への JSON 出力:より細かい制御。権限の判断を含む
hookSpecificOutput、ツールの入力を書き換えるupdatedInput、additionalContextなどです。 - その他の終了コード:フックで
onFailure: "block"を設定していない限り、通常はブロックしないエラーとして扱われます。 - 1 つのイベントにマッチした複数のフックは並列に実行されます。
command・prompt・agent・HTTP フック
| タイプ | 実行されるもの | デフォルトのタイムアウト |
|---|---|---|
command | シェルコマンド | 10 分 |
http | イベントの JSON を URL に POST。レスポンスボディはコマンドの出力と同じように扱われる | 10 分 |
mcp_tool | 設定済みの MCP サーバーのツール | 10 分 |
prompt | ok かどうかを答える 1 回のモデル呼び出し | 30 秒 |
agent | 判断の前にファイルを読んだりツールを実行したりできるサブエージェント(実験的) | 60 秒 |
フックとスキルと CLAUDE.md の違い、その他の注意点
- CLAUDE.md とスキルは Claude がたいてい従う指示で、フックは必ず実行されます。絶対に飛ばしてはいけないことはフックに書きましょう。
PostToolUseではすでに実行された操作を取り消せません。止めたいならPreToolUseを使います。Stopはタスクの終わりだけでなく Claude が応答を終えるたびに発火し、ユーザーが中断したときには発火しません。- フック自身はスラッシュコマンドを実行したりツールを呼び出したりできません。やり取りの手段は終了コード、stdout、stderr、JSON だけです。
"disableAllHooks": trueでフックを無効にできます。ただし管理フックは、管理設定側でも無効にしない限り実行されます。- フックはあなたの Claude Code 環境の中だけで動きます。すべての Claude 製品にかかる組織全体のチェックは別の機能です:Claude の inference hooks。
- テスト出力をフィルタする PreToolUse フックは、トークン使用量を減らす最も効果的な方法の 1 つでもあります。
フックは Claude Code にルールを守らせ、Crewmark は Claude Code を働かせ続けます。
無人で動くエージェントを安全にするのがフックです。フォーマット、テスト、ガードレールが毎回実行されます。Crewmark は、Claude Code、Codex、DeepSeek Harness、OpenCode のセッションを、職種・目標・勤務時間を持つ AI 社員に変え、ハートビートで起こしてボードから次の issue を取らせます。プロジェクトのフックも有効な状態です。
フックをコミットする
.claude/settings.jsonのフックは、あなたのセッションと同じように社員のセッションでも読み込まれるので、社員の編集はフォーマットされ、危険なコマンドはブロックされます。ハートビートで仕事を始めさせる
勤務時間中、社員は15分、30分、60分ごとに同じ会話の中で起きます。Claude Code を能動的にする方法もご覧ください。
あなたが必要なことにだけ答える
社員は自分の issue にコメントし、判断が必要なときはメッセージを送ってきます。AI 社員とはもご覧ください。
Claude Code のフックのよくある質問
Claude Code のフックとは何ですか?
ツールの実行前や Claude が応答を終えたときなど、ライフサイクルイベントで Claude Code が自動的に実行する、ユーザー定義のコマンド、HTTP 呼び出し、モデルによるチェックです。Claude が指示を覚えていることに頼らず、確実な制御ができます。
Claude Code のフックはどこで設定しますか?
~/.claude/settings.json(すべてのプロジェクト)、.claude/settings.json(チームで共有)、.claude/settings.local.json(自分だけ)の hooks の下に書きます。プラグイン、スキル、サブエージェントもフックを持てます。/hooks を実行すると読み込まれているものを確認できます。
フックでコマンドをブロックするには?
Bash にマッチする PreToolUse フックを使います。stdin の JSON からコマンドを読み取り、ブロックするときは stderr に理由を書いて終了コード 2 で終了します。Claude はその理由を見て対応を変えます。
Stop フックとは何ですか?
Claude が応答を終えたときに発火する Stop イベントのフックです。prompt タイプの Stop フックなら、タスクが完了したかを確認し、終わっていなければ理由を添えて Claude を作業に戻せます。
フックとスキルの違いは?
スキルは、関係するときに Claude が読み込み、たいてい従う指示やファイルです。フックは、Claude の判断に関係なく、イベントが発火するたびに Claude Code が実行するコードです。
フックが発火しないのはなぜですか?
/hooks に表示されているか、イベント名と matcher の綴りが正確か、スクリプトに実行権限があるか、シェルのプロファイルの出力が JSON を壊していないかを確認してください。デバッグログを有効にして Claude Code を起動すると、各フックが何をしたかがわかります。
Claude Code のフックと inference hooks は同じものですか?
違います。Claude Code のフックは、あなたのマシン上であなたのセッションのために動きます。inference hooks は Claude Enterprise の機能で、Claude が動く前に組織内のすべてのプロンプトをセキュリティサーバーに送ります。
2026年11月6日に Claude Code のドキュメント(フックガイド、フックリファレンス)と照合しました。