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は必ず実行される。
指示は忘れられることがある、Hooksは必ず実行される。
室谷そこが本質なんですよ。MYUUUのチームでも「Claude Codeがたまにlintをさぼる」問題があったんですが、PostToolUseフックで自動フォーマットを設定したら完全に解決しました。
「AIに頼む」から「仕組みで保証する」への転換です。
「AIに頼む」から「仕組みで保証する」への転換です。
テキトー教師講座の中でいつも言うのが「AIは確率的、フックは決定論的」という話で。品質を担保したいものはフックで固める、それが正しいアーキテクチャの考え方だと思いますよ。
室谷この記事では、Claude Code Hooksについて一通り押さえていきます。hooksとは何か、使い方・設定方法、おすすめの活用例、通知設定、Slack・lint連携まで。
前回はCLIコマンドの話をしましたが、今回はもう一歩踏み込んでHooksで「Claude Codeが自律的に動く仕組み」を作る話です。
前回はCLIコマンドの話をしましたが、今回はもう一歩踏み込んでHooksで「Claude Codeが自律的に動く仕組み」を作る話です。
Claude Code Hooksとは?基本概念と仕組み

室谷まず「claude code hooksとは」という基本から整理しましょう。公式ドキュメントには「Claude Codeのライフサイクル内の特定のポイントで自動的に実行されるユーザー定義のシェルコマンド、HTTPエンドポイント、またはLLMプロンプト」と定義されています。
テキトー教師フックハンドラーの種類が3つあるというのが、意外と見落とされやすいポイントで。シェルコマンド(
type: "command")、HTTPエンドポイント(type: "http")、プロンプトベース(type: "prompt")の3つですね。
室谷大半のユースケースはシェルコマンドで十分なんですが、HTTPフックを使うとSlack Webhookに直接POSTできたり、外部サービスと連携できたりします。プロンプトベースのフックはClaude自身が条件を評価するので、「判断が必要な自動化」に使えますね。
テキトー教師フックの仕組みを整理すると、こういう流れです。
- Claude Codeの特定のイベントが発火する(例: ファイルを編集した後)
- 設定したマッチャーが一致するかチェックする
- 一致した場合、フックハンドラーが実行される
- ハンドラーは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にコミットしておくと、メンバー全員が同じフック設定で動くようになりますよね。これは地味に大きいですよ。新しいメンバーが入っても「フックの設定してください」って言わなくていい。
フックイベントの種類と一覧

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

室谷じゃあ実際のclaude code hooksの設定方法を見ていきましょう。設定ファイルはJSON形式で、構造は3層になっています。
テキトー教師「どのイベントに対応するか」「どんな条件(マッチャー)で発火させるか」「何を実行するか(ハンドラー)」の3階層ですよね。
室谷基本的な構造はこうなっています。
{
"hooks": {
"イベント名": [
{
"matcher": "フィルタ条件(正規表現)",
"hooks": [
{
"type": "command",
"command": "実行するシェルコマンド"
}
]
}
]
}
}
テキトー教師matcherのフィールドが初心者にはわかりにくいんですが、イベントによってマッチ対象が違います。まとめると、こうなります。| イベント | matcherがフィルタリングする対象 | 例 |
|---|---|---|
| PreToolUse / PostToolUse | ツール名 | Bash、Edit|Write |
| SessionStart | セッション開始方法 | startup、resume、compact |
| Notification | 通知タイプ | permission_prompt、idle_prompt |
| FileChanged | ファイル名(ベース名) | .envrc、.env |
| SubagentStart / SubagentStop | エージェントタイプ | Bash、Explore |
室谷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を使ったコマンドのブロックです。
テキトー教師公式ドキュメントに「保護されたファイルへの編集をブロックするフック」の例が載っていて、これが非常に実用的なんですよ。
室谷.envやpackage-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_id、tool_name、tool_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です。
claude code hooks pythonという形で使えて、複雑なロジックが必要なときはPythonの方が書きやすいですよね。
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 jqかapt-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) | Notification | osascript -e 'display notification...' |
| Slack通知(作業完了) | Stop | curl -X POST $SLACK_WEBHOOK_URL... |
| 音で通知(Mac) | Notification | afplay /System/Library/Sounds/Glass.aiff |
| 自動Prettier | PostToolUse (Edit|Write) | jq ... | xargs npx prettier --write |
| 自動ESLint | PostToolUse (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 / SubagentStop | jq -c '...' >> ~/agent.log |
| 環境リロード | CwdChanged | direnv 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 使い方として最初に取り組むべきステップを整理すると、こうなります。
~/.claude/settings.jsonにNotificationフックを追加して通知を設定する- プロジェクトの
.claude/settings.jsonにPostToolUseフックでlintを自動化する - PreToolUseで保護したいファイルや危険なコマンドをブロックする
- Stopイベントを使って作業完了をSlackに通知する
- サブエージェントを使う場合はSubagentStart/Stopでログを取る
室谷Hooksを使いこなすことで、Claude Codeが「対話型のAIアシスタント」から「ルールに基づいて自律的に動くシステム」に変わります。チームで使う場合は特に、品質のばらつきをHooksで防げるので、導入する価値は大きいと思います。
テキトー教師公式のHooksガイド()には本記事で紹介したユースケースのコードが全部載っていて、コピペで使えます。最初はそこから始めるのがおすすめですよ。
室谷Hooksはまだ知っている人が少ない機能なので、今のうちに使い方をマスターしておくとアドバンテージになりますよ。ぜひ試してみてください。
