AIエージェント入門

Claude Code Hooks通知設定|macOS・Win・Slack

Claude Code Hooks通知設定|macOS・Win・Slack

この記事の結論

Claude Code hooksの通知設定を解説。NotificationとStopの2イベントで、macOS・Windows・Slackへ完了通知を飛ばすsettings.jsonの書き方と、通知が来ない時の確認順まで。

「Claude Codeが止まっていることに気づけず、ターミナルを何度も覗きに行ってしまう。完了や入力待ちを通知で飛ばすには、どこに何を書けばいいのか?」——答えは、~/.claude/settings.jsonNotificationStop の2イベントを足すだけです。macOSなら osascript、Windowsなら powershell.exe、Slackなら Incoming Webhook を叩くシェルスクリプトを1本。設定は最短で6行です。

2026年9月時点の公式ドキュメントで確認できる範囲を整理すると、Claude Codeのhooksイベントは33種類あり、そのうち「人間を呼ぶ」目的で使うのは実質 NotificationStopStopFailure の3つだけです。しかも Notification は12種類の通知タイプをmatcherで撃ち分けられるため、「許可待ちだけ音を鳴らす」「完了だけSlackに流す」といった分離が設定ファイルだけで完結します。この記事では、hooksの全体像ではなく通知だけに絞り、公式ドキュメントに実在するイベント名・設定キー・コマンドのみを使って、OS別の書き方と動かないときの切り分け手順まで通します。hooks全体の仕組みから確認したい場合はClaude Code Hooks完全ガイド|PreToolUse・PostToolUseの実装例を先に読んでおくと理解が早くなります。

通知が要るのは「待たされている瞬間」と「終わった瞬間」の2つ

NotificationイベントとStopイベントの発火タイミングの違い(許可待ち・入力待ち・応答終了)
NotificationとStopは発火タイミングが違う。許可待ち・入力待ちはNotification、応答が終わった瞬間はStop

通知hooksを書く前に、どのイベントが何を意味するのかを揃えておきます。ここを取り違えると「鳴りっぱなし」か「鳴らない」のどちらかになります。

Notification は、公式ドキュメントの表現では「Claude Codeが通知を送るとき」に発火します。実態としては、許可プロンプトが出て一定時間あなたが反応しなかったとき、あるいは応答が終わってしばらく入力がないときです。つまり「Claudeがあなたを待っている」側のイベントです。

対して Stop は「Claudeが応答を終えたとき」に発火します。ここで重要なのは、公式ドキュメントが明記している次の制約です。

  • Stop フックはタスク完了時だけでなく、Claudeが応答を終えるたびに毎回発火する
  • ユーザーが割り込み(中断)したときには発火しない
  • APIエラーでターンが終わった場合は Stop ではなく StopFailure が発火する

したがって、「長い作業が終わったときだけ鳴らしたい」という期待をそのまま Stop に載せると、1往復ごとに鳴ります。会話のキャッチボールが多い使い方なら、Notificationidle_prompt(応答終了から約60秒、かつあなたが何も打っていない状態)のほうが体感に近くなります。

Notificationの通知タイプは12種類

Notification のmatcherは通知タイプを指定します。空文字(または省略)にすると全種類で発火します。公式ドキュメントに列挙されている値と発火条件は次のとおりです。

matcherの値 発火する場面
permission_prompt ツール使用またはサンドボックス下のネットワーク要求の承認が必要になり、プロンプトが約6秒待った状態
idle_prompt Claudeが応答を終えて約60秒経ち、あなたが何も入力していない状態
auth_success 認証が完了したとき
elicitation_dialog MCPサーバーが入力フォームを開き、約6秒入力がない状態
elicitation_url_dialog MCPサーバーがブラウザURLを開くよう求め、約6秒入力がない状態
elicitation_complete MCPサーバーがURLモードの入力完了を報告したとき
elicitation_response MCPの入力応答がサーバーへ返されたとき
agent_needs_input agent view表示中にバックグラウンドセッションが入力待ちになったとき(v2.1.198以降)
agent_completed agent view表示中にバックグラウンドセッションが完了または失敗したとき(v2.1.198以降)
quota_auto_resume_fired 利用上限で止まったタスクをClaude Codeが再開したとき(v2.1.234以降)
quota_auto_resume_stale マシンのスリープ中に上限がリセットされ、Enter待ちになったとき(v2.1.234以降)
quota_auto_resume_disabled 上限待ちを再開せずに終えたとき(v2.1.234以降)

