AIが自動でプログラミングを行うツールとして注目を集めるClaude Code。バグの自動修正やコードの書き換えをこなす便利な機能を持つ一方、開発現場では「危険な命令を勝手に実行しないか」「編集後のチェックを手作業で行う手間がかかる」といった不安の声も上がっています。
言葉による指示だけでは防ぎきれない問題を、システムの仕組みで確実に防ぐ機能が「Claude Code Hooks」です。Claude Code Hooksを活用すると、AIがファイルを書き換える前後などのタイミングに合わせて、安全確認用のプログラムを自動で割り込み実行できます。
Claude Code Hooksを導入すると、AIのライフサイクルイベントに合わせてスクリプトを強制実行できます。基礎知識から設定方法、実践的な自動化・セキュリティ用レシピ、エンタープライズ向けのガバナンス運用まで徹底解説します。
※本記事は2026年8月時点・Claude Code v2.1系での動作検証に基づいています。
- Claude Code Hooksの仕組みと決定論的制御の概念
- Git HooksやCLAUDE.mdとの明確な使い分け
- settings.jsonの基本構文と5つのハンドラー仕様
- チーム共有と個人設定を分離するスコープ設計
- Exit Code(0/1/2)とJSONによるAIの挙動制御
- 自動整形・危険コマンド遮断・Slack通知の実装レシピ
- /hooks によるデバッグ手法と安全な運用セキュリティ対策
Claude Code Hooksとは?

Claude Code Hooks(クロード・コード・フック)とは、AIコーディングエージェント「Claude Code」が作業を進める特定のタイミングに合わせて、あらかじめ決めた処理を自動実行させる仕組みです。
従来のAIツールは、人間の指示を受けてAIが自分で考えて動くだけの一方通行な仕組みでした。Claude Codeは、作業開始や命令受け付け、ファイル編集の前後など、合計31種類に及ぶ細かい節目(イベント)で外部プログラムを割り込ませる構造を持っています。
Claude Code Hooksの最大の強みは、AIの行動を「お願いベースの確率任せ」から「確実に守らせる絶対ルール」へと切り替えられる点です。AIの思考回路の外側でシステムが強制実行するため、AIが勝手にルールを無視することはできません。
本章で解説する項目は以下の2点です。
Git Hooksとの違い
プログラムの履歴管理で使われる「Git Hooks」と「Claude Code Hooks」は、名前は似ているものの「誰の操作をきっかけに動くか」という役割が根本から異なります。両者は競合せず、お互いの弱点を補い合う関係。
| 比較項目 | Git Hooks | Claude Code Hooks |
| 起動のきっかけ | 人間(開発者)の操作時 (保存や送信の瞬間) | AI(Claude)の動作時 (ファイル編集直後など) |
| 監視の細かさ | 保存・送信など数種類のみ | 作業の開始から終了まで計31種類 |
| 受け渡すデータ | ファイル名や更新履歴の文字情報 | AIが実行しようとした詳細な命令データ |
| 主な役割 | 「最終チェックの水際対策」 危険なコードの混入防止 | 「AIのリアルタイム自己修復」 ミスの瞬間に自動修正 |
Git Hooksは、人間が作業を保存・送信する「最後の関門」で動く仕組み。AIに作業を丸投げしている場合、AIの作業終了後にGit Hooksがエラーを出しても、AIはすでに終了しているため人間が代わりに後始末をする羽目になります。
一方、Claude Code HooksはAIの作業中にリアルタイムで動作。AIがファイルを書き換えた瞬間にレイアウトを自動整形したり、エラーが出ている間はAIの作業完了をブロックして自力で修正できます。
保管庫へ保存する前にAI自身へ間違いを直させるため、人間の手戻りが発生しない安全な開発が実現します。
CLAUDE.mdとの使い分け
Claude Codeには、プロジェクト共通のルールを文章で指定する「CLAUDE.md」というファイルもあります。どちらもAIの行動をコントロールする設定ですが、「言葉でのアドバイス」か「プログラムによる強制」かという大きな違いが存在します。
| 比較項目 | CLAUDE.md(言葉での指示) | Claude Code Hooks(プログラム実行) |
| 実行の仕組み | 会話のたびにAIの記憶領域へ読み込み | AIの頭の外側(パソコン本体)で直接実行 |
| 指示の強さ | お願いベースの推奨 (会話が長くなると忘れる危険あり) | 絶対的な強制 (AIの意思に関わらず100%ルールを適用) |
| 利用コスト | 文字数が増えるほど毎回料金(トークン)が増加 | イベント発生時のみ動くため余計な料金ゼロ |
| 最適な用途 | おすすめの書き方、チームの方針、命名ルール | 秘密ファイルの編集禁止、危険な命令の遮断 |
CLAUDE.mdにルールを詰め込みすぎると(目安として200行以上)、AIの頭がパンクして指示を見落とす原因になります。
使い分けに迷った場合は、以下の基準で判断してください。
- CLAUDE.mdに書く内容
「なるべく〜の書き方を優先する」といった、文脈に合わせた柔軟な判断を求めるガイドライン - Claude Code Hooksに設定する内容
「絶対にパスワードファイルを触らせない」といった、例外を許さない絶対的な禁止・強制ルール
「パスワードファイルを編集しないで」と言葉で頼むだけでは、AIがうっかりミスをするリスクをゼロにはできません。フックを設定し、AIが重要ファイルに触れた瞬間にシステム側で強制停止させる仕組みを作って初めて、万全な安全対策が完成します。
Claude Code Hooksを設定するメリット

