💻 Claude Code入門 📖 約18分で読めます

Claude Codeのフック(Hooks)でワークフローを自動化する

PreToolUse・PostToolUseフックで品質と安全性を自動で担保

クロガイド

クロガイド|Claude&Claude Codeを無料で学ぼう

AI基礎からプロンプト術、Claude Codeの使い方まで。知識レッスンとクイズ式トレーニングで、AIスキルを段階的にアップ。ユーザー登録不要、すべて無料で今すぐ始められます。

はじめに

Claude Codeの「フック(Hooks)」は、AIがツールを実行する前後に自動的にスクリプトを実行できる機能です。コードの品質チェック、セキュリティ検証、通知などを自動化し、人間の介入なしに安全で高品質な開発を実現できます。

この記事では、フックの種類・設定方法から、実践的なユースケース5選まで、完全な設定例とともに解説します。

フックとは何か

フックは、Claude Codeの特定のイベント(ツール実行、通知など)に応じて自動的に実行されるスクリプトです。Gitのpre-commitフックやCI/CDのパイプラインに似た概念で、開発ワークフローを自動化・標準化できます。

フックの基本概念

  • トリガー:フックが実行されるきっかけ(ツール使用前、ツール使用後など)
  • マッチャー:どのツールに対してフックを発火するかのフィルタ条件
  • コマンド:フックが発火したときに実行するシェルコマンド
  • 結果処理:コマンドの終了コードに基づいて続行・中止を判断

フックの活用例

用途フックの種類実行タイミング
コード品質チェックPostToolUseファイル書き込み後にlintを実行
セキュリティ検証PreToolUseコマンド実行前に危険なコマンドをブロック
自動テストPostToolUseコード変更後にテストを自動実行
通知NotificationAIがユーザーの入力を待つときに通知
ログ記録PostToolUseツール実行の記録を残す

フックの種類

Claude Codeでは5種類のフックタイプが用意されています。

1. PreToolUse(ツール使用前)

AIがツール(ファイル書き込み、コマンド実行など)を使用するに実行されます。フックが非ゼロで終了すると、ツールの実行がブロックされます。

用途:
- 危険なコマンドの実行を防止
- ファイル書き込み前のバリデーション
- 特定のディレクトリへの書き込みをブロック

2. PostToolUse(ツール使用後)

AIがツールを使用したに実行されます。ツール実行の結果に対してアクションを実行できます。

用途:
- ファイル書き込み後の自動lint/format
- コマンド実行後の結果検証
- コード変更後の自動テスト実行

3. Notification(通知)

Claude Codeがユーザーの入力待ちになったときに実行されます。長い処理が完了したことを通知するのに便利です。

用途:
- デスクトップ通知の送信
- Slack/Discord通知
- サウンド再生

4. Stop(停止時)

Claude Codeのエージェントターンが終了したときに実行されます。

用途:
- 作業完了のログ記録
- 自動的なクリーンアップ処理

5. SubagentStop(サブエージェント完了時)

サブエージェントが完了したときに実行されるフックです。サブエージェントの結果に基づいた後処理を自動化できます。

settings.jsonでの設定方法

フックは.claude/settings.json(プロジェクト単位)または~/.claude/settings.json(グローバル)で設定します。

基本構文

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'ツール実行前のチェック'"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'ファイル書き込み後の処理'"
          }
        ]
      }
    ]
  }
}

設定の要素

要素説明
matcherフックを適用するツール名"Bash", "Write", "Edit", "Read"
hooks実行するフックの配列複数のフックを連鎖できる
typeフックの種類"command"(シェルコマンド実行)
command実行するシェルコマンド任意のシェルコマンド

マッチャーのパターン

// 特定のツールにマッチ
"matcher": "Bash"          // Bashツールのみ
"matcher": "Write"         // ファイル書き込みのみ
"matcher": "Edit"          // ファイル編集のみ

// 正規表現でマッチ
"matcher": "Write|Edit"    // 書き込みまたは編集

実例1: ファイル保存時の自動lint

ファイルが書き込まれた後に自動的にlinter/formatterを実行し、コードスタイルを常に統一します。