バージョン条件が付いている値がある点に注意してください。agent_needs_inputagent_completed はv2.1.198以降、quota_auto_resume_* の3つはv2.1.234以降でのみ有効です。それより古いバージョンで指定しても、設定は読み込まれますが発火しません。バックグラウンドセッションを並走させる使い方をしている方は、この2つが撃ち分けの主役になります(並走の設計そのものはClaude Codeサブエージェントfork既定化|@セッション連携の実践を参照)。

設定を書く場所を先に決める|4か所と優先順位

hooks設定ファイルの置き場4か所と適用範囲(ユーザー設定・プロジェクト共有・プロジェクトローカル・管理設定)
通知hooksはユーザー設定に置くのが基本。プロジェクト共有に置くとチーム全員のマシンで鳴る

hooksは複数の場所に書けます。通知hooksに関しては、置き場を間違えると「他人のマシンで勝手に音が鳴る」「リポジトリにWebhook URLが混入する」といった事故に直結します。公式ドキュメントが示す置き場と適用範囲は次のとおりです。

置き場 適用範囲 共有 通知hooksでの適性
~/.claude/settings.json あなたの全プロジェクト されない(マシンローカル) ◎ 基本はここ
.claude/settings.json 単一プロジェクト される(コミット可能) △ チーム全員に鳴る
.claude/settings.local.json 単一プロジェクト されない(gitignore対象) ○ 案件別に鳴らし分けるとき
管理設定(managed settings) 組織全体 される(管理者制御) × 通知向きではない

優先順位は上から、管理設定 → claude --settings.claude/settings.local.json.claude/settings.json~/.claude/settings.json です。同じキーが複数にあるとき、上位の値が勝ちます。通知は「そのマシンの前に座っている人間」への合図なので、原則は ~/.claude/settings.json に置いてください。設定ファイル全般の構造や他キーとの関係はClaude Code設定ファイル完全ガイドにまとめてあります。

既に hooks キーがある場合の書き足し方

よくある壊し方が、既存の hooks オブジェクトを丸ごと上書きしてしまうパターンです。イベント名は単一の hooks オブジェクトの中のキーなので、兄弟として足します。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [{ "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" }]
      }
    ]
  }
}

書き終えたら /hooks を実行します。イベント一覧に設定件数が出るので、Notification の欄に数字が付いていれば読み込み成功です。/hooks は読み取り専用のブラウザなので、追加・変更・削除は設定JSONを直接編集するか、Claudeに頼んで書き換えてもらいます。

その前に:hooksを書かずに済むケースもある

先に伝えておくと、単に「音が鳴ればいい」だけなら、hooksを書かなくても済みます。Claude Codeは標準で、Ghostty・Kitty・iTerm2の3つのターミナルに対してのみデスクトップ通知を送ります。それ以外のターミナルを使っている場合は、次の1行でターミナルベルに切り替えられます。

{
  "preferredNotifChannel": "terminal_bell"
}

iTerm2を使っていて通知が出ない場合は、iTerm2側の転送設定が必要です。Settings → Profiles → Terminal を開き、「Notification Center Alerts」にチェックを入れ、「Filter Alerts」をクリックして「Send escape sequence-generated alerts」を有効にします。この経路はSSH越しでも手元のマシンまで届くので、リモート開発でも使えます。

逆に、Warp や VS Code の統合ターミナルのように標準のデスクトップ通知を受け取れない環境、あるいは「音を変えたい」「Slackに流したい」といった要求があるときに、初めてhooksの出番になります。公式ドキュメントは、hooksは組み込みの通知を置き換えるのではなく並走すると明記しています。二重に鳴って鬱陶しいと感じたら、preferredNotifChannel 側を落とす発想も持っておいてください。

macOSで鳴らす・出す|osascriptとafplayの2系統

macOSには通知センターに出す系統と、音だけ鳴らす系統の2つがあります。両方とも公式ドキュメントに例が載っています。

通知センターに出す

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

ここでmacOS特有の落とし穴が1つあります。osascript の通知は、内部的に標準アプリのScript Editor経由で発行されます。Script Editorに通知権限が付与されていないとコマンドは無言で失敗し、macOSは権限を求めるダイアログすら出しません。そのため「設定は正しいのに何も出ない」という状態になります。回避手順は公式ドキュメントに書かれているとおりです。

osascript -e 'display notification "test"'