Claude Code Hooksを導入すると、AIアシスタントを規律に従って自律動作する専属メンバーへと進化させられます。プロンプト指示のみに頼った運用から脱却し、開発効率化と安全性の両立を実現できます。
Claude Code Hooksを導入する主なメリットは以下の4点です。
コード品質の完全自動担保
AIにプログラミングを任せる際、文字の並びのズレや書き方の違いは人間にとって大きな確認負担になります。Claude Code Hooksを使えば、品質チェックをAIの作業ループ内で自動完結できます。
- リアルタイム自動整形
AIがファイルを書き換えた直後に、Prettierや最新の高速ツール(oxcなど)が自動で見た目を整えます。 - ミスの自動修復
コード変更直後に自動でテストを走らせ、エラーが出た場合は内容をAIへ即座に伝達。AI自身が不具合に気づいて自力で修正します。 - 完了チェックの関門
作業完了の直前に最終テストを強制実行。テストに合格しない限りAIは作業終了を宣言できないため、未完成なコードの提出を防げます。
破壊的コマンドの確実な防止
AIにパソコンの命令操作(ターミナル操作)を任せると、思わぬトラブルが起きる危険が潜んでいます。誤って広範囲のファイルを消去したり、共有サーバーへ無理やりデータを上書きしたりする事故は絶対に防がなければなりません。
- 実行前の事前チェック
AIが命令を実行する手前で割り込み、実行内容に危険な文字が含まれていないか検査します。 - 危険な命令の強制遮断
全消去コマンドや無理な上書き操作を検知した時点で処理をブロック。警告メッセージをAIへ送り返して中止させます。 - 安全な高速モードの実現
事前の確認画面を省略する高速実行モード(–dangerously-skip-permissions)を使っても、危険な処理だけはシステム側で確実にブロックされます。
AIはシステムの防壁を迂回できないため、重大なデータ事故を未然に防止できます。
通知による待ち時間の削減
AIが膨大なプログラムの分析やテストを行っている間、作業画面をずっと見つめ続ける必要はありません。Claude Code Hooksで通知を自動化すれば、人間は別の仕事に集中できます。
- 画面待機のデスクトップ通知
AIが人間の確認待ちになった瞬間を検知し、パソコン画面へポップアップ通知を表示します。 - チャットツール連携
作業完了やトラブル発生時に、Slackなどの連絡ツールへ自動で報告メッセージを送信可能。 - 効率的な分担作業
時間のかかる作業をAIに任せて別の仕事を進め、通知が届いたタイミングだけ確認に戻る作業スタイルを確立できます。
無駄な画面監視時間をなくし、設計やアイデア出しといった大切な業務に専念しましょう。
チーム運用の標準化
個人での作業効率化にとどまらず、チーム全体でAIを安全に使うための共通ルール配布基盤としてもClaude Code Hooksは役立ちます。
- 設定ファイルの共有管理
プロジェクト内の共通設定ファイルにフックのルールを書いて共有することで、メンバー全員のAIへ同じ開発規律を適用可能。 - 個人用設定との切り分け
個人専用の連絡先URLやテスト用の設定は、共有ファイルと分けて安全に管理できます。 - 組織全体での統制
企業向けの設定を使うと、管理者が決めた安全ルール以外の勝手なフック実行を遮断し、不正なプログラムの侵入を防止。
チーム全員が統一された基準を共有し、足並みの揃ったAI共同開発をスムーズに始められます。
Claude Code Hooksの設定ファイルの場所とスコープ設計

