ガイド

Claude Code Hooksとは?使い方・設定・自動化の仕組みを完全解説【2026年最新】

室谷東吾
監修者室谷東吾(@0x__tom

株式会社MYUUU 代表取締役 / 日本最大級AIコミュニティ「.AI」創設者(累計2,000名超)/ セプテーニ・ホールディングス(電通グループ)と資本業務提携 / 著書「お金を使わず、AIを働かせる『Dify』活用」(ぱる出版、3刷)/ Xフォロワー約2万人

テキトー教師
監修者テキトー教師(@tekitoo_T_cher

.AI 認定講師 / 教育×AIの専門家 / 累計300名以上にAI活用を指導 / 「テキトーに学ぶ」がモットーの実践派講師 / Xアカウント

Claude Code Hooksとは?使い方・設定・自動化の仕組みを完全解説【2026年最新】

Claude Code Hooksとは?自動化の仕組みと使い方を完全解説【2026年最新】

室谷室谷
今回はClaude Code Hooksの話をしましょう。これ、.AI(ドットエーアイ)コミュニティでも「知らなかった」という人がめちゃくちゃ多い機能で・・・使いこなすと、Claude Codeの体験が根本的に変わるんですよね。
テキトー教師テキトー教師
ですよね。講座でClaude Codeを教えていて気づくんですが、コミュニティのメンバーさんの大半がHooksの存在自体をスルーしているんですよ。

「そんな機能あったんですか」って反応が鉄板で(笑)。
室谷室谷
claude code hooksって何をするものかというと、Claude Codeのライフサイクルの特定のタイミングでシェルコマンドを自動実行する仕組みです。「ファイルを編集したら自動でlintを走らせる」「作業が完了したらSlackに通知する」「危険なコマンドをブロックする」、こういったことが設定ファイルを書くだけで実現できます。
テキトー教師テキトー教師
重要なのは「LLMが選択するのに依存しない」という点ですよね。Claude Codeに「編集後にPrettierを走らせてね」と指示するのと、Hooksで設定するのは全然違う話で。

指示は忘れられることがある、Hooksは必ず実行される。
室谷室谷
そこが本質なんですよ。MYUUUのチームでも「Claude Codeがたまにlintをさぼる」問題があったんですが、PostToolUseフックで自動フォーマットを設定したら完全に解決しました。

「AIに頼む」から「仕組みで保証する」への転換です。
テキトー教師テキトー教師
講座の中でいつも言うのが「AIは確率的、フックは決定論的」という話で。品質を担保したいものはフックで固める、それが正しいアーキテクチャの考え方だと思いますよ。
室谷室谷
この記事では、Claude Code Hooksについて一通り押さえていきます。hooksとは何か、使い方・設定方法、おすすめの活用例、通知設定、Slack・lint連携まで。

前回はCLIコマンドの話をしましたが、今回はもう一歩踏み込んでHooksで「Claude Codeが自律的に動く仕組み」を作る話です。

Claude Code Hooksとは?基本概念と仕組み

Claude Code Hooksガイドの公式ドキュメントページ(公式サイトより)

室谷室谷
まず「claude code hooksとは」という基本から整理しましょう。公式ドキュメントには「Claude Codeのライフサイクル内の特定のポイントで自動的に実行されるユーザー定義のシェルコマンド、HTTPエンドポイント、またはLLMプロンプト」と定義されています。
テキトー教師テキトー教師
フックハンドラーの種類が3つあるというのが、意外と見落とされやすいポイントで。シェルコマンド(type: "command")、HTTPエンドポイント(type: "http")、プロンプトベース(type: "prompt")の3つですね。
室谷室谷
大半のユースケースはシェルコマンドで十分なんですが、HTTPフックを使うとSlack Webhookに直接POSTできたり、外部サービスと連携できたりします。プロンプトベースのフックはClaude自身が条件を評価するので、「判断が必要な自動化」に使えますね。
テキトー教師テキトー教師
フックの仕組みを整理すると、こういう流れです。
  1. Claude Codeの特定のイベントが発火する(例: ファイルを編集した後)
  2. 設定したマッチャーが一致するかチェックする
  3. 一致した場合、フックハンドラーが実行される
  4. ハンドラーはJSON入力をstdinで受け取り、結果をstdoutで返す
室谷室谷
つまりシェルスクリプトが書けさえすれば、何でも自動化できるんですよね。Pythonスクリプトを呼んでもいいし、jqでJSONを解析してもいい。
テキトー教師テキトー教師
ここが柔軟な点で。実はこのフックの仕組みは、エージェントの「ライフサイクル管理」と同じ考え方なんですよ。

前のステップの出力を次のステップの入力にする、という構造。
室谷室谷
Difyのワークフローに近いですよね・・・。イベント→マッチャー→ハンドラーという3層構造は、ノード→条件分岐→アクションと発想が同じです。

フックが定義できる場所(スコープ)

テキトー教師テキトー教師
もう1つ最初に押さえておきたいのが、フックを「どこに書くか」によってスコープが変わるという点です。
室谷室谷
これ、コミュニティでも「プロジェクトに入れるの?グローバルに入れるの?」ってよく聞かれますよね。
テキトー教師テキトー教師
まとめるとこうなります。
設定ファイルの場所スコープチームで共有できるか
~/.claude/settings.json全プロジェクト共通いいえ(マシンローカル)
.claude/settings.json単一プロジェクトはい(gitにコミット可)
.claude/settings.local.json単一プロジェクトいいえ(gitignored)
管理ポリシー設定組織全体はい(管理者が制御)
室谷室谷
MYUUUでの使い分けは、「全プロジェクトで必ず使いたい通知系のフック」はグローバルに、「このプロジェクト固有のlintルール」はプロジェクトの.claude/settings.jsonに書くようにしてます。
テキトー教師テキトー教師
チームで開発する場合、.claude/settings.jsonをgitにコミットしておくと、メンバー全員が同じフック設定で動くようになりますよね。これは地味に大きいですよ。

新しいメンバーが入っても「フックの設定してください」って言わなくていい。

フックイベントの種類と一覧

Claude Code Hooksリファレンスのフックイベント一覧テーブル(公式サイトより)

室谷室谷
Hooksには発火するタイミング(イベント)がたくさんあります。公式ドキュメントを確認すると、2026年時点でこれだけのイベントが定義されています。
テキトー教師テキトー教師
claude code hooks 一覧をまとめると、こうなります。
イベント名発火タイミング
SessionStartセッションが開始または再開されたとき
SessionEndセッションが終了したとき
UserPromptSubmitプロンプトを送信したとき(Claude処理前)
PreToolUseツール呼び出し実行前(ブロック可能)
PostToolUseツール呼び出し成功後
PostToolUseFailureツール呼び出し失敗後
PermissionRequest権限ダイアログが表示されたとき
PermissionDeniedツール呼び出しが拒否されたとき
NotificationClaude Codeが通知を送るとき
StopClaudeが応答を終了したとき
StopFailureAPIエラーでターンが終了したとき
SubagentStartサブエージェントが起動したとき
SubagentStopサブエージェントが終了したとき
TaskCreatedタスクが作成されたとき
TaskCompletedタスクが完了したとき
TeammateIdleエージェントチームのメンバーがアイドル状態になったとき
InstructionsLoadedCLAUDE.mdやルールファイルが読み込まれたとき
ConfigChange設定ファイルが変更されたとき
CwdChanged作業ディレクトリが変更されたとき
FileChanged監視中のファイルが変更されたとき
PreCompactコンテキスト圧縮前
PostCompactコンテキスト圧縮後
WorktreeCreateワークツリーが作成されたとき
WorktreeRemoveワークツリーが削除されたとき
ElicitationMCPサーバーがユーザー入力を要求したとき
ElicitationResultユーザーがElicitationに応答した後
室谷室谷
多いですね・・・。最初からこれを全部使う必要はなくて、最初はPostToolUse(編集後の自動フォーマット)とNotification(通知)の2つだけで十分です。
テキトー教師テキトー教師
僕も講座では最初に「まずNotificationを設定してみましょう」と言ってますね。一番効果が実感しやすいので。

ターミナルを眺め続けなくていいだけで、体験が全然変わりますから。

よく使うイベントTOP3

室谷室谷
実際のところ、使用頻度が高いイベントは3つに絞られます。
テキトー教師テキトー教師
PostToolUseNotificationPreToolUseの3つですよね。
室谷室谷
PostToolUseはファイル編集後の自動lint・フォーマット、NotificationはClaude Codeが入力待ちになったときのデスクトップ通知・Slack通知、PreToolUseは危険なコマンドのブロック。この3つをマスターすればHooksの実用的な使い方はほぼカバーできます。
テキトー教師テキトー教師
Stopイベントも地味に使えて、「Claudeが応答を終えたらSlackに作業完了を通知する」という用途でよく使われますね。マルチエージェントを回しているときに、どのエージェントが終わったかをSlackで確認できるようになって。

Claude Code Hooksの設定方法と使い方

Claude Code Hooksライフサイクル:SessionStart→PreToolUse→ツール実行→PostToolUse→Stopの流れと各イベントのフックハンドラー(.AI TIMES編集部作成)

室谷室谷
じゃあ実際のclaude code hooksの設定方法を見ていきましょう。設定ファイルはJSON形式で、構造は3層になっています。
テキトー教師テキトー教師
「どのイベントに対応するか」「どんな条件(マッチャー)で発火させるか」「何を実行するか(ハンドラー)」の3階層ですよね。
室谷室谷
基本的な構造はこうなっています。
{
  "hooks": {
    "イベント名": [
      {
        "matcher": "フィルタ条件(正規表現)",
        "hooks": [
          {
            "type": "command",
            "command": "実行するシェルコマンド"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
matcherのフィールドが初心者にはわかりにくいんですが、イベントによってマッチ対象が違います。まとめると、こうなります。
イベントmatcherがフィルタリングする対象
PreToolUse / PostToolUseツール名BashEdit|Write
SessionStartセッション開始方法startupresumecompact
Notification通知タイプpermission_promptidle_prompt
FileChangedファイル名(ベース名).envrc.env
SubagentStart / SubagentStopエージェントタイプBashExplore
室谷室谷
matcherを省略するか"*"にすると全部のケースで発火します。まず動かしてみたいときは"matcher": ""でOKです。
テキトー教師テキトー教師
ifフィールドというのもあって、マッチャーよりも細かい条件でフィルタリングできます。例えば"Bash(rm *)と書くと、Bashツールのコマンドがrmで始まる場合だけフックが実行されます。
室谷室谷
これが優秀で、無駄なフック実行を減らせるんですよね。「全てのBashコマンドに対してスクリプトを起動」じゃなくて「rmで始まるコマンドのときだけ」にできるので、パフォーマンスへの影響も最小限です。

/hooksメニューでフックを確認する

テキトー教師テキトー教師
設定したフックを確認するには、Claude Code上で/hooksと入力するだけです。現在設定されている全フックの一覧が表示されます。
室谷室谷
ここ、コミュニティのメンバーさんに教えると「こんなメニューがあったのか!」って毎回言われるんですよね。設定ファイルを直接開かなくても、どのイベントにフックが設定されているかが一目でわかります。
テキトー教師テキトー教師
ただし/hooksメニューは「読み取り専用」なので、フックの追加・変更・削除は設定JSONを直接編集するか、Claude Codeに「このフックを設定してください」と頼む必要があります。Claude自身にフックを書かせるのも全然アリで、「PostToolUseでPrettierを走らせるフックを.claude/settings.jsonに追加して」と言えばやってくれます。

最初のフックを設定する:デスクトップ通知

室谷室谷
最初のフックとして一番おすすめなのが、claude code hooks 通知の設定です。Claude Codeが入力を待っているときにデスクトップ通知を出す、これだけで作業効率が全然違います。
テキトー教師テキトー教師
ターミナルを眺め続けなくていいですからね。Claude Codeに長めの作業を頼んで、別のことをしていてもちゃんと気づける。
室谷室谷
設定はこれだけです。~/.claude/settings.jsonに追加します。
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Codeがあなたの入力を待っています\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
これはmacOS用ですね。LinuxとWindowsの場合はコマンドが変わります。
室谷室谷
Linuxはnotify-send "Claude Code" "入力を待っています"、Windows(PowerShell)は少し長くなりますが、公式ドキュメントに各OS向けのコードが載っています。詳しくはの「Claude が入力を必要とするときに通知を受け取る」セクションをご確認ください。

claude code hooks 通知をSlackに飛ばす

テキトー教師テキトー教師
さらに実用的なのが、claude code hooks slackの連携です。作業完了をSlackに通知する設定をしておくと、チームメンバーへの共有もできますし、スマホでも気づけます。
室谷室谷
MYUUUのチームではこれをかなり活用していて・・・エージェントが長時間タスクを走らせているとき、「終わったらSlackに飛んでくる」設定にしておくと、他の作業に集中できるんですよ。
テキトー教師テキトー教師
Slack Webhookを使った設定例はこんな感じになります。
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "curl -s -X POST -H 'Content-type: application/json' --data '{\"text\":\"Claude Codeが作業を完了しました\"}' $SLACK_WEBHOOK_URL"
          }
        ]
      }
    ]
  }
}
室谷室谷
Stopイベントを使っているのがポイントで。これはClaude Codeが応答を終えたタイミングで発火するので、「作業完了通知」として使えます。
テキトー教師テキトー教師
環境変数SLACK_WEBHOOK_URLをあらかじめシェルに設定しておくか、直接URLを書く形でもOKです。ただしURLは機密情報なので、できれば環境変数経由がいいですね。

macOS afplayで音を鳴らす

室谷室谷
これもコミュニティでよく話題になるんですが、claude code hooks afplayでmacOSのシステムサウンドを鳴らす設定も人気です。
テキトー教師テキトー教師
「目視で気づく」前に「耳で気づく」というアプローチですよね(笑)。設定はすごくシンプルです。
室谷室谷
Notificationイベントと組み合わせるとこんな感じです。
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "afplay /System/Library/Sounds/Glass.aiff"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
/System/Library/Sounds/にはGlass、Ping、Pop、Purr、Sosumi、Submarineなどが入っています。claude code hooks 通知 音の設定としては、これが一番手軽ですね。

claude code hooks soundという用途で、macユーザーに特に人気の設定です。

コードの品質を自動保証する:lint・フォーマット連携

室谷室谷
ここからが個人的に一番使っていて効果を実感している領域で。claude code hooks lintを使ったコード品質の自動保証の話です。
テキトー教師テキトー教師
これこそ「決定論的な制御」が光るユースケースですよね。Claude Codeに「lintを走らせて」と毎回言わなくても、編集のたびに必ず走る。
室谷室谷
設定はこうなります。PostToolUseイベントにEdit|Writeマッチャーを使います。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
jq -r '.tool_input.file_path'でフックが受け取ったJSON入力からファイルパスを取り出して、Prettierに渡しています。jqが必要なので、brew install jqで入れておく必要がありますね。
室谷室谷
EditとWriteの両方にマッチするように|でOR条件を書けるのが便利です。「ファイル作成時も編集時も」両方カバーできます。

ESLint・Biome・Ruffとの連携

テキトー教師テキトー教師
claude code hooks eslintやclaude code hooks biome、claude code hooks ruffといった、各lintツールとの連携もよく使われます。
室谷室谷
プロジェクトによって使うツールが違うので、自分の環境に合わせて差し替えるだけですね。ESLintの場合はこうなります。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx eslint --fix"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
Pythonプロジェクトでclaude code hooks ruffを使う場合は、コマンドの部分をjq -r '.tool_input.file_path' | xargs ruff check --fixに差し替えるだけです。
室谷室谷
Biomeはさらにシンプルで、biome check --applyに渡すだけ。最近Biomeを採用しているプロジェクトが増えているので、claude code hooks biomeへの需要も伸びているんですよね・・・。
テキトー教師テキトー教師
claude code hooks prettierを使うときに1つ気をつけてほしいのが、Prettierが対応していないファイルタイプにも適用しようとするとエラーになる点です。--ignore-unknownオプションを付けると、対応していないファイルはスキップしてくれます。
jq -r '.tool_input.file_path' | xargs npx prettier --write --ignore-unknown
室谷室谷
.prettierignoreをちゃんと設定しておくことも大事ですね。node_modules.nextディレクトリを誤ってフォーマットしようとするとエラーになります。

危険なコマンドをブロックする:PreToolUseの活用

室谷室谷
次はclaude code hooks 設定の中でもセキュリティ寄りの話で、PreToolUseを使ったコマンドのブロックです。
テキトー教師テキトー教師
公式ドキュメントに「保護されたファイルへの編集をブロックするフック」の例が載っていて、これが非常に実用的なんですよ。
室谷室谷
.envpackage-lock.jsonなど機密・重要ファイルをClaude Codeが変更しようとしたら、フックがそれを検知してブロックする、という仕組みです。まずフックスクリプトを作ります。
#!/bin/bash
# .claude/hooks/protect-files.sh

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")

for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if [[ "$FILE_PATH" == *"$pattern"* ]]; then
    echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2
    exit 2
  fi
done

exit 0
テキトー教師テキトー教師
exit 2がポイントで。フックの終了コードによってClaude Codeの動作が変わります。
室谷室谷
まとめると、こうなります。
終了コード動作
0成功(処理を続行)
1エラー(メッセージをClaudeに表示するが続行)
2ブロック(ツール呼び出しをキャンセル、理由をClaudeに表示)
テキトー教師テキトー教師
exit 2でブロックすると、Claude Codeは「この操作はブロックされました」と認識して、stderrに出力したメッセージを理由として受け取ります。Claudeはそれを踏まえて別のアプローチを取ることができます。
室谷室谷
フックスクリプトを登録するには、実行権限を付けて(chmod +x)、設定ファイルに追加します。
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
$CLAUDE_PROJECT_DIRはClaude Codeが自動的に設定する環境変数で、プロジェクトのルートディレクトリを指します。これを使えばパスのハードコーディングを避けられます。

カスタムフック(Custom Hooks)の作り方

室谷室谷
ここまでは公式ドキュメントにあるサンプルの話でしたが、claude code custom hooksとして自分でゼロから作る場合の考え方も整理しておきましょう。
テキトー教師テキトー教師
カスタムフックを作るときに一番悩むのが「どのイベントを使うか」ですよね。
室谷室谷
判断基準をまとめると、こうなります。
  • 「〇〇したら△△する」→ PostToolUse(後処理)
  • 「〇〇をブロックしたい」→ PreToolUse(前処理)
  • 「入力待ちのときに通知したい」→ Notification
  • 「作業が全部終わったら通知したい」→ Stop
  • 「セッション開始時に何かしたい」→ SessionStart
  • 「ファイルの変更を監視したい」→ FileChanged
テキトー教師テキトー教師
フックハンドラーはJSON入力をstdinで受け取ります。jqを使ってそのJSONから必要な情報を取り出すのが基本パターンです。
室谷室谷
claude code hooks jsonの形式は、イベントによって異なりますが、共通フィールドとしてsession_idtool_nametool_inputなどが含まれます。例えばPostToolUseのJSON入力はこんな感じです。
{
  "session_id": "abc123",
  "tool_name": "Edit",
  "tool_input": {
    "file_path": "/path/to/file.ts",
    "old_string": "...",
    "new_string": "..."
  },
  "tool_response": {
    "success": true
  }
}
テキトー教師テキトー教師
PythonでJSONを処理したい場合も全然OKです。type: "command"でPythonスクリプトを呼べます。

claude code hooks pythonという形で使えて、複雑なロジックが必要なときはPythonの方が書きやすいですよね。
室谷室谷
例えば「編集されたファイルの拡張子によって実行するlintを切り替える」という処理はシェルスクリプトよりPythonの方が書きやすいです。
#!/usr/bin/env python3
import json, sys, subprocess

data = json.load(sys.stdin)
file_path = data.get('tool_input', {}).get('file_path', '')

if file_path.endswith('.py'):
    subprocess.run(['ruff', 'check', '--fix', file_path])
elif file_path.endswith(('.ts', '.tsx', '.js', '.jsx')):
    subprocess.run(['npx', 'eslint', '--fix', file_path])
elif file_path.endswith('.go'):
    subprocess.run(['gofmt', '-w', file_path])
テキトー教師テキトー教師
これは実践的ですね。拡張子でlintを振り分けるのはモノレポ環境では特に便利だと思いますよ。

マルチエージェント環境でのHooks活用

室谷室谷
Hooksが本当に光るのは、マルチエージェント・サブエージェントを使うときなんですよね。claude code hooks multi agent observabilityというアプローチが海外でも注目されていて、エージェントの可観測性にHooksを使うのが広まっています。
テキトー教師テキトー教師
複数のサブエージェントが並列で動いているとき、「どのエージェントが何をしているか」を把握するのは難しくなりますよね。
室谷室谷
SubagentStartとSubagentStopイベントを使えば、エージェントの起動・終了のタイミングでログを記録したり、通知を飛ばしたりできます。
{
  "hooks": {
    "SubagentStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{event: \"subagent_start\", timestamp: now | todate, type: .agent_type}' >> ~/claude-agent.log"
          }
        ]
      }
    ],
    "SubagentStop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{event: \"subagent_stop\", timestamp: now | todate, type: .agent_type}' >> ~/claude-agent.log"
          }
        ]
      }
    ]
  }
}
テキトー教師テキトー教師
ログファイルを見れば、どのエージェントがいつ起動して何分で終わったかが全部追えますね。これがclaude code hooks multi agent observabilityの実装例として海外でよく紹介されているパターンです。
室谷室谷
TaskCreatedとTaskCompletedイベントも組み合わせると、タスクの粒度での追跡もできます。エージェントチームを本番運用するなら、このレベルの可観測性は必要になってくると思いますよ。
テキトー教師テキトー教師
「disler claude code hooks mastery」や「disler claude code hooks multi agent observability」というコンテンツが海外で参考にされています。エージェントのオブザーバビリティをHooksで実現するアプローチをまとめていて、上級者向けの内容ですがとても実践的です。