この時点では何も表示されません。続いて システム設定 → 通知 を開き、一覧の中から Script Editor を探して「通知を許可」をオンにします。そのうえでもう一度同じコマンドを実行すると、テスト通知が表示されるようになります。

音だけ鳴らす

「画面の隅にバナーが出るのは邪魔だが、音では気づきたい」という場合は afplay でシステムサウンドを鳴らします。こちらも公式ドキュメントに掲載されている構成です。

{
  "hooks": {
    "Notification": [
      {
        "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]
      }
    ]
  }
}

/System/Library/Sounds/ にはGlass以外にも Ping.aiff、Submarine.aiff などが入っています。イベントごとに別の音を割り当てると、画面を見なくても状況が判別できます。次の構成は、許可待ちと完了で音を変える例です。

{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Ping.aiff" }]
      },
      {
        "matcher": "idle_prompt",
        "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Submarine.aiff" }]
      }
    ],
    "Stop": [
      {
        "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]
      }
    ]
  }
}

matcherは大文字小文字を区別します。Permission_Prompt のように書くと一致しません。また、同じイベントに複数のhooksが一致した場合、それらは並列に実行されます。音が重なる設計にしないよう、matcherは互いに排他になるように書いてください。

WindowsとLinuxで出す|標準のダイアログと、トーストにしたい場合

Windowsについて公式ドキュメントが提示しているのは、PowerShell経由でメッセージボックスを開く構成です。

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""
          }
        ]
      }
    ]
  }
}

公式ドキュメントも注記しているとおり、これは画面隅に出るトースト通知ではなくダイアログボックスです。そのためターミナルウィンドウの背後に開いてしまい、気づかないことがあります。まずはPowerShellで直接コマンドを実行して、ダイアログが出るかを確認してください。WSL内でClaude Codeを動かしている場合は、Windows interop経由で powershell.exe がPATH上にある必要があります。

本当のトースト通知にしたい場合、Claude Code公式が提供する手段はありません。実現するならサードパーティのPowerShellモジュールを使うことになります。代表的なのは BurntToastGitHub: Windos/BurntToast)で、PowerShell Galleryから導入し New-BurntToastNotification -Text '...' で通知を出せます。Anthropicの公式ドキュメントに記載のない外部モジュールなので、組織のPowerShell実行ポリシーやモジュール導入ルールを確認したうえで判断してください。導入可否が読めない環境では、上のメッセージボックス構成か、後述のSlack通知に寄せるほうが安全です。

Linux(notify-send)

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"
          }
        ]
      }
    ]
  }
}

notify-send はデスクトップ通知デーモンを必要とします。ヘッドレスサーバー、SSHセッション、多くのコンテナ環境にはデーモンがないため動きません。まずシェルで notify-send 'Claude Code' 'test' を直接実行して確認してください。コマンド自体が見つからない場合は、DebianやUbuntuでは libnotify-bin パッケージを入れます。デーモンが持てないリモート環境では、次のSlack通知が実質的な唯一の選択肢になります。

Slackへ飛ばす|Webhook URLを設定ファイルに書かない形で

Stopイベントからシェルスクリプト経由でSlack Incoming Webhookへ通知を送る構成とWebhook URLの保管場所
Webhook URLは設定JSONに直書きせず、権限を絞ったファイルから読み込む

Slack側の準備は、Incoming Webhookを1本作るだけです。Slack公式ドキュメントの手順は次の4ステップです。

  1. Slackアプリを新規作成する
  2. アプリ設定で「Activate Incoming Webhooks」をオンにする
  3. 「Add New Webhook to Workspace」から投稿先チャンネルを選ぶ
  4. 「Webhook URLs for Your Workspace」からURLを取得する

ここで最重要の注意点です。Slack公式ドキュメントは、Webhook URLについて「あなたのWebhook URLはシークレットを含みます。公開バージョン管理リポジトリを含め、オンラインで共有しないでください。Slackは漏洩したシークレットを積極的に探索し、失効させます」と明記しています。つまり、.claude/settings.json に直書きしてコミットした時点で、そのURLは遠からず無効化されます。

そこで、URLはパーミッションを絞ったファイルに置き、hooksからはスクリプト経由で読み込みます。

mkdir -p ~/.config/claude-code
printf '%s' 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXX' > ~/.config/claude-code/slack-webhook
chmod 600 ~/.config/claude-code/slack-webhook

