Claude Codeの「フック」入門——AIエージェントの行動をルールで縛る仕組み

Claudeスキル・MCP のアイキャッチ

Claude Codeには「フック(Hooks)」という、AIエージェントの動きにルールベースの制約や自動処理を差し込める仕組みがある。ツール実行の前後やセッションの開始・終了といった決まったタイミングで、シェルコマンドやHTTPリクエスト、さらには別のAIモデルによる判定まで挟み込める。プロンプトで「危険な操作はしないで」と頼むのではなく、確定的に止める・記録する・通知するための仕組みとして押さえておきたい機能だ。

AIエージェントの行動をフックで制御するイメージ

フックとは何か

Claude Codeのフックは、エージェントのライフサイクル上の特定イベントで発火する処理だ。プロンプトで「〜しないでください」と指示するのとは違い、外部のスクリプトや別モデルの判定結果に基づいて機械的に許可・拒否を決められるため、再現性のある安全策やワークフローの自動化に向いている。設定は次のいずれかのJSONファイルに書く。

設定ファイル スコープ 共有
~/.claude/settings.json 全プロジェクト共通 個人のみ
.claude/settings.json そのプロジェクト Gitにコミットして共有可
.claude/settings.local.json そのプロジェクト(自分専用) 非共有・gitignore対象
プラグインのhooks/hooks.json プラグイン有効時 プラグインとして配布

主なフックイベント

代表的なイベントは次の通り。ツール呼び出しの前後、セッションの開始・終了、応答完了時など、エージェントの一挙手一投足に対応するタイミングが用意されている。

イベント 発火タイミング
SessionStart / SessionEnd セッション開始時・終了時(resume/forkでも再発火)
UserPromptSubmit ユーザーの入力をClaudeが処理する前
PreToolUse ツール実行の直前(ブロック可能)
PostToolUse ツール実行の直後
Stop Claudeが応答を終えたとき
Notification 権限確認や認証プロンプトの表示時
PreCompact / PostCompact コンテキスト圧縮の前後

ほかにもSubagentStart/SubagentStop、PermissionRequest、WorktreeCreateなど、Agent SDK的な用途に対応した細かいイベントが増え続けている。

ハンドラーの種類——シェルだけじゃない

フック本体(ハンドラー)は5種類ある。もともとはシェルコマンドだけだったが、2026年に入って選択肢が広がった。

  • command — シェルスクリプトや実行ファイル。標準入力でイベントのJSONを受け取る、最も基本的な形。
  • http — 指定URLへPOSTするタイプ。2026年2月に追加され、Slack通知や社内APIとの連携がシェルスクリプト無しで書けるようになった。
  • mcp_tool — 接続済みのMCPサーバーのツールを直接呼び出す。
  • prompt — 入力内容をClaude(デフォルトはHaiku系の軽量モデル)に渡し、1ターンで許可/拒否を判定させる(タイムアウト30秒)。
  • agent — ファイル読み取りやコマンド実行など複数ツールを使えるサブエージェントに判定を委ねる(最大50ターン、実験的機能)。

「rmコマンドかどうかを正規表現で見るだけ」ならcommand、「この差分は本当に安全か」といった曖昧な判断が必要ならpromptやagentタイプが向いている、という使い分けになる。

回路基板のクローズアップ
Photo: rawpixel / CC0 1.0(Openverse経由)

終了コードとJSON出力で挙動を決める

commandタイプのフックは、終了コードによって挙動が変わる。

終了コード 意味 効果
0 正常終了 標準出力のJSONを読み、そこに書かれた判定(allow/deny等)が反映される
2 ブロック PreToolUseやUserPromptSubmitなどの対象イベントを強制的に止める
1・3以上 非ブロッキングエラー 処理は続行されるが、エラー内容が通知される

終了コード2は問答無用でブロックするための簡易な手段、終了コード0+JSON出力は「許可はするが理由を記録する」「入力を書き換えて渡す」といった細かい制御に向く。

実践例

1. 危険なコマンドを止める

PreToolUseでBashをマッチさせ、rm -rfのようなパターンを検知したら拒否のJSONを返す。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh" }
        ]
      }
    ]
  }
}

スクリプト側ではjqでtool_input.commandを取り出し、危険な文字列を含むときだけpermissionDecision: "deny"を返す。

2. 編集後に自動でLintを走らせる

PostToolUseでEdit/Writeをマッチさせ、保存直後にLintやフォーマッタを走らせる。書式のズレをレビュー前に潰せる。

3. HTTPフックでSlackに通知する

httpタイプを使えば、長時間タスクの完了(Stopイベント)をSlackや社内Webhookに直接POSTできる。シェルスクリプトでcurlを書く手間が省ける分、設定ファイルだけで完結する。

使い始める際の注意点

フックはClaude自身の権限で、サンドボックスなしに実行される。設定を誤ると意図せずファイルを消したり、秘密情報を外部に送ってしまったりするリスクがある。まずは.claude/settings.local.jsonのような個人スコープで試し、チームに配る前に挙動を十分確認してから.claude/settings.jsonにコミットするのが安全だ。既存の設定を素早く整えたい場合は/hooksコマンドで対話的に追加することもできる。


主な情報源

各ツールは提供元の規約に従ってご利用ください。情報は各情報源の公開時点のものです。収集・要約はAI、公開判断は人。