Claude Code Hooksを意図通りに動作させるには、設定ファイルの配置場所と優先順位の理解が欠かせません。Claude Codeは個人利用からチーム開発、企業統制まで対応できる階層的なスコープ構造を備えています。
スコープ設計に関して把握すべき項目は以下の2点です。
3つの設定ファイル配置場所
Claude Codeの設定ファイルは4つのレイヤーに分かれており、優先順位に従って評価されます。
- 管理ポリシー(組織全体の一元管理)【最優先】
- .claude/settings.local.json(プロジェクト個別・個人専用)
- .claude/settings.json(プロジェクト個別・チーム共有)
- ~/.claude/settings.json(パソコン全体・グローバル)【最低優先】
各設定レイヤーの役割と適用範囲を整理します。
| レイヤー | ファイルパス | Git管理 | 主な用途・適用範囲 |
|---|---|---|---|
| グローバルユーザー設定 | ~/.claude/settings.json | 対象外 | 全プロジェクト共通の個人ルール、OS固有のデスクトップ通知設定 |
| プロジェクト共有設定 | .claude/settings.json | 対象 | チーム共通のLinter/Formatter自動実行、リポジトリ固有のテスト自動パスゲート |
| プロジェクトローカル設定 | .claude/settings.local.json | 対象外 | 個人のSlack通知用Webhook URL、マシン固有のデバッグ設定 |
| 管理ポリシー | (組織管理者が一元制御) | 対象外 | エンタープライズ環境における組織全体のセキュリティ統制、非公認フックの実行遮断 |
Claude Code Hooks設定には「すべて合算して同時に動かす(加算的マージ)」という特徴があります。一般的な設定は上の階層が下の階層を上書きしますが、フックは全階層で登録された処理をまとめて並列実行します。
例外として、"disableAllHooks": true を指定すると全フックを一括停止可能。管理ポリシーで "allowManagedHooksOnly": true が有効な場合は、会社公認のフック以外はすべて強制ブロックされます。
チーム共有時のベストプラクティス
チームでClaude Code Hooksを運用する際は、共有設定と個人設定の境界を明確に切り分ける設計が求められます。
| 分類 | 保存するファイル | 具体的に書く内容 |
| チーム共有設定 | .claude/settings.json(Gitで共有) | ・保存時のコード自動整形ルール ・メインデータへの無理な上書きの防止 ・作業完了前の自動テスト |
| 個人専用設定 | .claude/settings.local.json(Gitから除外) | ・個人のチャット通知URL(Slackなど) ・パスワードや秘密情報を含む設定 ・自分専用の実験用プログラム |
| パソコン全体設定 | ~/.claude/settings.json(個人フォルダ) | ・Mac専用の画面通知スクリプト ・WindowsやLinux専用の通知設定 ・パソコン全体共通のセキュリティ |
プログラムの保存場所を指定する際は、直接固定のパスを書かず ${CLAUDE_PROJECT_DIR} という自動変換の目印を使います。
JSON
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/lint.sh",
"args": []
}
]
}
]
}
}
上記のように args という配列の書き方を使うと、プロジェクトの場所が自動で正確に割り当てられ、フォルダ名に空白が含まれていてもエラーを起こさず安定して動作します。
Claude Code Hooksの基本構文と仕様のポイント