次に、フックから呼ぶスクリプトを .claude/hooks/notify-slack.sh として保存します。動作環境は bash と jqcurl です(jq はmacOSなら brew install jq、Debian系なら apt-get install jq)。

#!/bin/bash
# .claude/hooks/notify-slack.sh
set -eu

WEBHOOK_FILE="$HOME/.config/claude-code/slack-webhook"
[ -r "$WEBHOOK_FILE" ] || exit 0
WEBHOOK_URL=$(cat "$WEBHOOK_FILE")

INPUT=$(cat)
EVENT=$(printf '%s' "$INPUT" | jq -r '.hook_event_name')
CWD=$(printf '%s' "$INPUT" | jq -r '.cwd // ""')
DETAIL=$(printf '%s' "$INPUT" | jq -r '(.last_assistant_message // .notification_type // "")[0:300]')

PAYLOAD=$(jq -n --arg e "$EVENT" --arg c "$CWD" --arg d "$DETAIL" \
  '{text: ("Claude Code / " + $e + "\n" + $c + "\n" + $d)}')

curl -s -o /dev/null -X POST -H 'Content-type: application/json' \
  --data "$PAYLOAD" "$WEBHOOK_URL"

exit 0

スクリプトはmacOSとLinuxでは実行可能にしておく必要があります。chmod +x .claude/hooks/notify-slack.sh を忘れると、フックは登録されているのに実行されません。

登録側の設定はこうなります。"async": true を付けると、フックはバックグラウンドで実行され、セッションをブロックしません。ネットワーク越しの通知なので、この指定は入れておいたほうが体感が良くなります。

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notify-slack.sh",
            "async": true,
            "timeout": 20
          }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notify-slack.sh",
            "async": true,
            "timeout": 20
          }
        ]
      }
    ]
  }
}

スクリプトが last_assistant_message を読んでいる点に注意してください。これは Stop イベントの入力に含まれるフィールドで、Claudeの最後の応答テキストがそのまま入ります。作業内容が丸ごとSlackに流れることになるので、機密を扱うリポジトリで使う場合は、先頭300文字の抜粋すら送らず、イベント名とディレクトリ名だけに絞る判断も必要です。本番で使う前に、必ず検証用のチャンネルで動作を確認してください。

入れておきたい通知まわりのhooks 5選

ここまでの部品を、用途別に5つの構成としてまとめます。すべて公式ドキュメントに実在するイベント名とフィールドだけで構成しています。

1. まず1本だけ入れるなら:全通知をデスクトップへ

Notification をmatcher空で登録します。許可待ちも入力待ちも認証完了も、すべて拾います。何が飛んでくるかを1〜2日観察してから、matcherで絞り込むのが失敗の少ない順序です。

2. 許可待ちと入力待ちを鳴らし分ける

matcherに permission_promptidle_prompt を指定して別コマンドを割り当てます。前者は「承認しないと進まない」、後者は「もう終わっている」なので、緊急度が違います。音を変えるだけで、席に戻る優先度が判断できます。

3. 完了をSlackへ(席を外す前提の運用)

上のSlack構成を Stop に登録します。ただし Stop は応答が終わるたびに毎回発火するため、会話量が多いとSlackが埋まります。長時間の自律実行を任せるときだけ .claude/settings.local.json 側で有効にする、という切り分けが現実的です。

4. レート制限で止まったときだけ別経路で知らせる

APIエラーでターンが終わった場合、発火するのは Stop ではなく StopFailure です。matcherはエラー種別で、rate_limitoverloadedauthentication_failed などが指定できます。入力JSONには error_typeerror_message が入ります。

