コンテンツにスキップ

Claude Code 完全ガイド

Claude Code Hooks完全ガイド(2026年3月版)

対象 / ポイント

対象: Claude Codeを使う開発者で、繰り返し作業の自動化やルールの強制をプロンプト指示に頼らず実現したい方。

ポイント:

  • Hooksは21種のライフサイクルイベントで確実に実行される -- 保存時の自動フォーマット、危険コマンドのブロック、テスト強制など
  • 4種のハンドラ:シェルcommand、HTTP http、LLM判定のprompt、コードベース検証のagent
  • /hooks CLIメニュー(読み取り専用)、JSON設定、スキル/エージェントfrontmatterで設定可能

Claude Codeがファイルを書くたびにPrettierを走らせたい。rm -rf /を実行しようとしたらブロックしたい。プロンプトで「お願い」することもできるが、お願いは保証ではない。Hooksなら確定的に実行される。

実際に動くフックの例を見てみよう。Claudeがファイルを編集するたびにPrettierを自動実行する設定だ:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
          }
        ]
      }
    ]
  }
}

.claude/settings.jsonに置くだけで、ファイル書き込みのたびにPrettierが走る。プロンプト不要、権限ダイアログなし、例外なし。

この記事では全21イベント、4種のハンドラ、非同期実行、JSONによる高度な制御を網羅する。目次から必要なセクションに直接ジャンプできる。

前回バージョンからの主な変更点(2026年3月更新)

イベント数が14→21に増加(InstructionsLoaded, ConfigChange, WorktreeCreate/Remove, PostCompact, Elicitation/ElicitationResult追加)、HTTPフックタイプが新設、/hooksメニューが読み取り専用に変更、disableAllHooksで一括無効化が可能に。

Claude Code Hooksとは?

Hooksは、Claude Codeのライフサイクルに確定的な処理を割り込ませる仕組みだ。プロンプトでの指示がClaudeの解釈に委ねられる「お願い」であるのに対し、Hooksは毎回同じように実行される。

Claude Code実行 → 特定イベント発火 → matcher判定 → フック実行(command / http / prompt / agent)

Hookイベント一覧(全21種)