Claude Code Hooksを正しく設定するためには、JSONの記述構文とハンドラーの特性を正しく把握する必要があります。
本章で解説する技術仕様は以下の4点です。
基本的な設定構造(3階層のネスト)
Claude Code Hooksの設定は「①イベント(いつ動かすか)」「②マッチャー(どの道具を対象にするか)」「③ハンドラー(何を実行するか)」という3つの入れ子構造で作られています。
第1階層が『hooks』直下のイベント名、第2階層がmatcher、第3階層が『hooks』配列内のハンドラーです。
JSON
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
}
]
}
]
}
}
各階層の役割は以下の通りです。
- 第1階層(イベント名)
ファイル書き換え前(PreToolUse)や作業終了(Stop)など、割り込みたいタイミングを指定 - 第2階層(マッチャー)
コマンド実行(Bash)やファイル編集(Edit、Write)など、監視したいツールの種類を指定 - 第3階層(ハンドラー配列)
実際に動かす命令を登録。複数の処理を書いた場合は同時に並列実行
マッチャー(matcher)の指定パターン
matcher(マッチャー)に書く文字の形式によって、対象を判定するルールが変化します。
| 書き方のパターン | 判定ルール | 具体例と実際の動き |
空欄 / * | すべて対象 | すべてのツール実行時に無条件で起動 |
文字の並び、| | 完全一致 / いずれか | "Bash":Bashツールのみ完全一致"Edit|Write":EditまたはWriteのどちらか |
| 特殊な記号を含む文字 | 部分一致(あいまい検索) | "Edit.*":ノート編集など関連ツールすべてに一致 |
外部の拡張機能(MCP)で作ったツールを対象にする場合は、mcp__サーバー名__ツール名 の形式で指定します。特定サーバーの全ツールを監視する際は "matcher": "mcp__memory__.*" のように末尾へ目印を付けてください。
拡張機能まとめパックを使う場合は、専用の名前(mcp__plugin_名前...)へ自動変換されるため、頭に付く文字列を確認して指定する必要があります。
条件付き実行(ifフィールド)
マッチャーが「ツールの種類」で絞り込むのに対し、if(条件指定)は「命令の中身や編集するファイル名」を見て動かすかどうかを判断します。
JSON
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"if": "Bash(git *)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/check-git-policy.sh"
}
]
}
]
}
}
プログラムを動かすたびにわずかな処理待ち時間が発生します。あらかじめ if で条件を絞り込んでおけば、関係ない命令のときは処理自体を立ち上げないため、作業スピードを落とさず快適に維持することができます。
- 使える場所の制限
ツールの実行前(PreToolUse)や実行後(PostToolUse)など、ツールを動かすイベントでのみ利用可能 - 深いフォルダの指定
奥深い階層のファイルを指定したい場合は、Edit(**/src/**)のように全体を示す記号を活用 - 命令文の自動整理
コマンドの頭に一時的な設定(例:FOO=bar git push)が付いていても、余計な文字を自動で取り除いて正確に判定
5種類のハンドラータイプ
Claude Codeには、やりたい処理に合わせて選べる5種類の実行タイプが用意されています。
| タイプ | データの受け渡し | 特徴とおすすめの使い道 | 制限時間(初期設定) |
| command | 文字の直接入力・出力 | パソコン内のプログラムを実行。 自動整形や危険操作のブロックに最適。 | 600秒 (質問受付時は30秒) |
| http | ネット通信 (HTTP POST) | 外部URLへデータを送信。 Slack通知や作業記録の保存に便利。 | 600秒 (質問受付時は30秒) |
| mcp_tool | 拡張ツールの通信規格 | 接続済みの拡張機能を直接呼び出し。 社内ツールの再利用に活用。 | 600秒 (質問受付時は30秒) |
| prompt | AIによる1回判断 | 別の小型AIに文章の意味を判定させる仕組み。 プログラムの書き味チェックに利用。 | 30秒 |
| agent | 子AIによる自律探索 | 専用の子AIを立ち上げてじっくり調査。 複雑なプログラム全体の構造確認に最適。 | 60秒 |
目的や処理の重さに合わせて最適なタイプを使い分けましょう。
Claude Code Hooksの入出力仕様とExit Codeによる制御

Claude Code HooksがClaude Codeを確実にコントロールできる理由は、データを受け取る入口(入力)と、指示を返す出口(結果番号や出力)のルールが厳密に決まっているためです。
本章で解説する制御仕様は以下の3点です。
stdinで受け取るJSONスキーマ
イベントが起きると、システムは現在の作業状況をまとめたデータ(JSON形式)をプログラムへ自動で渡します。
| 項目名 | データの種類 | 入っている具体的な内容 |
| session_id | 固有の文字(ID) | 実行中の作業を一目で識別する固有番号 |
| cwd | フォルダの場所 | AIが現在作業している場所(フォルダパス) |
| hook_event_name | 文字 | 起動のきっかけになったイベント名(PreToolUseなど) |
| permission_mode | 文字 | 現在の権限設定(自動実行モードなど) |
| tool_name | 文字 | AIが使おうとしている道具の名前(Bash、Editなど) |
| tool_input | まとまった情報 | AIが実行しようとした命令文やファイル名 |
AIがコマンドを実行しようとした際の受け取りデータ例は以下の通りです。
JSON
{
"session_id": "abc12345-6789-abcd-ef01-23456789abcd",
"cwd": "/Users/developer/workspace/my-app",
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "git push --force origin main"
},
"tool_use_id": "toolu_01ABC123xyz...",
"permission_mode": "auto"
}
自作スクリプトの中では、専用の抽出ツール(jqコマンド)を使って必要な値を取り出します。
Bash
# 実行しようとした命令文を取り出す
cmd=$(jq -r '.tool_input.command // empty' <<< "$INPUT")
# 編集しようとしたファイル名を取り出す
file_path=$(jq -r '.tool_input.file_path // empty' <<< "$INPUT")
Exit Code(終了コード)の意味と挙動
プログラムが最後に返す「終了番号(Exit Code)」によって、システムの動きが決定されます。
| 終了番号 | 状態の名前 | 実際の動き |
| 0 | Success(成功) | そのまま作業を続行。必要に応じて追加の指示をAIへ伝達。 |
| 2 | Block(強制停止) | 処理を即座にブロック。警告メッセージをAIや人間へ通知。 |
| 1 または 2以外の数字 | Error(警告のみ) | 警告を表示するが、作業自体は止めずにそのまま続行。 |
一般的なプログラムと異なり、番号1は処理を止めない「警告表示」として扱われます。危険な操作を絶対に止めたい場合は、必ず「exit 2」を指定してください。
作業完了を止めるフックが暴走して無限ループに陥るのを防ぐため、同じ場面で連続8回ブロックされるとシステムが強制終了する安全装置も備わっています。
stdout構造化JSONによる決定制御
番号0(成功)の状態で決まった形式のデータを出力すると、より細かなコントロールが可能です。
JSON
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "安全な検証コマンドのため自動承認します",
"additionalContext": "対象ブランチは本番環境です。慎重に操作してください。"
}
}
出力データで指定できる主な設定項目は以下の通り。
- permissionDecision
実行の可否(自動承認、拒否、人間に確認、保留など) - permissionDecisionReason
許可や拒否の理由をAIへ伝えるメッセージ - updatedInput
AIが指定した命令文を、実行直前に安全な内容へ自動書き換え - additionalContext
作業時にAIへ読ませる追加のアドバイス
自作スクリプトからデータを出力する際は、ターミナルの設定ファイル(.bashrcなど)で自動表示される余計な文字メッセージに注意が必要。余計な文字列が混ざるとデータの読み取りに失敗します。
Bash
# 対話画面で操作しているときだけメッセージを表示する設定例
if [[ $- == *i* ]]; then
echo "Shell environment is ready for developer!"
fi
上記の対策を入れておくことで、Claude Code Hooks実行時のデータ読み取りエラーを確実に防止できます。
Claude Code Hooksの主要イベント10選

Claude Code Hooksに用意された計31種類のイベントの中から、実務で頻繁に利用する代表的な10個のイベントを分類して解説します。
紹介するイベント系統は以下の4つです。
ツール制御系(PreToolUse / PostToolUse)
AIが行うファイル編集やコマンド操作などの道具使用に割り込む中心的なイベントです。
| イベント名 | 動くタイミング | 主な役割と使い道 |
| PreToolUse | ツール実行の直前 | ・危険な命令の強制ストップ(exit 2) ・安全な命令の自動許可 ・実行内容の自動書き換え |
| PostToolUse | ツール実行の直後 | ・ファイル編集後のレイアウト自動整形 ・エラー検知時の差し戻しと再修正指示 ・秘密のパスワード情報の隠ぺい |
PostToolUseはツール実行後に動くため処理そのものは取り消せませんが、フックがexit 2でエラー内容をstderrに返すと、その内容が「やり直し指示」としてAIに伝わります。作業を強制終了させることなく、AI自身に間違いを直させる修復ループへ誘導できます。
セッション・停止系(SessionStart / Stop / StopFailure)
作業の開始から完了までの全体の流れを見守るイベントです。
| イベント名 | 動くタイミング | 主な役割と使い道 |
| SessionStart | 作業開始時・再開時 | ・初期設定の読み込み ・プロジェクト共通スキルの再読み込み ・作業タイトルの自動設定 |
| Stop | AIが「作業完了」と判断した瞬間 | ・提出前の最終テスト強制実行 ・テスト失敗時の作業継続命令(exit 2) ・追加のアドバイスの伝達 |
| StopFailure | 通信障害などで異常終了した時 | ・外部監視ツールへのエラー報告 ・トラブル時の記録データの保存 |
SessionStart内で専用の設定ファイル(CLAUDE_ENV_FILE)に変数を書き込むと、作業中にAIが実行する全コマンドへ同じ設定を自動適用できます。
権限・タスク系(PermissionRequest / TaskCompleted)
人間とのやり取りをスムーズにし、仕事の完成度をチェックするイベントです。
| イベント名 | 動くタイミング | 主な役割と使い道 |
| PermissionRequest | 人間の確認画面が出る直前 | ・安全な操作の確認画面を自動でスキップ ・許可リストへのルール自動追加 |
| TaskCompleted | 作業が完了状態になった瞬間 | ・提出物の記載漏れチェック ・完成ファイルの存在確認と不備時の巻き戻し |
PermissionRequestで自動承認を返しても、設定ファイルに書かれた禁止ルールを突破することはできません。フックは「制限を厳しくする」ことはできても「安全基準を勝手に下げる」ことはできない仕組みになっています。
コンテキスト系(PreCompact / Notification)
AIの記憶整理や待ち時間の管理を担当するイベントです。
| イベント名 | 動くタイミング | 主な役割と使い道 |
| PreCompact | 過去の会話履歴を圧縮する直前 | ・消去される前の詳しい作業記録の外部保存 ・不要な圧縮処理の停止 |
| PostCompact | 会話履歴の圧縮が終わった直後 | ・圧縮によって抜け落ちた重要ルールの再登録 |
| Notification | 許可待ちになった瞬間、または入力が約60秒放置された時 | ・パソコン画面への通知ポップアップ表示 ・チャットツール(Slack等)への連絡 |
Notificationには種類があり、許可待ち(permission_prompt)は即時に、アイドル通知(idle_prompt)は約60秒の放置後に発火します。matcherで種類を絞り込むことも可能です。
会話が長くなって過去の記憶が整理される際も、フックを挟むことで大切なルールを忘れさせずに作業を継続できます。
Claude Code Hooksの実践ユースケース集

Claude Code Hooksの実務でそのまま貼り付けて使える、「自動整形」と「危険コマンドの遮断」の例を紹介します。
設定ファイルと実行プログラムを導入し、AIとの共同開発を安全に進めましょう。
| レシピ | 役割 | 防ぐトラブル | 実行タイミング |
| 自動整形 | コードの見た目や文法を自動修正 | 行のズレ・書き方のバラつき | ファイル変更直後 |
| 危険操作の遮断 | 破壊的な命令を検知して強制停止 | ファイル全削除・上書き破壊 | コマンド実行直前 |
Prettier/ESLintによる自動整形
AIがファイルに新しい処理を追加した際、文字の並びのズレや書き方のバラつきを裏側で自動修正する仕組みです。
ファイルが書き換わった直後を検知し、対象のファイルを即座に整えます。
設定ファイルの記述(.claude/settings.json)
プログラムフォルダ配下のファイル変更時のみ、自動整形プログラムを呼び出す設定です。
JSON
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"if": "Edit(**/src/**)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/auto-format.sh",
"args": [],
"statusMessage": "コードを自動整形中..."
},
{
"type": "command",
"if": "Write(**/src/**)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/auto-format.sh",
"args": [],
"statusMessage": "コードを自動整形中..."
}
]
}
]
}
}
if フィールドに書けるルールは1つだけで、「|」や「&&」で複数条件をつなぐ構文はありません。EditとWriteの両方を対象にしたい場合は、上記のようにハンドラーを2つ定義します。
実行プログラム(.claude/hooks/auto-format.sh)
編集されたファイルの種類を自動で判別し、専用の整形ツールを実行します。
Bash
#!/bin/bash
set -e
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if [ -z "$FILE_PATH" ] || [ ! -f "$FILE_PATH" ]; then
exit 0
fi
case "$FILE_PATH" in
*.ts|*.js|*.tsx|*.jsx|*.json)
npx prettier --write "$FILE_PATH" > /dev/null 2>&1 || true
npx eslint --fix "$FILE_PATH" > /dev/null 2>&1 || true
;;
*.py)
if command -v ruff >/dev/null 2>&1; then
ruff format "$FILE_PATH" > /dev/null 2>&1 || true
ruff check --fix "$FILE_PATH" > /dev/null 2>&1 || true
fi
;;
esac
exit 0
※プログラム作成後は、端末で chmod +x .claude/hooks/auto-format.sh を実行して権限を付与してください。 権限の付与を行わない場合、エラーが発生して自動整形が動作しません。
rm -rf・強制pushの実行ブロック
AIが誤って危険な命令を実行してシステムを壊す事故を防ぐ、安全対策の仕組みです。 命令が動く直前に内容を検査し、危険な文字パターンが含まれる場合は処理を遮断します。
設定ファイルの記述(.claude/settings.json)
コマンド実行(Bash)が呼び出されたときのみ、セキュリティ判定プログラムを起動します。
JSON
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/prevent-disaster.sh",
"args": []
}
]
}
]
}
}
実行プログラム(.claude/hooks/prevent-disaster.sh)
フォルダ全削除や本番データの破壊につながる命令を検知し、AIに修正理由を警告して作業を止めます。
Bash
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
if [ -z "$COMMAND" ]; then
exit 0
fi
# 1. 広範囲の削除コマンドを検知
if [[ "$COMMAND" =~ rm[[:space:]]+-rf[[:space:]]+(\/|\~|\.\.|\.git|\*) ]]; then
echo "🚨 [SECURITY ERROR] 広範囲の削除操作は強制禁止されています。" >&2
exit 2
fi
# 2. メインデータへの無理な上書き送信を検知
if [[ "$COMMAND" =~ git[[:space:]]+push.*(--force|-f).*(main|master|production) ]]; then
echo "🚨 [SECURITY ERROR] メインブランチへの強制プッシュは禁止されています。" >&2
exit 2
fi
# 3. データベース初期化コマンドを検知
if [[ "$COMMAND" =~ db:drop|migrate:fresh|prisma[[:space:]]+db[[:space:]]+push.*--force ]]; then
echo "🚨 [SECURITY ERROR] データベースの破壊的操作が検出されました。" >&2
exit 2
fi
exit 0
テスト通過まで終了させない品質ゲート
AIが作業完了を報告する直前に、裏で自動テストを強制的に走らせる仕組みです。 テストで不具合が出た場合は終了をストップし、AI自身に直るまで修正作業を続けさせます。
設定ファイルの記述(.claude/settings.json)
AIが対話を終える合図に合わせて、自動テスト用のプログラムを登録します。
JSON
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/test-gate.sh",
"args": [],
"statusMessage": "品質検査テストを実行中..."
}
]
}
]
}
}
実行プログラムの作成(.claude/hooks/test-gate.sh)
テスト処理自体が終了の合図を出して無限にプログラムを呼び出すトラブルを防ぐため、先頭で二重起動を防ぐ判定を入れます。
Bash
#!/bin/bash
# 1. 必要な情報を丸ごと受け取る
INPUT=$(cat)
# 2. 【最重要】すでにテスト実行中の場合は、無限ループを避けるため即座に終了する
STOP_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // empty')
if [ "$STOP_ACTIVE" = "true" ] || [ "$CLAUDE_STOP_HOOK_ACTIVE" = "1" ]; then
exit 0
fi
echo "🧪 ビルド検査とテストを実行しています..."
# 3. 型チェック(TypeScriptなどの場合)を実行
if [ -f "tsconfig.json" ]; then
if ! npx tsc --noEmit > /tmp/tsc_error.log 2>&1; then
echo "🚨 [QUALITY GATE FAILURE] TypeScriptの型チェックでエラーが発生しました。以下を修正してください:" >&2
cat /tmp/tsc_error.log >&2
exit 2 # 終了コード2を渡してAIに修正作業を継続させる
fi
fi
# 4. 動作テストを実行
if npm test > /tmp/test_error.log 2>&1; then
echo "✅ すべての型チェックとテストを無事にパスしました!"
exit 0
else
# 失敗時は終了コード2を渡し、エラー内容をAIに読ませて直させる
echo "🚨 [QUALITY GATE FAILURE] 自動テストが失敗しました。以下の不具合を自律修復してください:" >&2
cat /tmp/test_error.log >&2
exit 2
fi
デスクトップ&Slack通知連携
時間のかかる作業をAIに任せている間、画面を見続ける必要はありません。 人間の確認が必要になった瞬間や全作業が終わった瞬間に、自動でパソコン画面やSlackへ連絡が届きます。
設定ファイルの記述(.claude/settings.json)
「人間の許可待ち」と「作業完了」のタイミングに合わせて通知処理を設定します。
JSON{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/desktop-notify.sh",
"args": []
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"async": true,
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/slack-notify.sh",
"args": []
}
]
}
]
}
}
画面通知プログラム(.claude/hooks/desktop-notify.sh)
人間の許可が必要な画面で止まった場合のみ、パソコンのポップアップ通知を表示します。
Bash
#!/bin/bash
# 1. Claudeからの作業状況データを受け取る
INPUT=$(cat)
TYPE=$(echo "$INPUT" | jq -r '.notification_type // empty')
# 2. 許可待ち(承認ダイアログ)で作業が止まっている場合のみ通知を送信
if [ "$TYPE" = "permission_prompt" ]; then
TITLE="Claude Code 承認待ち"
MSG="Claudeが実行許可を待っています。画面を確認してください。"
# macOSの場合
if [ "$(uname)" = "Darwin" ]; then
osascript -e "display notification \"$MSG\" with title \"$TITLE\" sound name \"Glass\""
# Linuxの場合
elif command -v notify-send >/dev/null; then
notify-send "$TITLE" "$MSG" -i dialog-warning
fi
fi
exit 0
Slack通知プログラム(.claude/hooks/slack-notify.sh)
裏側でメッセージを整えて、作業を止めることなくチャットツールへ自動投稿します。
Bash
#!/bin/bash
# Slackの送信先URLが設定されているか確認
if [ -z "$SLACK_WEBHOOK_URL" ]; then
exit 0
fi
# 1. 完了した作業のデータを取得
INPUT=$(cat)
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"')
# 2. Slackに送信するメッセージ文章を作成
PAYLOAD_TEXT="✅ *Claude Code 作業完了通知*\n識別番号: \`${SESSION_ID}\` のすべての自律作業が、テストをクリアして正常に完了しました。"
# 3. チャットツールへデータを送信
curl -X POST -H 'Content-Type: application/json' \
--data "$(jq -n --arg text "$PAYLOAD_TEXT" '{text: $text}')" \
"$SLACK_WEBHOOK_URL" > /dev/null 2>&1
exit 0
Webhook URLのような個人の秘密情報は、Gitに含めない .claude/settings.local.json の env フィールドに書いておくと、セッション中の全フックから環境変数として読み取れます。
json
{
"env": {
"SLACK_WEBHOOK_URL": "https://hooks.slack.com/services/XXXX/XXXX/XXXX"
}
}
シェルの設定ファイル(.zshrc など)で export SLACK_WEBHOOK_URL=... しておく方法でも構いません。
監査ログの自動記録
AIが「いつ・どのファイルを・どのように書き換えたか」を自動で記録に残す安全管理の仕組みです。 開発作業のスピードを落とさないよう、裏側で静かに記録ファイルを更新します。
設定ファイルの記述(.claude/settings.json)
ファイル編集や命令実行が終わった直後に、記録プログラムを裏で呼び出します。
JSON
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write|Bash",
"hooks": [
{
"type": "command",
"async": true,
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/audit-logger.sh",
"args": []
}
]
}
]
}
}
記録プログラム(.claude/hooks/audit-logger.sh)
操作した時刻や変更内容を専用フォルダへ1行ずつ書き足します。
Bash
#!/bin/bash
# 1. Claudeからの実行データを受け取る
INPUT=$(cat)
# 2. ログを保存する専用フォルダを用意
LOG_DIR="${CLAUDE_PROJECT_DIR}/.claude/logs"
mkdir -p "$LOG_DIR"
# 3. 日時や操作内容を取り出す
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"')
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // "unknown"')
# 具体的な入力情報を1行にまとめる
TOOL_INPUT_JSON=$(echo "$INPUT" | jq -c '.tool_input // {}')
# 4. まとめた履歴を記録ファイルの末尾に自動追記
jq -n \
--arg ts "$TIMESTAMP" \
--arg sid "$SESSION_ID" \
--arg tool "$TOOL_NAME" \
--argjson input "$TOOL_INPUT_JSON" \
'{timestamp: $ts, session_id: $sid, tool: $tool, input: $input}' >> "$LOG_DIR/audit.jsonl"
exit 0
Claude Code Hooksのデバッグ手法とトラブルシューティング

Claude Code Hooksで設定したフックが動作しない場合は、システムハーネスが提供する診断ツールを活用して原因を切り分けましょう。
本章で解説する診断・解決策は以下の2点です。
/hooksコマンドと–debug-fileの活用
設定状況の確認とエラー追跡の手順を押さえましょう。
| 確認ツール | 実行コマンド / 操作 | 分かる内容と使い道 |
| フック一覧画面 | /hooks | 登録されているフックの一覧、設定元ファイル、制限時間の確認 |
| 詳細ログ保存 | claude --debug-file /tmp/claude.log | 送受信されたデータ、終了番号、エラー文の完全な記録 |
| 画面履歴の表示 | Ctrl + O | フックの警告マークやエラー通知の視覚的な確認 |
記録を見ながら動作テストを行う際は、別の画面で tail -f /tmp/claude.log を実行するとリアルタイムに動きを追跡できます。
よくあるエラーと対処法
つまずきやすいトラブルと解決策を一覧表に整理しました。
| トラブルの内容 | 考えられる原因 | 解決策 |
| フックが動かない (古いバージョン) | v2.1.190以前では区切り記号の前後の空白が無効 (例: “Edit | Write”) | v2.1.191以降は空白があっても動作。 古い場合は “Edit|Write” と詰めるか、Claude Codeを更新。 |
| 設定の読み込み失敗 | 設定ファイルにメモ書き(コメント)や余計なカンマがある | 標準的な書き方に従い、メモ書きや末尾のカンマを削除。 |
| 実行権限エラー | スクリプトの実行許可がない | ターミナルで chmod +x ファイルパス を実行。 |
| HTTPフックのヘッダーで変数が空になる | そのハンドラーの許可リストに変数が未登録 | HTTPフック側の allowedEnvVars に変数名を追加 (commandフックには不要)。 |
作成したプログラムを単体でテストする際は、疑似データを流し込んで終了番号を確認します。
Bash
# 疑似データを渡してテスト実行
echo '{"tool_name":"Bash","tool_input":{"command":"git push --force origin main"}}' | ./.claude/hooks/prevent-disaster.sh
# 終了番号を確認(危険操作のため「2」が返れば成功)
echo $?
Claude Code Hooksのセキュリティと運用の注意点

Claude Code Hooksは、ローカル権限でスクリプトが動作するため、パフォーマンスとセキュリティへの配慮が不可欠です。
本章で解説する運用基準は以下の2点です。
フックの軽量化とパフォーマンス維持
重い処理を挟むとAIの返答スピードが直接落ちてしまいます。快適な作業環境を保つための工夫を押さえましょう。
- 重い処理の後回し
時間のかかる全体テストや文法チェックは、編集のたびではなく作業完了時(Stop)に実行。 - 裏側での実行(非同期)
Slack通知や作業記録の保存など、作業を止める必要がない処理には必ず"async": trueを指定。 - 制限時間の短縮
処理が途中で固まるトラブルを防ぐため、初期設定の10分からtimeout: 5(5秒)などに短縮。 - 動かす対象の限定
ifを活用し、特定のフォルダ内のファイルが変わったときだけ動くように設定。
外部リポジトリの悪意あるフック対策
インターネット上で公開されている他人のプログラムを取り込んだ際、危険なフックが仕込まれていると、勝手に不正プログラムを実行される危険があります。
| 起動モード | 安全確認の動き | 具体的なセキュリティ対策 |
| 対話モード (画面を見ながら操作) | 初回起動時に信頼確認の画面が表示 | 身元が分からないリポジトリでは絶対に承認しない |
| 一括実行モード (自動で裏側実行) | 自動で信頼済みとして処理(見落としやすい危険) | 起動オプションで全フックを無効化して安全に実行 |
| 企業・組織での管理 | 管理ポリシーが一括で最優先適用 | 会社公認のフック以外を一括で強制ブロック |
安全か分からない外部のプログラムを調査する際は、すべてのフックを無効化して起動します。
Bash
# 全フックを無効化して安全に立ち上げる実行例
claude -p "Explain this project" --settings '{"disableAllHooks": true}'
上記の対策を徹底し、安全性を保ちながら快適にAIを活用しましょう。
Claude Code Hooksに関するよくある質問(FAQ)

Claude Code Hooksに関するよくある質問を以下にまとめました。
- Claude API連携とClaude Code Hooksは何が違いますか?
-
実装形態が異なります。
比較対象として適切なのはClaude Agent SDKのフックで、こちらはSDKで自作するアプリのプログラム内に、TypeScriptやPythonの関数として直接組み込みます。
一方のClaude Code Hooksは、Claude Code本体が設定ファイル(settings.json)を読み込み、外部のシェルコマンドなどとして実行する仕組みです。発生するイベントの種類は両者でおおむね共通しています。
- フックがタイムアウトした際の挙動はどうなりますか?
-
制限時間を過ぎた場合、フックの処理自体は強制キャンセルされます。ただし、作業セッションは停止せず、「ブロックせずにそのまま続行」して人間の確認画面へ移行する仕様です。
時間切れによる自動停止には頼れないため、自作プログラム側でエラー時の安全対策を必ず記述してください。
- Windows環境でフックを設定する際の注意点は何ですか?
-
Git for Windowsが入っている場合はGit Bashが優先して動き、入っていない場合はPowerShellが起動します。
PowerShellを確実に動かしたい場合は、設定に
"shell": "powershell"と明記。Windows特有のパス記号(\)をプログラムの先頭でスラッシュ(/)へ変換する処理を入れておくと、パスの誤認識エラーを防止できます。 - ローカルHooksとCI/CDパイプラインの役割分担はどうすべきですか?
-
役割と作業範囲を明確に分ける運用が基本です。
- ローカルHooks
変更したファイルだけを対象にした「数秒以内の超高速チェック」 - CI/CD(共有サーバー)
プロジェクト全体を対象にした「総合的な結合テストやビルド確認」
手元の作業でプロジェクト全体のテストを実行すると、昔のエラーを拾ってAIの修正作業が無駄に長引く原因になります。
- ローカルHooks
まとめ:Claude Code Hooksで開発を完全自動化しよう
Claude Code Hooksを活用すると、AIエージェントの自由な思考と開発チームの厳格な規律を高い次元で調和させられます。
- 決定論的な強制力
プロンプト指示の限界を超え、システム側で100%確実にルールを適用できます。 - 細かな割り込み制御
ツールの実行前後やタスク完了など、計31種類のイベントで柔軟な自動化が可能です。 - 安全なスコープ設計
チーム共通ルールは .claude/settings.json で共有し、機密情報はローカルに分離します。 - スピードと安全性の両立
重い検証は Stop イベントへ集約し、通知やログ保存は非同期(async: true)で処理させましょう。
導入時は、以下のステップで段階的に自動化を進めるアプローチがスムーズです。
| 導入ステップ | 実装するフック内容 | 期待できる効果 |
| 1.自動整形 | 保存直後のコード自動整形 | ファイル保存時の文字ズレやスタイルの指摘をゼロ化 |
| 2.安全対策 | 危険な命令の強制ブロック | データの全消去や無理な上書き操作を未然防止 |
| 3.品質担保 | テスト合格による完了判定 | エラーを含む未完成コードの混入を100%阻止 |
| 4.外部連携 | チャットツールへの通知 | 画面を見つめる無駄な時間をなくし、別の作業に集中 |
まずは設定が簡単で効果を体感しやすい「フォーマッターの自動実行」から始めてみてください。開発環境に合わせて徐々にガードレールを追加し、信頼できる自律開発パイプラインを構築しましょう。


コメント