#05

Hooksで自動化する

上級

特定のタイミングで処理を自動実行するHooksの仕組みを学び、settings.jsonに設定します。

座学

この講座で学べること

  • HooksがClaude Codeの動作タイミングに合わせてコマンドを自動実行できることを理解する
  • PreToolUse・PostToolUse・Stop・Notificationの4種類のフックの役割を把握する
  • settings.jsonにStopフックを設定してファイルにログを書き出す手順を習得する
  • settings.json保存後にClaude Codeを再起動しないとフックが有効にならないことを知る

Hooks(フック)は、Claude Codeが特定の動作をした「タイミング」に合わせて自動的にシェルコマンドを実行できる機能です。たとえば「ファイルを保存するたびに自動でコードフォーマッターを実行する」「作業が完了したらデスクトップ通知を出す」「ファイルが編集されるたびにgit statusを記録する」といった自動化が実現できます。毎回手動で実行していた確認作業をHooksに任せることで、作業の抜け漏れを防げます。

Hooksには4種類あります。PreToolUse(ツール実行の直前)・PostToolUse(ツール実行の直後)・Stop(Claude Codeが応答を終えたとき)・Notification(Claude Codeが通知を必要とするとき)です。最も使いやすいのはStopで、「作業が完了したら〇〇する」という形の自動化に使えます。PostToolUseは特定のツール(ファイル編集・Bash実行など)の直後に動かしたいときに使います。

Hooksの設定はsettings.jsonに記述します。設定ファイルには2種類あります。`~/.claude/settings.json` は全プロジェクト共通のグローバル設定、プロジェクトフォルダ内の `.claude/settings.json` はそのプロジェクト専用の設定です。この講座ではプロジェクト内のsettings.jsonを使います。プロジェクト単位で管理でき、チームで共有もしやすいのが特徴です。

Hooksで実行できるのはシェルコマンドです。echoでログファイルに書き出す・外部スクリプトを呼び出す・curlでWebhookを叩くなど、シェルで実行できることは基本的に何でもHooksから呼べます。ただしフックが多すぎると動作が重くなるため、本当に必要なものだけを設定しましょう。まずStopフックを1つ設定して動作を確認し、徐々に増やしていくのがおすすめです。

Hooksの種類と発火タイミング

PreToolUse

ツール実行の直前

「ファイルを書き込む前にバックアップを取る」

PostToolUse

ツール実行の直後

「ファイル保存後にgit statusを自動実行」

Stop

Claude Codeが応答を終えた時

「作業完了時にSlackに通知を送る」

Notification

通知が必要な時

「エラー発生時に音を鳴らす」

⚠️ Hooksが多すぎると動作が重くなります。本当に必要なものだけを設定しましょう。

📄 HooksとClaude Desktopの設定ファイルは別物です

claude_desktop_config.json はClaudeデスクトップアプリのMCP設定用ファイルです。HooksはClaude Code CLI の settings.json に書きます。この講座ではプロジェクトフォルダ内の .claude/settings.json を使います。混同しないよう注意してください。

PostToolUse + Bash ツールの組み合わせで「特定のファイルが変更されたとき」に反応するフックが作れます。

実践手順

Hooksの設定ファイルを開く

プロジェクトフォルダ内の .claude/settings.json を開きます。ファイルを開いたら次のステップのJSONを追記してください。すでに内容がある場合は既存のJSONの中に "hooks" セクションを追加してください。

settings.json を開く(Windows)

プロジェクトフォルダで実行してください。.claude フォルダごと作成します。

powershell
New-Item -Path ".claude\settings.json" `
  -ItemType File -Force

作成したファイルをメモ帳で開きます。

powershell
notepad .claude\settings.json

Stop フックを設定する

作業完了時にログファイルへ記録するフックを追加します。StopフックのstdoutはClaude Codeのコンソールに表示されないため、ファイルへの書き出しで動作を確認します。settings.json に以下の内容を記述してください。すでに settings.json に別の設定がある場合は既存の { } の中に "hooks": { ... } を追加してください。

json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "echo '✅ Claude Codeの作業が完了しました!' >> hook_log.txt"
          }
        ]
      }
    ]
  }
}

フックが動作することを確認する

settings.json を保存してから Claude Code を再起動してください。再起動しないとHooksが読み込まれません。再起動後、Claude Codeに何か作業をさせてください。完了後に以下のコマンドで hook_log.txt の内容を確認します。ログが追記されていればフックが正常に動作しています。

zsh
cat hook_log.txt

確認チェック

講座を終える前に、以下の項目を確認しましょう。

よくある質問

Q. settings.jsonを保存したのにHooksが動きません

A. Claude Codeの再起動が必要です。settings.jsonの変更はClaude Code起動時にのみ読み込まれます。/exitでClaude Codeを終了し、再度claudeコマンドで起動してください。再起動後に作業を依頼してhook_log.txtを確認してください。

Q. PreToolUseとPostToolUseのmatcherには何を書けばいいですか?

A. matcherにはツール名を指定します。代表的なツール名はWrite(ファイル作成・上書き)・Edit(ファイル編集)・Bash(コマンド実行)・Read(ファイル読み込み)です。matcherを空文字列にすると全ツールに反応します。例えばEdit後だけ実行したい場合は `"matcher": "Edit"` と書きます。

Q. Hooksのコマンドでエラーが出るとClaude Codeの動作に影響しますか?

A. HooksのコマンドがエラーになってもClaude Code自体の動作は止まりません。ただしPreToolUseのHooksでエラーが発生するとツールの実行がブロックされることがあります。Hooksのデバッグ時はまずStopフックでシンプルなechoコマンドから始めることを推奨します。

Q. Windowsでhook_log.txtにログが出力されません

A. Windowsではシェルコマンドの書き方が異なります。`echo 'テキスト' >> hook_log.txt` の代わりに `cmd /c "echo テキスト >> hook_log.txt"` と書くか、PowerShellを指定して `powershell -Command "Add-Content hook_log.txt 'テキスト'"` のように記述してください。

関連講座

「確認チェック」の全項目にチェックを入れると完了できます