設定(PHP + JavaScript プロジェクト)

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if [[ \"$FILE\" == *.php ]]; then php -l \"$FILE\" 2>&1; elif [[ \"$FILE\" == *.js ]]; then npx eslint --fix \"$FILE\" 2>&1; fi"
          }
        ]
      }
    ]
  }
}

動作の流れ

  1. Claude CodeがPHPファイルを書き込み/編集
  2. フックが発火し、php -lで構文チェック
  3. JavaScriptファイルの場合はeslint --fixで自動修正
  4. エラーがあればClaude Codeに結果が返される

実例2: コード変更後の自動テスト

特定のディレクトリのファイルが変更されたら、関連するテストを自動実行します。

設定

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if [[ \"$FILE\" == */src/* ]]; then TEST_FILE=$(echo \"$FILE\" | sed 's|/src/|/tests/|' | sed 's|\\.php|Test.php|'); if [ -f \"$TEST_FILE\" ]; then php vendor/bin/phpunit \"$TEST_FILE\" --no-coverage 2>&1 | tail -5; fi; fi"
          }
        ]
      }
    ]
  }
}

動作説明

  • src/配下のファイルが変更されたとき、対応するテストファイルを探す
  • テストファイルが存在すれば自動的にPHPUnitを実行
  • 結果の最後の5行をClaude Codeに返す(コンテキスト節約のため)

実例3: 作業完了時の通知

長い処理が終わったときにデスクトップ通知を送ります。

設定(macOS)

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Codeが入力を待っています\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

設定(Windows - PowerShell)

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "powershell -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Codeが入力を待っています')\""
          }
        ]
      }
    ]
  }
}

設定(Linux)

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "notify-send 'Claude Code' 'Claude Codeが入力を待っています'"
          }
        ]
      }
    ]
  }
}

実例4: 危険なコマンドのブロック

本番環境に影響する可能性のある危険なコマンドの実行を事前にブロックします。

設定

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "BLOCKED_PATTERNS='rm -rf /|DROP TABLE|DROP DATABASE|git push.*--force|git reset --hard|:(){ :|:& };:'; CMD=$(cat /dev/stdin | jq -r '.tool_input.command'); echo \"$BLOCKED_PATTERNS\" | tr '|' '\\n' | while read pattern; do if echo \"$CMD\" | grep -qiE \"$pattern\"; then echo \"BLOCKED: 危険なコマンドが検出されました: $pattern\"; exit 1; fi; done"
          }
        ]
      }
    ]
  }
}

ブロックされるコマンドの例

パターン危険性
rm -rf /システム全体の削除
DROP TABLE / DROP DATABASEデータベースの破壊
git push --forceリモートの履歴を強制上書き
git reset --hardローカルの変更を完全に破棄

実例5: カスタムバリデーション

プロジェクト固有のルールをフックで自動検証します。

設定: セキュリティチェック

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if [[ \"$FILE\" == *.php ]]; then ISSUES=''; if grep -n 'mysql_query\\|mysqli_query.*\\$_' \"$FILE\" 2>/dev/null; then ISSUES=\"${ISSUES}SQLインジェクションの可能性あり\\n\"; fi; if grep -n 'echo.*\\$_GET\\|echo.*\\$_POST\\|echo.*\\$_REQUEST' \"$FILE\" 2>/dev/null; then ISSUES=\"${ISSUES}XSSの可能性あり\\n\"; fi; if [ -n \"$ISSUES\" ]; then echo \"セキュリティ警告:\"; echo -e \"$ISSUES\"; fi; fi"
          }
        ]
      }
    ]
  }
}

検出されるパターン

  • プリペアドステートメントを使っていないSQLクエリ
  • エスケープなしのユーザー入力の出力(XSS)

高度なフック設定

複数フックの連鎖

1つのトリガーに複数のフックを設定できます。順番に実行され、1つでも失敗すると後続は実行されません。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); echo 'Step 1: 構文チェック' && php -l \"$FILE\""
          },
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); echo 'Step 2: コーディング規約チェック' && phpcs --standard=PSR12 \"$FILE\""
          },
          {
            "type": "command",
            "command": "FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path'); echo 'Step 3: 静的解析' && phpstan analyse \"$FILE\" --level=5"
          }
        ]
      }
    ]
  }
}

フックへの入力(stdin JSON)