非同期フックと高度な設定

室谷室谷
ここからはやや上級者向けの話で、claude code hooks asyncの設定方法です。
テキトー教師テキトー教師
通常のフックは「同期実行」なんですよね。フックが終わるまでClaude Codeが次の処理に進まない。
室谷室谷
例えば「編集後に重いテストスイートを走らせる」というフックを同期で設定すると、テストが終わるまでClaude Codeが止まってしまいます。それを避けるのが非同期フックです。
テキトー教師テキトー教師
設定はシンプルで、"background": trueを追加するだけです。
{
  "hooks": {
    "FileChanged": [
      {
        "matcher": ".ts|.tsx",
        "hooks": [
          {
            "type": "command",
            "background": true,
            "command": "npm test"
          }
        ]
      }
    ]
  }
}
室谷室谷
background: trueにすると、フックはバックグラウンドで実行されてClaude Codeの処理は続きます。テスト結果はフックが終わったタイミングでClaude Codeに通知されます。
テキトー教師テキトー教師
claude code hooks not workingというKWがサジェストに出てくるくらい、フックが動かないトラブルは多いんですよ(笑)。
室谷室谷
デバッグするときは/hooksメニューで設定が正しく認識されているか確認するのが最初のステップですね。認識されていない場合はJSONの構文エラーか、ファイルの場所が間違っている可能性が高いです。
テキトー教師テキトー教師
よくあるミスをまとめると、こうなります。
  • JSONの構文エラー(カンマの過不足、括弧の閉じ忘れ等)
  • スクリプトファイルに実行権限がない(chmod +x忘れ)
  • jqがインストールされていない(brew install jqが必要)
  • $CLAUDE_PROJECT_DIRが解決できていない環境で実行している
