Claude Code Hooksとは?
設定方法と実用例を完全解説
コマンド実行のタイミングでシェルを自動起動 ─ 自動フォーマット・安全管理・通知を実現
Claude Code の Hooks(フック)機能を使うと、AIがツールを実行するタイミングに合わせて任意のシェルコマンドを自動実行できます。コードの自動フォーマット、危険なコマンドのブロック、Slack通知など、エンジニアの業務フローに深く統合したカスタマイズが可能です。
この記事では、Hooksの仕組みから設定ファイルの書き方、すぐ使える実用例まで徹底解説します。
1. Hooksとは何か
Hooks は Claude Code の設定ファイル(settings.json)に記述するイベントドリブンなシェルフック機能です。Claude がファイルを読む・書く・コマンドを実行するといった操作(ツール呼び出し)の「前後」に、指定したシェルコマンドを自動で走らせることができます。
Claude Code はAIが主体的に操作を行うため、通常のエディタ拡張のような「保存時にフォーマット」「コミット前にLint」といった自動化が難しい。Hooksを使うことで、AIの操作をトリガーにした自動化が実現できる。
フックは Claude が行う操作に「人間のコードレビュー」を差し込むようなイメージです。AIが何かしようとしたとき・した後に、あなたが書いたスクリプトが割り込んで確認・修正・通知を行えます。
2. フックの種類(5種類)
Claude がツールを呼び出す直前に実行される。終了コード2を返すとツール実行をブロックできる。危険なコマンドの検出・確認ダイアログの表示などに使う。
Claude がツールを実行した直後に動く。ファイル編集後の自動フォーマット・テスト実行・ログ記録などに最もよく使われる。
Claude Code が通知を出すタイミング(長時間処理の完了・エラー発生など)で実行される。Slack・メール・デスクトップ通知との連携に使う。
Claude が応答を終えたタイミングで実行される。作業完了後の後処理・サマリーのログ保存などに使う。
Agent ツールで起動したサブエージェントが完了したタイミングで実行される。並列処理の完了監視などに使う。
3. 設定ファイルの書き方
Hooksは settings.json に記述します。設定ファイルの場所は2種類あり、用途によって使い分けます。
| 場所 | パス | 適用範囲 |
|---|---|---|
| ユーザー設定 | ~/.claude/settings.json |
すべてのプロジェクト |
| プロジェクト設定 | .claude/settings.json |
そのプロジェクトのみ |
| ローカル設定(Git管理外) | .claude/settings.local.json |
そのプロジェクト・自分のみ |
基本構造
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
}
]
}
]
}
}
構造の説明
- 最上位キー: フックのタイプ(
PreToolUse/PostToolUse/Notification/Stop/SubagentStop) - matcher: 対象ツール名(正規表現使用可)
- type: 現時点では
"command"のみ - command: 実行するシェルコマンド
環境変数で情報を受け取る
フック実行時、Claude Code は以下の環境変数を自動でセットします。
| 環境変数 | 内容 |
|---|---|
CLAUDE_TOOL_NAME |
実行されたツール名(例: Write, Bash) |
CLAUDE_TOOL_INPUT_FILE_PATH |
対象ファイルのパス(Write/Edit/Readなど) |
CLAUDE_TOOL_INPUT_COMMAND |
Bashツールで実行しようとしたコマンド |
CLAUDE_TOOL_RESPONSE |
ツールの実行結果(PostToolUse のみ) |
CLAUDE_NOTIFICATION_MESSAGE |
通知メッセージ(Notification のみ) |
4. マッチャー(対象ツールの絞り込み)
matcher フィールドには正規表現が使えます。これにより、特定のツールだけにフックを適用できます。
// Write または Edit ツールにのみ適用
"matcher": "Write|Edit"
// Bash ツールにのみ適用
"matcher": "Bash"
// すべてのツールに適用(matcher を省略)
// ※ matcher を省略すると全ツールにマッチ
// ファイル名でさらに絞り込む(コマンド側で条件分岐)
"matcher": "Write"
主なツール名: Bash、Write、Edit、Read、Glob、Grep、Agent、WebFetch、WebSearch
5. すぐ使える実用例7選
例1: ファイル保存時に自動フォーマット PostToolUse
Claude がファイルを書き換えるたびに Prettier で自動整形します。コードスタイルの乱れを防げます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\" 2>/dev/null || true"
}
]
}
]
}
}
例2: Python ファイル保存時に型チェック PostToolUse
.py ファイルが編集されたときだけ mypy で型チェックを走らせます。エラーがあれば Claude のコンテキストに結果が返ります。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT_FILE_PATH\" | grep -q '\\.py$'; then mypy \"$CLAUDE_TOOL_INPUT_FILE_PATH\" --ignore-missing-imports; fi"
}
]
}
]
}
}
例3: 危険なコマンドをブロック PreToolUse
rm -rf や DROP TABLE などの破壊的なコマンドを検出してブロックします。終了コード2を返すとツール実行が中断されます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT_COMMAND\" | grep -qE 'rm\\s+-rf|DROP\\s+TABLE|format\\s+[A-Z]:'; then echo 'BLOCKED: 危険なコマンドが検出されました' >&2; exit 2; fi"
}
]
}
]
}
}
例4: 作業ログを自動記録 PostToolUse
Claude が編集したファイルをすべてタイムスタンプ付きでログファイルに記録します。あとから何を変更したか追いかけられます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') [${CLAUDE_TOOL_NAME}] ${CLAUDE_TOOL_INPUT_FILE_PATH}\" >> ~/.claude/edit_history.log"
}
]
}
]
}
}
例5: 完了時にデスクトップ通知(macOS) Stop
Claude の応答が完了したときに macOS の通知センターへ通知を送ります。長い処理を待っている間、別の作業ができます。
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code の作業が完了しました\" with title \"Claude Code\"'"
}
]
}
]
}
}
例6: テスト自動実行 PostToolUse
テストファイルが変更されたとき、または src/ 以下のファイルが変更されたときに自動でテストを走らせます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT_FILE_PATH\" | grep -qE '\\.(test|spec)\\.(ts|js)$|^src/'; then npm test -- --passWithNoTests 2>&1 | tail -5; fi"
}
]
}
]
}
}
例7: 本番設定ファイルへのアクセスを警告 PreToolUse
.env.production や本番の設定ファイルに Claude がアクセスしようとした場合に警告メッセージを出します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit|Read",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT_FILE_PATH\" | grep -qE '\\.env\\.production|config/production'; then echo 'WARNING: 本番設定ファイルへのアクセスを検出しました。意図的ですか?' >&2; fi"
}
]
}
]
}
}
6. 終了コードによる動作制御
フックのコマンドが返す終了コードによって、Claude Code の動作が変わります。
| 終了コード | 動作 | 使いどころ |
|---|---|---|
0 |
正常終了。処理を続行 | 通常のフック処理 |
1 |
エラー。Claude にエラー内容を伝えて続行 | 警告・フォーマットエラーの通知 |
2 |
ブロック。ツールの実行を中断してClaudeに伝える | 危険なコマンドの阻止(PreToolUse のみ有効) |
終了コード2によるブロックは PreToolUse でのみ意味を持ちます。PostToolUse でコード2を返しても、ツールはすでに実行済みなので取り消しはできません。
stderr への出力を活用する
フックのコマンドが stderr(標準エラー出力)に出力した内容は、Claude のコンテキストに渡されます。Claude がそのメッセージを読んで次の行動を判断できるため、単なるブロックより賢い制御が可能です。
# 例:詳細なエラーメッセージを stderr に出力
if [ 条件 ]; then
echo "理由: 〇〇のため実行できません。代わりに〇〇してください。" >&2
exit 2
fi
7. 設定のコツと注意点
複数フックは配列で並べる
同じイベントに複数のフックを登録したい場合は、hooks 配列に追加するだけです。上から順番に実行されます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\" 2>/dev/null || true" },
{ "type": "command", "command": "eslint --fix \"$CLAUDE_TOOL_INPUT_FILE_PATH\" 2>/dev/null || true" }
]
}
]
}
}
フックが遅いと Claude の応答も遅くなる
フックは同期的に実行されるため、重い処理(ビルド全体など)を入れると Claude の応答が著しく遅くなります。フックには軽量なチェックのみを入れ、重い処理はバックグラウンドで走らせることを推奨します。
# NG: ビルド全体をフックに入れる(遅い)
"command": "npm run build"
# OK: バックグラウンドで実行する
"command": "npm run build &"
設定反映はセッション再起動が必要
settings.json を編集したあとは、Claude Code を再起動するか新しいセッションを開始しないと反映されません。
デバッグには echo で確認
フックが期待通り動いているか確認したいときは、一時的に echo でログを出力させて動作確認するのが手軽です。
{
"type": "command",
"command": "echo \"HOOK: $CLAUDE_TOOL_NAME が $CLAUDE_TOOL_INPUT_FILE_PATH に実行されました\" >> /tmp/hook_debug.log"
}
プロジェクト共通のルール(フォーマット・Lint・危険コマンドブロック)は .claude/settings.json に入れてGit管理。個人の通知設定など共有したくないものは .claude/settings.local.json(.gitignore に追加)に分けると整理しやすい。
まとめ
- Hooks = Claude のツール実行の前後・完了時にシェルを自動起動する機能
- フックは5種類:
PreToolUse/PostToolUse/Notification/Stop/SubagentStop settings.jsonのhooksセクションに記述。matcher で対象ツールを絞り込める- 終了コード2(PreToolUseのみ)でツール実行をブロックできる
- stderrへの出力はClaudeのコンテキストに渡される
- 重い処理はバックグラウンド実行(
&)で応答速度を維持する - チーム共通設定は
settings.json、個人設定はsettings.local.jsonに分離
Hooksを活用することで、Claude Code は単なる「AIアシスタント」からチームの開発ルールに組み込まれた自動化エンジンへと進化します。まずは自動フォーマットや危険コマンドのブロックから試してみてください。
Claude Code をもっと活用したい方へ
スキル登録・Auto Mode・CLAUDE.md の使い方も合わせてチェック
