Claude Code のフック(hooks)入門:ワークフローを自動化する

「変更のたびに自動でフォーマットしたい」「危険なコマンドは実行前に止めたい」——こうした運用を Claude Code に組み込むのがフック(hooks)です。ライフサイクルの特定イベントで任意の処理を自動実行できます。本記事では公式ドキュメントに基づき、設定場所・主要イベント・ブロックの仕組みを実務目線で整理します。

本記事は Claude Code の公式ドキュメント(Anthropic)を参照し、当社が日本語でまとめたものです。フックの仕様・イベント名はバージョンにより追加・変更される場合があります。最新かつ正確な情報は記事末尾の一次資料でご確認ください。

1. フックとは何か

フックは、Claude Code のライフサイクルの特定のイベントで自動実行されるユーザー定義の処理です。ツール実行の前後や、応答の停止時などに割り込み、シェルコマンドの実行・整形・ポリシーの強制などを自動化できます。プロンプトでお願いするのと違い、フックは確実に・毎回実行される点が特長です。

2. どこに設定するか

フックは JSON で設定します。おもな場所は次のとおりです(優先順位順)。

3. 主なフックイベント

イベントは多数ありますが、まず押さえたい代表的なものは次の通りです。

イベント名発火タイミング
PreToolUseツールが実行される直前。ここでブロックや入力の書き換えができる。
PostToolUseツールが実行された直後。整形やログ記録に。
UserPromptSubmitユーザーがプロンプトを送信したとき。
StopClaude が応答を終えようとするとき。
SubagentStopサブエージェントが停止したとき。
SessionStart / SessionEndセッションの開始時・終了時。
NotificationClaude Code が通知を送るとき。

4. 設定の書き方(matcher とコマンド)

設定は「イベント名 → matcher → hooks 配列」の3階層で書きます。matcher は対象ツールを絞る条件で、Edit|Write のようにパイプで複数指定したり、省略・* で全ツール対象にできます。次は、ファイルを書き込んだに自動整形する例です。

# .claude/settings.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_PROJECT_DIR\""
          }
        ]
      }
    ]
  }
}

フックにはツールのイベント情報が標準入力(stdin)にJSONで渡されます。共通フィールドには session_idcwdhook_event_name などが含まれ、ツールイベントでは tool_nametool_input も渡されます。パスには ${CLAUDE_PROJECT_DIR}(プロジェクトルート)などのプレースホルダが使えます。

5. 終了コードで挙動を制御する

フックの終了コードは、その後の挙動を左右します。ここは間違えやすいので特に重要です。

終了コード挙動
0成功。stdout に出力したJSONを構造化出力として解釈する。ブロックしない。
2ブロッキングエラー。stdout のJSONは無視され、stderr がエラーメッセージとして Claude に渡される。PreToolUse などでは操作がブロックされる。
その他多くのイベントで非ブロックのエラー扱い。実行は継続し、stderr がトランスクリプトに表示される。
注意: ポリシーを強制したい(=操作を止めたい)場合は、必ず終了コード2を返します。exit 1 は非ブロック扱いになり、操作は止まりません。ここを取り違えると「止めたつもりで止まっていない」事故につながります。

次は、PreToolUse で危険な削除コマンドを止める最小例です。stderr に理由を書き、終了コード2で終わります。

# .claude/hooks/block-rm.sh(PreToolUse から呼ぶ)
input=$(cat)   # stdin から JSON を読む
cmd=$(printf '%s' "$input" | grep -o '"command"[^,}]*')
case "$cmd" in
  *"rm -rf"*)
    echo "rm -rf は禁止されています。" >&2
    exit 2 ;;   # 終了コード2でブロック
esac
exit 0

6. 実務での使いどころ

これは、当社が別記事で紹介した Mitchell Hashimoto 氏の「ハーネスエンジニアリング」——エージェントの周囲の環境(ハーネス)を整える——という発想とも一致します。フックは、その環境を宣言的に固める有力な手段です。

参考元記事

  1. Anthropic「Hooks(Claude Code 公式ドキュメント)」— https://code.claude.com/docs/en/hooks

よくある質問(FAQ)

Claude Code のフックとは何ですか?

フックは、Claude Code のライフサイクルの特定のイベント(ツール実行の前後、停止時など)で自動実行されるユーザー定義の処理です。settings.json に設定し、コマンド実行・整形・ポリシーの強制などを自動化できます。

フックはどこに設定しますか?

~/.claude/settings.json(ユーザー全体)、プロジェクトの .claude/settings.json(共有)、.claude/settings.local.json(gitignore対象)などに、hooks キー以下のJSONで設定します。

フックでツールの実行をブロックできますか?

できます。PreToolUse などのフックで終了コード2を返すと、その操作はブロックされ、stderr の内容がエラーとして Claude に渡されます。終了コード1は非ブロック扱いになる点に注意が必要です。

← 技術ブログ一覧へ戻る