室谷室谷
jqはHooksの実装でほんとうに頻繁に必要になるので、brew install jqapt-get install jqで先に入れておくのが大事ですね。

スキル・プラグインとの組み合わせ

室谷室谷
claude code hooks skillsという組み合わせも面白いんですよね。スキルファイルのフロントマターにフックを定義できます。
テキトー教師テキトー教師
スキルがアクティブなときだけフックが発火する、という動作になります。「このスキルを有効にしたら、このフックも自動的に設定される」という仕組みですね。
室谷室谷
これが便利なのは、「特定のプロジェクト用スキル」と「そのプロジェクト固有のlintフック」をセットで配布できること。チームメンバーはスキルを有効にするだけで、フックも一緒に設定されます。
テキトー教師テキトー教師
claude code hooks pluginとの組み合わせも同様で、プラグインのhooks/hooks.jsonにフックを定義することで、プラグインが有効なすべての環境にフックが適用されます。
室谷室谷
エンタープライズ環境では管理者がallowManagedHooksOnlyを設定することで、ユーザーが自由にフックを追加できないようにすることもできます。セキュリティ上の観点から、組織全体でHooksの内容を制御したいというケースですね。

よくあるユースケース:Best Practices集

室谷室谷
ここで、claude code hooks best practicesとして、実際によく使われるユースケースを整理しておきましょう。
テキトー教師テキトー教師
「claude code hooksのおすすめ設定を教えて」というのは講座でよく聞かれる質問なので、まとめます。
室谷室谷
用途別に整理するとこんな感じになります。
ユースケースイベントコマンド例
デスクトップ通知(Mac)Notificationosascript -e 'display notification...'
Slack通知(作業完了)Stopcurl -X POST $SLACK_WEBHOOK_URL...
音で通知(Mac)Notificationafplay /System/Library/Sounds/Glass.aiff
自動PrettierPostToolUse (Edit|Write)jq ... | xargs npx prettier --write
自動ESLintPostToolUse (Edit|Write)jq ... | xargs npx eslint --fix
自動Ruff(Python)PostToolUse (Edit|Write)jq ... | xargs ruff check --fix
ファイル保護PreToolUse (Edit|Write)スクリプトで.envなどをブロック(exit 2)
圧縮後コンテキスト再注入SessionStart (compact)echo 'Reminder: ...'
エージェントログSubagentStart / SubagentStopjq -c '...' >> ~/agent.log
環境リロードCwdChangeddirenv export bash >> "$CLAUDE_ENV_FILE"
テキトー教師テキトー教師
この表を見ると「自分はどれが一番欲しいか」がすぐわかりますよね。初心者なら通知系から、開発者ならlint自動化から始めるのがおすすめです。
室谷室谷
claude code hooks examplesとして公式ドキュメント()に各ユースケースの完全なコードが載っているので、そのまま使えます。コピペで動くレベルで書かれているので、ぜひ参照してください。