{
  "hooks": {
    "StopFailure": [
      {
        "matcher": "rate_limit",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '\"rate limit: \" + .error_message' | xargs -I{} osascript -e 'display notification \"{}\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

matcherの文字種制限に注意してください。StopFailureFileChanged のmatcherでは、英数字と _、区切りの | しか使えません(カンマ・空白・ハイフンは不可)。

5. 通知以外も1本:編集後の自動整形

通知だけで設定ファイルを開くのはもったいないので、公式ドキュメントの定番例も併せて入れておきます。PostToolUseEdit|Write のmatcherを付け、編集されたファイルパスを jq で取り出してPrettierに渡す構成です。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

この手のツール連携型hooksをもっと知りたい場合は、法人利用の観点から整理したClaude Code hooks入門|自動化の設計と運用が参考になります。

通知が来ないときに見る順番

通知hooksの不具合は、原因が「設定」「権限」「端末環境」の3層に分かれます。上から順に潰すと早く終わります。

ステップ1:/hooks で登録を確認する

/hooks を開き、Notification または Stop の欄に件数が出ているかを見ます。ここに出ていなければ設定が読み込まれていません。JSONの末尾カンマやコメントは許容されないので、まず構文を疑ってください。ファイル編集は通常ウォッチャーが自動で拾いますが、数秒待っても反映されない場合はセッションを再起動します。詳細ビューには、そのフックがどの設定ファイル(User Settings / Project Settings / Local Settings / Plugin Hooks / Session Hooks)由来かも表示されるので、意図しない場所の設定が勝っていないかもここで分かります。

ステップ2:コマンド単体で叩く

フックが登録されているのに動かない場合、コマンド自体を疑います。サンプルJSONを標準入力に流して手で実行します。

echo '{"hook_event_name":"Notification","notification_type":"idle_prompt","cwd":"/tmp"}' | ./.claude/hooks/notify-slack.sh
echo $?

「command not found」が出る場合は絶対パスか ${CLAUDE_PROJECT_DIR} を使います。「jq: command not found」なら jq を入れるか、PythonやNode.jsでJSONを処理する形に書き換えます。

ステップ3:デバッグログを読む

どのフックが一致し、終了コードと標準出力・標準エラーがどうだったかは、デバッグログに全部出ます。

claude --debug-file /tmp/claude.log
# 別のターミナルで
tail -f /tmp/claude.log

すでに起動済みのセッションなら、途中で /debug を実行するとログが有効になり、出力先パスも表示されます。トランスクリプト表示(Ctrl+O)でも、非ブロッキングエラーの通知や、フックのフィードバックを確認できます。

よくある失敗パターン

  • Stop に「タスクが完了したときだけ鳴る」ことを期待する
    Stop はClaudeが応答を終えるたびに毎回発火し、ユーザー割り込み時には発火しない。「終わったら呼んでほしい」の意図には Notificationidle_prompt のほうが近い
  • ❌ Ghostty・Kitty・iTerm2以外のターミナルで、標準のデスクトップ通知が出るのを待つ
    ⭕ 標準通知が出るのはこの3つだけ。他のターミナルでは preferredNotifChannel"terminal_bell" にするか、Notification フックを書く
  • ❌ tmuxの中でClaude Codeを動かし、通知が届かないまま放置する
    ⭕ tmuxは通知とプログレス更新を飲み込む。~/.tmux.confset -g allow-passthrough on を追記し、tmux source-file ~/.tmux.conf で反映する
  • ❌ matcherを Permission_PromptIdlePrompt のように書く
    ⭕ matcherは大文字小文字を区別する。公式の値をそのまま permission_promptidle_prompt と書く
  • ❌ スクリプトはあるのに実行権限を付け忘れる
    ⭕ macOSとLinuxでは chmod +x が必須。付いていないとフックは登録済みでも実行されない
  • ❌ Webhook URLを .claude/settings.json に直書きしてコミットする
    ⭕ Slackは漏洩したシークレットを探索して失効させる。600権限のファイルか環境変数から読み込む形にし、設定JSONにはパスだけを書く
  • ❌ シェルプロファイルの無条件 echo を放置したまま、JSONを返すフックを書く
    ⭕ フックは非対話シェルで動くが、プロファイルが読み込まれる構成だと出力がJSONの前に混ざり、先頭が { でなくなって無視される。if [[ $- == *i* ]]; then echo "..."; fi のように対話時だけ出す形へ直す

Stopフックが8回で打ち切られる場合

通知用途からは外れますが、Stop フックで「テストが通るまで止めない」といった制御を併用している場合の既知の挙動です。Claude Codeは、Stopフックが進捗なく8回連続でブロックすると、そのフックを無効化してターンを終えます。スクリプト側で入力JSONの stop_hook_active を見て、true なら早期に exit 0 してください。8回を超える反復が正当に必要な場合は、環境変数 CLAUDE_CODE_STOP_HOOK_BLOCK_CAP で上限を引き上げられます。

よくある質問

NotificationとStopはどちらを設定すべきですか?

用途が違うので両方入れて構いません。「承認待ちで止まっている」ことに気づきたいなら Notificationpermission_prompt、「一連の作業が終わって放置されている」ことに気づきたいなら idle_prompt です。Stop は応答のたびに毎回発火するため、常時オンにすると通知過多になりやすく、長時間タスク専用と割り切るのが扱いやすい形です。

通知音だけ鳴らしたい場合はどうしますか?

macOSなら afplay /System/Library/Sounds/Glass.aiffNotification フックのコマンドに指定します。ターミナルベルで足りるなら、hooksを書かずに ~/.claude/settings.json"preferredNotifChannel": "terminal_bell" を書くだけでも鳴ります。

Windowsでトースト通知を出せますか?

Claude Code公式ドキュメントが提示しているWindows向けの構成は、PowerShellのメッセージボックス(ダイアログ)です。画面隅に出る本来のトースト通知にしたい場合は、BurntToastなどサードパーティのPowerShellモジュールを併用することになります。公式サポート外の経路なので、組織の実行ポリシーを確認してから導入してください。

Slack通知を入れるとセッションが遅くなりませんか?

フック定義に "async": true を付けると、バックグラウンドで実行されセッションをブロックしません。command 型フックの既定タイムアウトは600秒(10分)と長めなので、ネットワーク通知には短めの timeout を明示しておくと安全です。

設定したのに /hooks に出てきません

まずJSONの構文を確認してください(末尾カンマとコメントは不可)。次に置き場所を確認します。プロジェクト用は .claude/settings.json、全体用は ~/.claude/settings.json です。数秒待っても反映されない場合はファイルウォッチャーが変更を取りこぼしている可能性があるため、セッションを再起動します。組織や別の設定ファイルで "disableAllHooks": true が効いていないかも確認してください。

最後に確認すべきこと

通知hooksを入れた直後に見ておくべきは、次の3点です。

  1. 撃ち分けが意図どおりか/hooksNotificationStop の登録件数と由来ファイルを確認し、想定外の設定ファイルの値が勝っていないかを見る
  2. 鳴りすぎていないか:1日使ってみて Stop が毎ターン鳴って邪魔なら、matcherを idle_prompt に寄せるか、Stop を長時間タスク用のプロジェクトローカル設定へ移す
  3. シークレットがリポジトリに入っていないか:Slackを使った場合、Webhook URLが .claude/settings.json やスクリプト本体にハードコードされていないかを、コミット前に必ず確認する

そのうえで、通知で気づけるようになったら次の段階は「止める」です。危険なコマンドをブロックする PreToolUse、編集後に検証を走らせる PostToolUse まで含めた設計は、hooks全体の記事に譲ります。なお、この記事のコードは公式ドキュメント記載の構成をもとにしたものです。本番環境や機密を扱うリポジトリで使う前に、必ず検証用の環境とチャンネルで動作を確認してください。

あわせて読みたい

参考・出典

  • Automate actions with hooks — Claude Code Docs — Anthropic公式ドキュメント。Notificationフックの初期設定手順、macOS/Linux/Windowsのコマンド例、通知タイプ12種とバージョン条件、トラブルシュート(参照日: 2026-09-13)
  • Hooks reference — Claude Code Docs — Anthropic公式ドキュメント。イベント一覧、Notification/Stop/StopFailureの入力フィールド、async・timeout・matcherの規則、/hooksメニューの表示内容(参照日: 2026-09-13)
  • Configure your terminal for Claude Code — Claude Code Docs — Anthropic公式ドキュメント。preferredNotifChannel、標準通知が出るターミナル3種、iTerm2の転送設定、afplay例、tmuxのallow-passthrough(参照日: 2026-09-13)
  • Settings reference — Claude Code Docs — Anthropic公式ドキュメント。preferredNotifChannel・disableAllHooksの定義とスコープ(参照日: 2026-09-13)
  • Sending messages using incoming webhooks — Slack Developer Docs — Slack公式ドキュメント。Webhook作成の4手順とURLをシークレットとして扱う旨の明記(参照日: 2026-09-13)
  • Windos/BurntToast — GitHub — Windows向けトースト通知のサードパーティPowerShellモジュール。New-BurntToastNotificationの提供元(参照日: 2026-09-13)
  • Download jq — フック内でJSONを解析するために使用するjqの配布元(参照日: 2026-09-13)

この記事を読んで導入イメージが固まってきた方へ

UravationではAIエージェント導入の研修・コンサルを行っています。

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

UravationではClaude Codeの法人研修と個別指導(マンツーマン)を提供しています。導入・定着まで実務ベースで伴走します。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年9月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事