公式ドキュメントで定義されている全21種のライフサイクルイベント。

  • SessionStart

    セッション開始時に発動(startup / resume / clear / compact) 例:開発コンテキスト注入、環境変数の永続化

  • SessionEnd

    セッション終了時に発動 例:クリーンアップ、セッション統計ログ記録

  • UserPromptSubmit

    ユーザーがプロンプト送信時に発動 例:プロンプトのバリデーション、コンテキスト追加

  • PreToolUse

    ツール実行に発動 例:危険コマンドのブロック、ツール入力の書き換え

  • PermissionRequest

    権限ダイアログ表示時に発動 例:安全なコマンドの自動承認

  • PostToolUse

    ツール実行成功後に発動 例:ファイル保存後の自動lint/format

  • PostToolUseFailure

    ツール実行失敗後に発動 例:失敗ログ記録、リトライ判定

  • Notification

    通知発生時に発動(permissionprompt / idleprompt / authsuccess / elicitationdialog) 例:デスクトップ通知、Slack通知

  • Stop

    Claudeが応答完了時に発動 例:自動git commit、タスク完了ログ

  • SubagentStart

    サブエージェント開始時に発動 例:DB接続セットアップ、特定エージェント用の環境準備

  • SubagentStop

    サブエージェント終了時に発動 例:タスク完了の強制、結果ログ記録

  • PreCompact

    コンテキスト圧縮に発動 例:会話トランスクリプトのバックアップ

  • PostCompact

    コンテキスト圧縮に発動 例:圧縮サマリーの記録、コンテキスト再注入

  • TeammateIdle

    Agent Teamsのチームメイトがアイドル状態になる直前に発動 例:アイドルエージェントへのタスク再割り当て

  • TaskCompleted

    タスクが完了マークされた時に発動 例:完了通知、次タスクのトリガー

  • InstructionsLoaded

    CLAUDE.mdや.claude/rules/*.mdがコンテキストに読み込まれた時に発動 例:設定ファイルの監視(制御不可、監視のみ)

  • ConfigChange

    セッション中に設定ファイルが変更された時に発動 例:設定変更の監査ログ、不正な変更のブロック

  • WorktreeCreate

    --worktreeやisolation: "worktree"でワークツリー作成時に発動 例:カスタムワークツリー作成ロジック

  • WorktreeRemove

    ワークツリー削除時に発動 例:クリーンアップ処理

  • Elicitation

    MCPサーバーがユーザー入力を要求した時に発動 例:入力の自動応答、入力要求の拒否

  • ElicitationResult

    MCP入力要求にユーザーが応答した後に発動 例:応答内容の検証、ログ記録

フックハンドラの種類(4タイプ)

4種のハンドラタイプが利用可能。

タイプ説明用途対応イベント
commandシェルコマンドを実行lint、git操作、通知、バックアップ全イベント
httpHTTPエンドポイントにPOST外部サービス連携、チーム共有の監査ログ全イベント
promptLLMに判断を委ねる(単一ターン)コンテキスト依存の許可/拒否判定PreToolUse, PostToolUse, PermissionRequest, UserPromptSubmit, Stop, SubagentStop, TaskCompleted等
agentエージェントがコードベースを検証(マルチターン)実際のファイル状態に基づく複雑な判断prompt対応イベントと同じ
// command型(確定的ルール向き)
{
  "type": "command",
  "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
}

// http型(外部サービス連携)
{
  "type": "http",
  "url": "http://localhost:8080/hooks/pre-tool-use",
  "headers": { "Authorization": "Bearer $MY_TOKEN" },
  "allowedEnvVars": ["MY_TOKEN"]
}

// prompt型(LLM判断が必要な場合)
{
  "type": "prompt",
  "prompt": "このBashコマンドが本番環境に影響を与える可能性があるか評価してください: $ARGUMENTS"
}

// agent型(コードベースの状態確認が必要な場合)
{
  "type": "agent",
  "prompt": "変更されたファイルに対応するテストが存在するか確認してください"
}

使い分けの指針

  • command: シンプルで確定的なルール(formatやlint、git操作)→ 常にcommandを優先
  • http: 外部サービスとの連携、チーム共有の監査・バリデーション → commandと同等の制御が可能
  • prompt: フック入力データだけで判断できる場合(コマンドの危険性評価など)
  • agent: 実際のコードベースの状態を確認する必要がある場合(テストの存在確認など)

非同期フック(async)— 2026年1月追加

ブロッキングせずにバックグラウンドで実行する非同期フックが追加されました。

{
  "type": "command",
  "command": "node backup-script.js",
  "async": true,
  "timeout": 30
}
同期フック(デフォルト)非同期フック(async: true
Claudeの動作フック完了まで待機待機せず即座に続行
ブロック制御exit code 2 でブロック可能ブロック不可
適した用途セキュリティチェック、権限判定ログ記録、バックアップ、通知送信
不適な用途時間のかかる処理Claudeが結果を必要とする処理

Exit Codeの制御体系

フックのexit codeでClaudeの挙動を制御できます。

Exit 0  → 成功。stdoutのJSON出力を解析
Exit 2  → ブロッキングエラー。stderrがClaudeにフィードバック
その他  → 非ブロッキングエラー。verboseモードでstderr表示、実行は継続

Exit 2の挙動はイベントごとに異なります:

イベントExit 2の効果
PreToolUseツール呼び出しをブロック
UserPromptSubmitプロンプトを拒否
PermissionRequest権限を拒否
Stop / SubagentStop停止をブロック(作業継続を強制)
TeammateIdleチームメンバーの待機を防止
TaskCompletedタスク完了マークを防止
ConfigChange設定変更をブロック
ElicitationMCP入力要求を拒否
ElicitationResult応答をブロック(declineに変更)
SessionStart / PreCompactstderrをユーザーに表示のみ(ブロック不可)
PostToolUse / Notificationstderrを表示のみ(実行済みのためブロック不可)

JSON構造化出力による高度な制御

Exit 0時にstdoutへJSON出力することで、きめ細かい制御が可能です。

PreToolUseの権限判定

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "permissionDecisionReason": "Safe read operation",
    "updatedInput": {
      "command": "modified-command"
    },
    "additionalContext": "Claudeへの追加コンテキスト"
  }
}
  • "allow": 権限システムをバイパスして許可
  • "deny": ツールをブロックし、理由をClaudeにフィードバック

PermissionRequestの自動応答

{
  "hookSpecificOutput": {
    "hookEventName": "PermissionRequest",
    "decision": {
      "behavior": "allow",
      "updatedInput": {
        "command": "npm run lint"
      }
    }
  }
}

Stop/SubagentStopの完了強制

{
  "decision": "block",
  "reason": "テストが失敗しています。修正してから完了してください。"
}

設定ファイルの配置場所

場所スコープ共有可能
~/.claude/settings.json全プロジェクト共通いいえ(ローカルのみ)
.claude/settings.jsonプロジェクト固有はい(Git管理可能)
.claude/settings.local.jsonプロジェクト固有いいえ(gitignored)
組織管理ポリシーエンタープライズ全体はい(管理者制御)
プラグイン hooks/hooks.jsonプラグイン有効時はい(バンドル配布)
スキル/エージェントfrontmatterコンポーネント活動中はい(ファイル内定義)

全フックの一括無効化

設定ファイルに "disableAllHooks": true を追加すると、全フックを一括で無効化できます。

設定例

1. /hooks CLIメニューで確認

# Claude Code CLI内で
/hooks
# → イベント一覧とフック数が表示される
# → イベント選択 → 設定済みフックの詳細を確認

/hooksメニューは読み取り専用

フックの追加・変更・削除は設定JSONファイルを直接編集するか、Claudeに変更を依頼してください。

2. 基本的なJSON設定

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '作業完了!' >> ~/work.log"
          }
        ]
      }
    ]
  }
}

3. SessionStartでコンテキスト注入

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"additionalContext\": \"現在のブランチ: '$(git branch --show-current)'\"}'"
          }
        ]
      }
    ]
  }
}

SessionStartとUserPromptSubmitのstdout出力はClaudeのコンテキストとして追加されます。

4. 環境変数の永続化(SessionStart限定)

SessionStartフックではCLAUDE_ENV_FILEを使って環境変数をセッション全体に永続化できます。

#!/bin/bash
# setup-env.sh - SessionStartフックから呼び出す
echo "PROJECT_ROOT=$(git rev-parse --show-toplevel)" >> "$CLAUDE_ENV_FILE"
echo "NODE_ENV=development" >> "$CLAUDE_ENV_FILE"

5. スキル/エージェントのfrontmatterにフック定義

---
name: code-reviewer
description: コード変更を自動lintでレビュー
hooks:
  PreToolUse:
    - matcher: "Bash"
      hooks:
        - type: command
          command: "./scripts/validate-command.sh $TOOL_INPUT"
  PostToolUse:
    - matcher: "Edit|Write"
      hooks:
        - type: command
          command: "./scripts/run-linter.sh"
---
あなたはコードレビューの専門エージェントです。

frontmatter内のStopフック

スキル/エージェントのfrontmatterで定義したStopフックは自動的にSubagentStopイベントに変換されます。

活用例

  • 自動Format/Lint

    PostToolUseでファイル変更後に自動整形。matcherでWrite|Edit|MultiEditを指定

  • セキュリティブロック

    PreToolUseで危険なBashコマンド(rm -rf等)をexit code 2でブロック

  • デスクトップ通知

    Notificationでアイドル時・権限要求時にOS通知を送信

  • 安全コマンド自動承認

    PermissionRequestでnpm run lint等を自動allow

  • テスト強制

    Stopのexit code 2で「テストが通るまで完了させない」を実現

  • 自動Git管理

    PostToolUseでGitButler等と連携し、セッションごとにブランチ自動分離

  • 圧縮前バックアップ

    PreCompactでコンテキスト圧縮前にトランスクリプトを自動保存

  • Agent Teams連携

    SubagentStart/Stop, TeammateIdleでサブエージェントのライフサイクル管理

  • セッション初期化

    SessionStartで開発環境セットアップ、依存関係インストール、DB初期化を自動実行

  • LLM判定フック

    prompt/agent型でコンテキスト依存の判断(本番影響の評価等)をLLMに委ねる

実践パターン:GitButler連携

複数のClaude Codeセッションを同時実行する場合、GitButlerのフックでセッションごとにブランチを自動分離できます。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|MultiEdit|Write",
        "hooks": [
          { "type": "command", "command": "but claude pre-tool" }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|MultiEdit|Write",
        "hooks": [
          { "type": "command", "command": "but claude post-tool" }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          { "type": "command", "command": "but claude stop" }
        ]
      }
    ]
  }
}

デバッグとトラブルシューティング

フックのテスト

# stdinにサンプルJSONをパイプしてテスト
echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh
echo $?  # exit codeを確認

Stopフックの無限ループ防止

Stopフックでexit 2を返すとClaudeは作業を継続するが、これが無限ループを引き起こす場合がある。stop_hook_activeフィールドを確認して防止する:

#!/bin/bash
INPUT=$(cat)
if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then
  exit 0  # 2回目以降は停止を許可
fi
# ... フックのロジック

よくある問題

症状原因対処
フックが実行されない/hooksで表示されないセッション再起動、設定ファイルの構文確認
"command not found"相対パスの問題$CLAUDE_PROJECT_DIRで絶対パス指定
"jq: command not found"jq未インストールjqインストール、またはPython/Node.jsで代替
PermissionRequestが発火しない非インタラクティブモード-pフラグ使用時はPreToolUseを使う
非同期フックでブロックできないasync: trueの制限セキュリティチェックは同期フックで
JSON解析エラーシェルプロファイルのechoがJSON出力を汚染~/.zshrc等でif [[ $- == *i* ]]ガード追加
Stopフックが無限ループstop_hook_active未チェック上記の無限ループ防止パターンを実装
設定変更が反映されないセッション中のファイル編集/hooksで確認するかセッション再起動

verboseモードの活用

# Ctrl+O でverboseモード切替
# → PreToolUse/PostToolUse等のstdout/stderrが表示される

バージョン別変更点まとめ

項目旧版(2025年)2026年2月版現在(2026年3月版)
イベント数7種14種21種
フックタイプcommandのみcommand / prompt / agentcommand / http / prompt / agent
非同期実行なしasync: true 対応同左
JSON出力制御なしpermissionDecision等同左
設定方法JSON手動編集のみ/hooks CLIメニュー + JSON/hooks(読み取り専用)+ JSON + frontmatter
環境変数永続化なしCLAUDE_ENV_FILE同左
プラグイン対応なしhooks/hooks.json同左
Agent TeamsなしTeammateIdle / TaskCompleted同左
MCP連携なしなしElicitation / ElicitationResult
ワークツリーなしなしWorktreeCreate / WorktreeRemove
設定監視なしなしConfigChange / InstructionsLoaded
一括無効化なしなしdisableAllHooks: true

関連記事で詳しく学ぶ

用途別の詳細ガイド

🎯 AIエージェント自動化編

  • 自動記事投稿システムの構築
  • GSC連携による最適化
  • 実践的な自動化パターン

🛠️ プロダクション実装編

  • エラーハンドリングとリトライ
  • チーム開発での活用
  • 本格運用のベストプラクティス

🔧 高度な条件付き実行編

  • 環境変数を使った条件分岐
  • 特定ファイルパターンでの実行制御
  • 記事作成時のみgit pushする精密制御

📚 さらに学ぶには

まとめ

Claude Code Hooksは2026年3月現在、21種のライフサイクルイベント、4種のハンドラタイプ、非同期実行、JSON構造化出力を備えた本格的なオートメーション基盤に成長しています。

  • 確定的な制御:プロンプトの「お願い」ではなく「必ず実行」を保証
  • 21イベント対応:セッション開始から終了、Agent Teams、MCP連携、ワークツリーまでカバー
  • 4種のハンドラ:command、http、prompt、agentを用途に応じて選択
  • 非同期フック:ログ・通知・バックアップをノンブロッキングで実行
  • JSON制御:権限の自動判定、ツール入力の書き換え、停止のブロック
  • 配布可能:プラグインやfrontmatterでチーム/プロジェクト単位で共有

🔗 関連記事