Windows環境でのHooks

テキトー教師テキトー教師
claude code hooks windowsについても触れておきましょう。WindowsユーザーはPowerShellで動くコマンドを使う必要があります。
室谷室谷
例えばデスクトップ通知のコマンドがWindowsの場合は、PowerShellのトーストAPIを使う形になります。公式ドキュメントに「Windows PowerShellツール」のセクションがあって、そこに詳しく書いてあります。
テキトー教師テキトー教師
WSL2環境で使っている場合はnotify-sendが使えます。claude code hooks 通知 windowsやclaude code hooks 通知 macの具体例については、公式のを参照してください。

プロンプトベースフックとエージェントベースフック

室谷室谷
ここまではシェルコマンドのフックでしたが、claude code hooks promptという形でLLMが条件を評価するフックも面白いですよ。
テキトー教師テキトー教師
「機密情報が含まれていたらブロックする」みたいな判断をClaude自身にさせる、というイメージですね。ルールベースでは表現しにくい「文脈を読んだ判断」ができます。
室谷室谷
プロンプトベースのフックを使うと、自然言語で条件を書けます。ただし、プロンプトフックはClaudeモデルが評価するので処理コストがかかります。
テキトー教師テキトー教師
決定論的に判断できるものはシェルコマンド、判断が難しいものだけプロンプトベースにする、という使い分けがいいですよね。「機密情報の検出」や「コード品質の主観的評価」などはプロンプトベースが向いています。
室谷室谷
エージェントベースのフックはさらに発展した形で、フック自体がサブエージェントとして動きます。「ファイル変更後にサブエージェントがテストを実行して、失敗した箇所を修正する」みたいな高度な自動化が実現できます。
テキトー教師テキトー教師
ただこれは本当に高度なユースケースで、普通の使い方では最初は意識しなくてOKですね。まずはシェルコマンドのフックをマスターしてから、という順番で。