フックのコマンドには、標準入力(stdin)を通じてJSON形式でツール情報が渡されます。環境変数ではなく、stdinからJSONをパースして必要な情報を取得します。

stdin JSONの構造

{
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.php",
    "content": "..."
  },
  "project_dir": "/path/to/project"
}
JSONフィールド内容利用場面
tool_name実行されるツール名全フック
tool_inputツールへの入力パラメータ全フック
tool_input.file_path操作対象のファイルパスWrite/Editフック
tool_input.command実行されるBashコマンドBashフック
project_dirプロジェクトのルートディレクトリ全フック

stdinからの値取得例(jq使用)

# ファイルパスの取得
FILE=$(cat /dev/stdin | jq -r '.tool_input.file_path')

# Bashコマンドの取得
CMD=$(cat /dev/stdin | jq -r '.tool_input.command')

トラブルシューティング

よくある問題と解決策

問題原因解決策
フックが実行されないmatcherの指定ミスツール名の大文字小文字を確認("Bash", "Write", "Edit")
JSONパースエラーsettings.jsonの構文ミスJSONバリデーターで確認
コマンドがエラーになるパスの問題絶対パスを使用するか、PATHを確認
フックが遅い重い処理を同期実行出力を最小限にする、タイムアウトを設定
意図せずブロックされるPreToolUseの条件が広すぎmatcherとコマンド内の条件を絞り込む

まとめ

Claude Codeのフック機能を活用したワークフロー自動化のポイント:

  • 5種類のフック:PreToolUse(事前チェック)、PostToolUse(事後処理)、Notification(通知)、Stop(終了時処理)
  • settings.jsonで設定:プロジェクト単位(.claude/settings.json)またはグローバル(~/.claude/settings.json)
  • 主要ユースケース:自動lint、自動テスト、通知、危険コマンドのブロック、セキュリティチェック
  • matcherで対象を絞る:ツール名で発火条件を制御(Bash, Write, Edit等)
  • 段階的に導入:まず通知フックから始め、慣れてきたらlintやセキュリティチェックを追加

フックは「手動で毎回確認していたこと」を自動化する強力なツールです。まずはNotificationフックで通知を設定することから始めてみましょう。

Claude Code入門の他のガイド