Claude Code HooksのFAQ

室谷室谷
よくある疑問をいくつか拾っておきましょう。まず「claude code hooks 動かない(not working)」は一番多い質問ですよね。
テキトー教師テキトー教師
まず/hooksメニューを開いて、フックが認識されているか確認するのが第一歩です。認識されていない場合の原因は、JSONの構文エラーがほとんどで。

python3 -m json.tool ~/.claude/settings.jsonでJSONの構文チェックができます。
室谷室谷
フックは認識されているのに動かないという場合は、スクリプトに実行権限がない(chmod +xが必要)か、コマンドのパスが間違っているケースが多いです。
テキトー教師テキトー教師
「claude code hooks reference(ドキュメント)はどこ?」という質問もよく来ます。がリファレンス、がクイックスタートガイドです。
室谷室谷
「claude code hooks sessionstartって何?」という質問もあります。SessionStartはセッション開始時に発火するイベントで、起動時に毎回実行したいコマンド(環境変数の読み込みや、重要コンテキストの注入など)に使います。

コンテキスト圧縮後にだけ発火させたい場合は"matcher": "compact"を指定します。
テキトー教師テキトー教師
「claude code hooks posttoolusekって何?(PostToolUse)」というのは、ツール呼び出しが成功した後に実行されるイベントです。lintや自動フォーマットに使うのが定番の使い方ですね。
室谷室谷
「claude code hooks stopの使い方は?」もよく聞かれます。Stopイベントは「Claudeが応答を終了したとき」に発火します。

長い作業が終わったことを通知するのに使うのが一番シンプルなユースケースです。
テキトー教師テキトー教師
「claude code hooks anthropicって何?」というのは、つまりclaude code hooksそのものがAnthropicが公式に提供している機能ですよ、ということですね。サードパーティのプラグインではなく、Claude Code本体の機能として提供されています。

まとめ:Hooksでどう使い方が変わるか

室谷室谷
Claude Code Hooksについてまとめると、一言で言えば「Claude Codeの動作に決定論的なルールを追加する機能」です。LLMに指示するのではなく、必ず実行される仕組みを設定する。
テキトー教師テキトー教師
claude code hooks 使い方として最初に取り組むべきステップを整理すると、こうなります。
  1. ~/.claude/settings.jsonにNotificationフックを追加して通知を設定する
  2. プロジェクトの.claude/settings.jsonにPostToolUseフックでlintを自動化する
  3. PreToolUseで保護したいファイルや危険なコマンドをブロックする
  4. Stopイベントを使って作業完了をSlackに通知する
  5. サブエージェントを使う場合はSubagentStart/Stopでログを取る
室谷室谷
Hooksを使いこなすことで、Claude Codeが「対話型のAIアシスタント」から「ルールに基づいて自律的に動くシステム」に変わります。チームで使う場合は特に、品質のばらつきをHooksで防げるので、導入する価値は大きいと思います。
テキトー教師テキトー教師
公式のHooksガイド()には本記事で紹介したユースケースのコードが全部載っていて、コピペで使えます。最初はそこから始めるのがおすすめですよ。
室谷室谷
Hooksはまだ知っている人が少ない機能なので、今のうちに使い方をマスターしておくとアドバンテージになりますよ。ぜひ試してみてください。

出典

.AI TIMES一覧に戻る