Claude Code導入ガイド ― Windows/Mac完全対応
Claude Codeのインストールから初回起動まで、OS別に完全対応 ・ 約30分
Claude Codeの主要スラッシュコマンドと活用法
16個のスラッシュコマンドを完全網羅。使い方・実行例・組み合わせテクニックまで ・ 約15分
Claude Codeの権限設定(パーミッション)完全ガイド
セキュリティと利便性を両立する権限管理の全知識 ・ 約18分
Claude Codeのモデル切り替え活用術 ― Opus・Sonnet・Haikuの使い分け
タスクに応じた最適なモデル選択でコストと品質を両立する方法 ・ 約15分
Claude Codeのセッション管理術 ― 効率的な作業の進め方
セッションの開始・継続・再開を使いこなして、長期プロジェクトを効率的に進める ・ 約12分
Claude Codeのコマンドラインオプション完全リファレンス
全CLIオプションを網羅。起動時に使える引数を徹底解説 ・ 約20分
Claude Codeのプロジェクト設定(.claude/)完全ガイド
.claudeディレクトリとCLAUDE.mdを使いこなしてチーム開発を効率化 ・ 約15分
Claude Codeの出力フォーマットとパイプ活用術
--printモードとパイプを使った自動化・スクリプト連携の実践テクニック ・ 約15分
Claude Codeのキーボードショートカットと操作効率化
知っておくべきショートカットキーと入力テクニックで作業速度を2倍に ・ 約12分
Claude Codeのアップデートとバージョン管理
最新版への更新方法からダウングレード、トラブル対処まで ・ 約10分
Claude Codeの/doctorコマンドとトラブル診断
問題発生時の診断フローとよくあるエラーの解決方法 ・ 約12分
CLAUDE.mdの書き方完全ガイド ― プロジェクト指示書のベストプラクティス
プロジェクトの文脈をAIに正確に伝える設定ファイルの書き方 ・ 約20分
Claude Codeのメモリ機能 ― 会話をまたいだ記憶の活用法
プロジェクト固有の知識を永続化して効率を最大化する ・ 約18分
.claude/settings.jsonの設定項目一覧と活用法
Claude Codeの動作を細かく制御する設定ファイルの全貌 ・ 約15分
プロジェクト別CLAUDE.mdテンプレート集 ― コピペで使える10パターン
React・Next.js・Python・PHP・WordPress等、主要技術スタック別テンプレート ・ 約25分
チーム開発でのCLAUDE.md運用術
チーム全員がAIを最大限活用するための共有設定と運用ルール ・ 約20分
Claude CodeでGitを使いこなす ― 基本操作編
自然な日本語でGitを操作する方法を基本から解説 ・ 約20分
Claude Codeでコミットメッセージを自動生成する
変更内容を分析して最適なコミットメッセージを提案してくれるAI活用術 ・ 約18分
Claude CodeでPR(プルリクエスト)を作成・レビューする
AI支援によるPR作成からコードレビューまでの実践的ワークフロー ・ 約20分
Claude Codeでブランチ戦略を実践する
Git Flow・GitHub Flow・トランクベースを理解し、AIで効率的にブランチを管理 ・ 約20分
Claude Codeでコンフリクト解決をAIに任せる
マージの衝突が起きても慌てない。AIによるコンフリクト解決の実践ガイド ・ 約18分
Claude Codeでgit logを分析して変更履歴を理解する
コミット履歴からバグの原因特定やプロジェクトの変遷を把握する ・ 約22分
Claude Codeでリリースノートを自動生成する
コミット履歴からユーザー向け・開発者向けリリースノートを作成する ・ 約20分
Claude Codeのコンテキスト節約術 ― トークンを無駄にしない10の方法
コンテキストウィンドウを理解し、トークン消費を最適化するテクニック集 ・ 約18分
/compactコマンド徹底解説 ― 会話を圧縮して作業を続ける
/compactの仕組み・使いどころ・カスタム指示を完全網羅 ・ 約15分
大規模プロジェクトでのClaude Code活用戦略
大規模コードベースでの効率的なAI活用パターンとベストプラクティス ・ 約20分
.gitignoreとClaude Code ― 読み込みファイルの最適制御
ファイル探索の仕組みを理解し、ノイズを減らして精度を上げる ・ 約14分
効率的なタスク分割術 ― 1セッションの最適な使い方
タスク境界の見極めとセッション計画で生産性を最大化 ・ 約16分
Claude CodeのSkills機能入門 ― カスタムコマンドで作業を効率化
組み込みスキルからカスタムワークフローまで完全ガイド ・ 約15分
カスタムスラッシュコマンドの作り方 ― 自分だけのワークフローを構築
.claude/commands/ディレクトリで独自コマンドを定義する方法 ・ 約16分
MCPサーバーでClaude Codeを拡張する ― 外部ツール連携ガイド
Model Context Protocolで無限の拡張性を手に入れる ・ 約18分
Claude CodeとVS Code・JetBrainsの連携活用法
ターミナルAIとIDEを組み合わせた最強の開発環境構築 ・ 約15分
Claude Codeでウェブサイトを0から作る実践ガイド
プロジェクト作成からデプロイまでの完全チュートリアル ・ 約20分
Claude Codeでテストコードを書かせるテクニック
単体テストからE2Eテストまで、AIによるテスト自動生成 ・ 約22分
Claude Codeでリファクタリングを効率化する
安全なコード改善をAIと一緒に進める方法 ・ 約22分
Claude Codeでドキュメントを自動生成する
README・API文書・コードコメントを効率的に作成 ・ 約20分
Claude Codeでバグを素早く見つけて修正するテクニック
エラー解析からホットフィックスまでのデバッグワークフロー ・ 約20分
Claude CodeでREST APIを設計・実装する
要件定義からテストまでAPI開発の全工程をAIと進める ・ 約25分
Claude Codeでデータベース設計を相談・実装する
ER図からマイグレーションまでDB設計をAIに相談 ・ 約22分
Claude Codeで既存プロジェクトを分析・理解する
新しいコードベースのオンボーディングをAIで加速 ・ 約22分

Claude Code入門のレッスンも読む

読んだら、次はクイズで確認!

トレーニングで学んだ知識を定着させましょう。

Claude Code入門のトレーニングへ