Claude Code の作業完了を通知で受け取る設定方法(Windows・通知音・スマホ)

長い作業の完了や承認待ちに気づけないと、その時間がそのまま無駄になります。hooks の Notification と Stop、PowerShell の通知と通知音、Remote Control と Telegram によるスマホへの送り方、通知が出ないときの確認項目を、公式ドキュメントに沿ってまとめました。

要点
  • Claude Code は、承認待ちや入力待ちのときに Notification イベントを、応答を終えたときに Stop イベントを出します。この2つに hooks をつなぐと、Windows の通知や通知音で知らせられます。
  • Windows のターミナルでは、組み込みのデスクトップ通知は標準では出ません。ベルを鳴らす preferredNotifChannel か、hooks のどちらかで補います。
  • 作業の完了は Stop、承認待ちは permission_prompt を受けるのがおすすめです。idle_prompt は応答の約60秒後に出るので、完了の知らせには遅すぎます。
  • スマホには、公式の Remote Control のプッシュ通知を使う方法と、hooks から自分の Telegram ボットに短い通知を送る方法があります。
  • 通知が出ないときは、まず /hooks に登録されているか、次にスクリプト単体で動くか、最後に Windows 側の通知設定と応答不可を確認します。

Claude Code に長い作業を任せて別の作業をしていると、終わったことにも、承認を待って止まっていることにも気づけません。気づくのが10分遅れれば、その10分は丸ごと無駄になります。この記事では、Claude Code の通知設定を、Windows の通知、通知音、スマホの順に説明します。最後に、通知が出ないときの確認項目をまとめました。

設定の書式と挙動は、2026年10月7日に確認した Anthropic と Microsoft の公式ドキュメントに載っているものだけを使っています。手元で実際に実行して確かめたのは claude --version(2.1.280)だけです。記事のスクリプトは、PowerShell の構文として解析できるところまで確認しました。実際に通知が出るかどうかは、途中のテスト用コマンドで、あなたの環境で確かめてください。

長い作業のあとに、通知が要る理由

Claude Code が人を待つ場面は、思ったより多くあります。

  • 承認を待っているとき。権限の確認が出ると、答えるまでセッションは止まったままです。公式ドキュメントにも、権限プロンプトに達したセッションは応答するまで一時停止すると書かれています。
  • 質問が来たとき。MCP サーバーが入力フォームを開いた場合なども、人の返事待ちになります。
  • 作業が終わったとき。終わったのに気づかないと、次の指示を出すのが遅れます。
  • 止まってしまったとき。API のエラーやレート制限でターンが終わることがあります。claude.ai の使用制限に達して一時停止し、リセットされると自動で再開する場合もあります。

セッションが1つだけなら、ターミナルをときどき見れば足ります。ところが 並列実行で複数のセッションを動かし始めると、どれが終わって、どれが返事を待っているのかを、画面を見て確かめるだけでは追いきれなくなります。通知は、人が見に行く回数を減らすための仕組みです。

Claude Code が出せる通知の種類:Notification と Stop

hooks は、Claude Code の動きの特定の場面で、あなたが決めたコマンドを自動で実行する仕組みです。通知に使うのは主に次の2つのイベントです。

Notification イベント

Claude Code が通知を出すときに発火します。matcher で通知の種類を絞れます。空にすると、すべての種類で発火します。通知に関係の深い種類を挙げます。

matcher発火するタイミング
permission_promptツールの使用などの承認が必要で、プロンプトが約6秒待たされているとき
idle_promptClaude が応答を終えて約60秒たち、その間あなたが何も入力していないとき
elicitation_dialogMCP サーバーが入力フォームを開き、約6秒入力がないとき
agent_needs_inputバックグラウンドセッションが、あなたの入力を待ち始めたとき(エージェントビューを開いている間のみ)
agent_completedバックグラウンドセッションが完了または失敗したとき(エージェントビューを開いている間のみ)
quota_auto_resume_fired使用制限で止まっていた作業を、Claude Code が再開したとき

ほかにも auth_success や quota_auto_resume_stale など、いくつか種類があります。全部の一覧は、公式の hooks リファレンスの Notification の項にあります。

タイミングで注意したいのは、ターミナルでは、あなたがターミナルから離れていると判断されたときにだけ発生する種類があることです。permission_prompt は、約6秒間キー入力がないときに出ます。タイマーは権限プロンプトが出たときに始まり、キーを押すたびに延びます。つまり、そのターミナルで入力している最中には、通知は来ません。

Claude Desktop と VS Code 拡張機能では、少し違います。権限の確認を受け取る方法が違うためで、入力中でも延期されず、確認が出てから約6秒後に発火します。

Stop イベント

メインの Claude Code エージェントが応答を終えたときに発火します。作業の完了を知りたいなら、Stop が向いています。ただし次の点に気をつけてください。

  • タスクが完了したときだけでなく、Claude が応答を終えるたびに発火します。短い質問に答えただけでも発火します。
  • あなたが Esc などで中断したときは発火しません。
  • API エラーでターンが終わったときは、Stop ではなく StopFailure が発火します。レート制限や認証エラーなどで止まったことを知らせたいなら、StopFailure にもフックをつなぎます。

Stop に渡される情報には、Claude の最後の応答の全文が入った last_assistant_message や、動作中のバックグラウンドタスクの一覧が入った background_tasks があります。通知に応答の内容を載せることもできますが、スマホなど社外のサービスに送るときは、載せないほうが安全です。

Claude Code の通知設定:まず組み込みのベルを試す

hooks を書く前に、設定ファイルの1行で済む方法を確認します。Claude Code には、通知の出し方を選ぶ preferredNotifChannel という設定があります。/config の画面では「Local notifications」として表示されます。

標準の値は "auto" です。このとき Claude Code は、iTerm2、Ghostty、Kitty ではデスクトップ通知を送りますが、それ以外のターミナルでは、Terminal.app で可聴ベルがオフの場合を除いて、何もしません。Windows で使う Windows Terminal や VS Code の統合ターミナルは、標準のままでは通知を受け取れないということです。

どのターミナルでもベル文字を鳴らすには、%USERPROFILE%\.claude\settings.json に次を書きます。

{
  "preferredNotifChannel": "terminal_bell"
}

ベルをどう扱うかは、ターミナル側の設定です。Windows Terminal では、プロファイルの bellStyle で決まります。標準は "audible"(音)で、"all" にすると音に加えてタスクバーのアイコンが点滅します。ターミナルにフォーカスがないときは、点滅だけになります。

この方法は手軽ですが、鳴るだけです。どのプロジェクトの、どのセッションが、何の理由で呼んでいるのかは分かりません。複数のセッションを動かしているなら、次の hooks のほうが向いています。なお、Claude のデスクトップアプリには、セッションが完了して、そのセッションを表示していないときに、OS の通知を出す機能があります。この機能は、hooks を書かなくても使えます。

hooks で Windows の通知を出す

ここからは、PowerShell のスクリプトを1つ置いて、フックから呼び出します。必要な作業は3つです。スクリプトを置くこと、settings.json に登録すること、動くか試すことです。

フックの動き方

コマンド形式のフックは、イベントの情報を JSON にして、標準入力に渡します。たとえば Stop なら hook_event_name、cwd(作業フォルダ)、last_assistant_message などです。Notification なら、通知の本文の message と、種類を示す notification_type が加わります。スクリプトはこの JSON を読んで、通知の文面を決めます。

Windows でシェル形式のコマンドを書くと、Git Bash が入っていれば Git Bash で、入っていなければ PowerShell で実行されます。引用符の扱いが環境で変わるのを避けるため、この記事では、args を使って powershell.exe を直接起動する書き方にします。

手順 1:スクリプトを置く

%USERPROFILE%\.claude\hooks\notify.ps1 として、次の内容で保存します。hooks フォルダは自分で作ってください。

# notify.ps1: Claude Code の Notification / Stop / StopFailure フック用
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$raw = [Console]::In.ReadToEnd()

$data = $null
try { $data = $raw | ConvertFrom-Json } catch { }

$project = "Claude Code"
if ($data -and $data.cwd) { $project = Split-Path -Leaf $data.cwd }

$event = ""
if ($data) { $event = $data.hook_event_name }

# 既定は「確認が必要」。イベントの種類で文面と音を変える
$text = "確認が必要です"
$wavName = "Windows Notify System Generic.wav"

if ($event -eq "Stop") {
    $text = "作業が終わりました"
    $wavName = "Windows Ding.wav"
} elseif ($event -eq "StopFailure") {
    $text = "エラーで止まりました"
    $wavName = "Windows Critical Stop.wav"
} elseif ($data -and $data.notification_type -eq "permission_prompt") {
    $text = "承認を待っています"
}

# 音
$wav = Join-Path $env:SystemRoot ("Media\" + $wavName)
if (Test-Path $wav) {
    $player = New-Object System.Media.SoundPlayer $wav
    $player.Play()
} else {
    [System.Media.SystemSounds]::Asterisk.Play()
}

# 通知(タスクバーの通知領域に出る吹き出し)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$notify = New-Object System.Windows.Forms.NotifyIcon
$notify.Icon = [System.Drawing.SystemIcons]::Information
$notify.BalloonTipTitle = "Claude Code: $project"
$notify.BalloonTipText = $text
$notify.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info
$notify.Visible = $true
$notify.ShowBalloonTip(5000)

# すぐ終了すると通知と音が途中で消えるので、少し待ってから片付ける
Start-Sleep -Seconds 6
$notify.Dispose()

保存の形式に注意してください。日本語を含む .ps1 は、「UTF-8(BOM 付き)」で保存します。Microsoft のドキュメントによると、BOM がないと Windows PowerShell は、スクリプトを従来の ANSI のコードページ(日本語環境では Shift_JIS 系)として読むため、文字化けします。VS Code なら、右下のエンコードの表示から「エンコード付きで保存」を選び、「UTF-8 with BOM」にします。日本語を使わずに英語の文面にすれば、この問題は起きません。

スクリプトの中身

  • 標準入力を読む部分。フックの JSON は UTF-8 で渡されます。Windows PowerShell の標準の入力エンコードはシステムのコードページなので、先に UTF-8 に切り替えてから読んでいます。
  • プロジェクト名。cwd の最後のフォルダ名を、通知のタイトルに使います。複数のプロジェクトを動かしているときに、どれの通知かが分かります。
  • 文面の切り替え。Stop は「終わりました」、StopFailure は「エラーで止まりました」、permission_prompt は「承認を待っています」です。
  • 通知。Microsoft が公開している NotifyIcon の ShowBalloonTip を使っています。タスクバーの通知領域に、タイトルと本文の付いた吹き出しを出すメソッドです。
  • 最後の Start-Sleep。スクリプトがすぐ終わると、通知が表示される前にアイコンが片付けられるおそれがあります。表示のために数秒待っています。

Windows の「通知センター」に出る、いわゆるトースト通知を使う方法もありますが、この記事では採りませんでした。Microsoft のドキュメントでは、デスクトップアプリがトースト通知を出すには、アプリの識別子(AppUserModelID)を渡す必要があるとされています。識別子を持たない PowerShell のスクリプトから出すには、別途の準備が要ります。ShowBalloonTip は、その準備なしで使えます。見た目は Windows のバージョンによって変わります。

同じドキュメントには、気をつけたい点がいくつか書かれています。タイムアウトの引数(ここでは 5000)は非推奨で、表示される時間は、システムのアクセシビリティの設定に従います。また、タスクバーに一度に表示できる吹き出しは1つだけです。2つのセッションがほぼ同時に終わると、先に出た通知が途中で消えることがあります。複数のセッションを動かすなら、通知音も使って、通知が重なっても気づけるようにしておくと安心です。

手順 2:settings.json に登録する

%USERPROFILE%\.claude\settings.json を開いて、次の hooks を追加します。すべてのプロジェクトで有効になります。taro の部分は、自分のユーザー名に置き換えてください。

{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe",
            "args": [
              "-NoProfile",
              "-WindowStyle", "Hidden",
              "-File", "C:\\Users\\taro\\.claude\\hooks\\notify.ps1"
            ],
            "async": true
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe",
            "args": [
              "-NoProfile",
              "-WindowStyle", "Hidden",
              "-File", "C:\\Users\\taro\\.claude\\hooks\\notify.ps1"
            ],
            "async": true
          }
        ]
      }
    ],
    "StopFailure": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe",
            "args": [
              "-NoProfile",
              "-WindowStyle", "Hidden",
              "-File", "C:\\Users\\taro\\.claude\\hooks\\notify.ps1"
            ],
            "async": true
          }
        ]
      }
    ]
  }
}

設定ファイルに hooks がすでにある場合は、全体を置き換えずに、Notification、Stop、StopFailure を、既存のイベントと並べて足してください。JSON なので、末尾のカンマとコメントは使えません。

各項目の意味は次のとおりです。

  • "command": "powershell.exe" と args:シェルを通さずに、直接 PowerShell を起動します。Windows のこの形式では、command が実際の実行ファイル(.exe)である必要があり、powershell.exe はそれに当たります。引数の1つ1つは、引用符なしで1つの引数として渡されます。
  • -NoProfile:PowerShell のプロファイルを読み込みません。プロファイルの内容に、フックの動作が左右されないようにするためです。
  • -WindowStyle Hidden:コンソールのウィンドウを隠す指定です。
  • "async": true:フックをバックグラウンドで実行します。スクリプトが6秒待つあいだ、Claude の動きを止めません。
  • Notification の matcher:permission_prompt だけに絞っています。Stop には matcher を指定できません。発生のたびに必ず発火します。

ユーザー名を書きたくないときは、シェル形式で、"shell": "powershell" を指定して環境変数から組み立てることもできます。公式のドキュメントでは、PowerShell のシェル形式で環境変数を参照するときは、$env:名前 の形で書くとされています。次はハンドラーの部分だけを示したものです。

{
  "type": "command",
  "shell": "powershell",
  "command": "& \"$env:USERPROFILE\\.claude\\hooks\\notify.ps1\"",
  "async": true
}

登録したら、Claude Code の画面で /hooks と入力します。フックの一覧に、Notification、Stop、StopFailure が表示されれば登録できています。設定ファイルの変更は通常は自動で反映されますが、数秒たっても出ないときは、セッションを開き直してください。

手順 3:動くか試す

Claude Code を使わずに、スクリプトだけを試せます。フックと同じ形の JSON を、標準入力に流し込みます。

'{"hook_event_name":"Stop","cwd":"C:\\work\\my-app"}' | powershell.exe -NoProfile -File "$env:USERPROFILE\.claude\hooks\notify.ps1"

音が鳴り、「Claude Code: my-app」というタイトルの通知が出れば成功です。次に、Claude Code で、書き込みの権限が必要な作業を頼んで、別のウィンドウに切り替えてみてください。約6秒後に、承認待ちの通知が出るはずです。切り替えずに入力を続けていると、通知は来ません。

通知音を変える

音の出し方には、Microsoft のドキュメントにある方法が2つあります。

  • System.Media.SystemSounds。Asterisk、Beep、Exclamation、Hand、Question の5つがあり、現在の Windows のサウンドスキームに割り当てられた音が鳴ります。音は、コントロールパネルのサウンドの設定で変えられます。
  • System.Media.SoundPlayer。指定した .wav ファイルを再生します。.mp3 と .wma は再生できないので、使いたい音は .wav に変換してください。Play() は非同期、PlaySync() は再生が終わるまで待ちます。

前のスクリプトは、Windows に入っている音を SoundPlayer で鳴らしています。筆者の Windows 11 では、C:\Windows\Media に Windows Ding.wav、Windows Notify System Generic.wav、Windows Critical Stop.wav があることを確認しました。環境によってファイルの名前は違うことがあるので、見つからなければ SystemSounds の音に切り替わるようにしてあります。

完了と承認待ちで音を変えておくと、画面を見なくても、どちらなのかが分かります。たとえば、完了は短い音、承認待ちは目立つ音、エラーは警告音、という具合です。$wavName の行を書き換えれば、好きな音にできます。自分で用意した .wav を使うなら、$wav にフルパスを直接書いてください。

通知は要らず、音だけで十分なら、スクリプトを使わずに、設定ファイルだけで済ませることもできます。

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe",
            "args": [
              "-NoProfile",
              "-Command",
              "(New-Object System.Media.SoundPlayer 'C:\\Windows\\Media\\Windows Ding.wav').PlaySync()"
            ],
            "async": true
          }
        ]
      }
    ]
  }
}

音が鳴らないときは、Windows 側の設定も見てください。「設定」の「システム」の「通知」では、アプリごとに、通知の音を鳴らすかどうかを決められます。ただし、上のスクリプトの音は、通知とは別に、SoundPlayer が直接鳴らしています。ここがオフでも鳴ります。逆に、スピーカーがミュートの場合や、出力先が別のデバイスになっている場合は、何も聞こえません。

完了と承認待ちを使い分ける

通知は、増やしすぎると、すぐに無視するようになります。次の組み合わせから始めて、足りなければ増やすのがおすすめです。

知りたいことつなぐイベントメモ
作業が終わったStop応答のたびに出ます。短い質問のあとにも鳴ります
承認を待っているNotification の permission_prompt入力中は出ません。約6秒の待ちがあります
エラーで止まったStopFailureレート制限や認証エラーなどのときだけです
MCP の質問に答えてほしいNotification の elicitation_dialogMCP サーバーを使う場合だけで足ります
使用制限の待ちが終わって再開したNotification の quota_auto_resume_fired使用制限に当たりやすい人向けです

idle_prompt は、はずしました。応答を終えて約60秒たち、まだ何も入力していないときに出るため、Stop と同じ出来事を、1分遅れでもう一度知らせることになります。席を離れたあとの「念押し」として使いたい場合にだけ、足してください。

承認待ちを、もっと早く知りたい場合は、permission_prompt の代わりに PermissionRequest イベントを使う方法があります。公式のリファレンスには、Claude がツールの権限を求めたときにすぐフックを動かしたいなら、PermissionRequest を使うようにと書かれています。PermissionRequest のフックは、承認や拒否の判断を返すこともできます。通知だけが目的なら、判断を何も出力しないスクリプトにしてください。この記事の notify.ps1 は何も出力しないので、そのまま使えます。

スマホで通知を受け取る

席を離れても通知を受け取りたいなら、スマホに送ります。方法は3つあります。

方法 1:Remote Control のプッシュ通知(公式)

Claude Code の Remote Control がオンのとき、Claude はスマホにプッシュ通知を送れます。送られるのは、長い作業が終わったときや、続けるのに判断が必要なときなどです。「テストが終わったら通知して」のように、プロンプトで頼むこともできます。

設定の手順は、公式ドキュメントでは次のとおりです。

  1. スマホに、iOS または Android の Claude アプリを入れます。
  2. Claude Code と同じアカウントと組織で、アプリにサインインします。
  3. OS の通知の許可を求められたら、許可します。
  4. ターミナルで /config を実行し、Push when Claude decides(Claude が必要と判断したとき)か、Push when actions required(権限の確認や質問のとき)か、両方を有効にします。

Remote Control を使うには、Pro、Max、Team、Enterprise のいずれかのプランが必要です。API キーでは使えません。また、ターミナルに入力している間や、接続したターミナルにフォーカスがある間は、プッシュは送られません。席にいるあいだは、別のウィンドウを見ていても送らないようにするには、環境変数 CLAUDE_CLIENT_PRESENCE_FILE にファイルのパスを設定します。そのファイルがある間は、通知が送られなくなります。

届かないときは、/config に「No mobile registered」と出ていないかを見ます。出ていたら、スマホで Claude アプリを一度開いて、プッシュのトークンを更新します。iOS では、フォーカスモードや通知のまとめ表示で、プッシュが抑えられたり遅れたりします。Android では、バッテリーの最適化で遅れることがあります。

Remote Control では、通知を受けるだけでなく、スマホからセッションを続けられます。くわしくは、スマホから操作する方法にまとめました。

方法 2:hooks から自分の Telegram ボットに送る

プッシュ通知の種類や条件を自分で決めたいなら、フックから Telegram に送ります。Telegram の Bot API は、HTTPS で https://api.telegram.org/bot<token>/sendMessage に chat_id と text を送ると、メッセージを届けてくれます。

準備は次のとおりです。

  1. Telegram で BotFather を開き、/newbot を送って、ボットを作ります。返ってくるトークンを控えます。
  2. 作ったボットに、スマホから何でもいいので1通送ります。
  3. ブラウザで https://api.telegram.org/bot<token>/getUpdates を開き、返ってきた JSON から、自分の chat の id を探します。<token> の部分には、手順 1 のトークンを入れます。
  4. トークンと ID を、Windows のユーザー環境変数に入れます。
[Environment]::SetEnvironmentVariable("CLAUDE_NOTIFY_TG_TOKEN", "ここにトークン", "User")
[Environment]::SetEnvironmentVariable("CLAUDE_NOTIFY_TG_CHAT", "ここに chat の id", "User")

環境変数は、設定したあとに起動したプロセスから使えます。Claude Code を起動し直してください。トークンは、パスワードと同じ扱いです。プロジェクトの .claude/settings.json は、リポジトリに入れて共有されやすいので、トークンを直接書くのは避けます。環境変数にしておけば、設定ファイルには出てきません。

送信用のスクリプトは、%USERPROFILE%\.claude\hooks\notify-telegram.ps1 として、これも「UTF-8(BOM 付き)」で保存します。

# notify-telegram.ps1: 短い通知だけを自分の Telegram ボットに送る
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$raw = [Console]::In.ReadToEnd()
$data = $raw | ConvertFrom-Json

$token = $env:CLAUDE_NOTIFY_TG_TOKEN
$chat  = $env:CLAUDE_NOTIFY_TG_CHAT
if (-not $token -or -not $chat) { exit 0 }

$project = Split-Path -Leaf $data.cwd
$what = "確認が必要です"
if ($data.hook_event_name -eq "Stop") {
    $what = "作業が終わりました"
} elseif ($data.notification_type -eq "permission_prompt") {
    $what = "承認を待っています"
}

# 会話の内容(last_assistant_message など)は送らない
$body = @{ chat_id = $chat; text = "Claude Code ($project): $what" } | ConvertTo-Json
$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)
$uri = "https://api.telegram.org/bot$token/sendMessage"

try {
    Invoke-RestMethod -Method Post -Uri $uri -ContentType "application/json; charset=utf-8" -Body $bytes | Out-Null
} catch { }

送るのは、プロジェクト名と、何が起きたかだけです。last_assistant_message には Claude の応答が丸ごと入っていて、ソースコードや社内の情報が含まれることがあります。それを外部のサービスに送るかどうかは、よく考えてから決めてください。Telegram の Bot API は UTF-8 で受け付けるため、本文は UTF-8 のバイト列にして送っています。

登録は、手順 2 の notify.ps1 の代わりに、notify-telegram.ps1 を呼ぶフックを足すだけです。両方つなげば、PC の通知とスマホの通知が、同時に出ます。

{
  "type": "command",
  "command": "powershell.exe",
  "args": [
    "-NoProfile",
    "-WindowStyle", "Hidden",
    "-File", "C:\\Users\\taro\\.claude\\hooks\\notify-telegram.ps1"
  ],
  "async": true
}

この方法には弱点があります。PC がスリープしていたり、ネットワークがつながっていなかったりすると、何も送られません。上のスクリプトは、送信に失敗しても何もせずに終わります。失敗に気づきたいなら、catch の中でログのファイルに書くなどの処理を足してください。この記事のスクリプトは、実際には送信しない形でしか確認していません。トークンを設定したあと、まず自分のボットに1通届くかどうかを、手順 3 の要領で試してください。

方法 3:チャネル(Telegram など)

Claude Code の「チャネル」は、Telegram や Discord などのチャットから、実行中のセッションにメッセージを送り込む機能です。通知を受けるだけでなく、チャットから返信もできます。権限の確認をチャットに転送する機能に対応したチャネルなら、外出先から承認や拒否もできます。ただし、チャネルはリサーチプレビューの段階で、claude.ai か Console の API キーによる認証が必要です。プラグインのインストールにも Bun が要ります。この記事の範囲を超えるので、設定は公式ドキュメントを見てください。

通知が出ないときの確認項目

上から順に確認すると、原因を見つけやすくなります。

  • フックが登録されているか。Claude Code で /hooks を実行し、期待したイベントの下にフックが出ているか確認します。出ないときは、JSON が正しいか(末尾のカンマやコメントがないか)、設定ファイルの場所が合っているか(全プロジェクトなら %USERPROFILE%\.claude\settings.json)を見ます。組織の管理設定で allowManagedHooksOnly が有効だと、ユーザーの設定ファイルのフックは実行されません。
  • イベントと matcher が合っているか。matcher は大文字と小文字を区別します。permission_prompt の綴りを確認してください。
  • 入力中ではないか。ターミナルでは、あなたが入力していると permission_prompt は発生しません。idle_prompt も、約60秒たたないと出ません。確認するときは、別のウィンドウに切り替えて、10秒ほど待ちます。
  • 中断していないか。Stop は、あなたが中断したときには発火しません。API エラーで止まったなら、Stop ではなく StopFailure です。
  • スクリプト単体で動くか。手順 3 のコマンドで、スクリプトだけを動かします。ここで出なければ、Claude Code ではなくスクリプトの問題です。
  • 文字化けしていないか。日本語の通知が文字化けするなら、.ps1 が BOM なしで保存されています。「UTF-8(BOM 付き)」で保存し直してください。
  • PowerShell の実行ポリシー。Microsoft のドキュメントでは、Windows のクライアントの標準は RemoteSigned で、自分で作ったローカルのスクリプトは実行できます。インターネットからダウンロードしたスクリプトには署名が必要なので、このページからコピーして自分で保存したファイルを使ってください。会社の端末で、ポリシーがもっと厳しく設定されている場合は、実行が拒否されることがあります。
  • フックのエラーを見る。Claude Code で Ctrl+O を押すと、トランスクリプトに、フックの実行結果が出ます。スクリプトが0以外の終了コードで終わると、「hook error」のような通知が出ます。さらに詳しく知りたいときは、claude --debug-file でログの出力先を決めて起動すると、どのフックが一致して、どう終わったかが記録されます。
  • WSL で Claude Code を動かしていないか。WSL の中では、Windows 側の powershell.exe が PATH から見える必要があります。
  • Windows 側の通知の設定。「設定」の「システム」の「通知」で、通知そのものがオフになっていないか見ます。「応答不可」がオンだと、バナーは出ず、通知センターに直接入ります。自動でオンになる条件には、全画面のアプリを使っているときやゲーム中があるので、全画面で作業していると、通知が見えないことがあります。
  • 通知が重なっていないか。前に書いたとおり、吹き出しは一度に1つしか出ません。複数のセッションが続けて終わったときは、最後のものしか見えないことがあります。

セッションが増えたら、通知もまとめたくなる

ここまでの方法は、1つのセッション、1台の PC なら、よく働きます。プロジェクトが3つ、セッションが6つ、さらに別の PC にも動いているものがある、となると、通知は鳴りっぱなしになります。鳴るたびに、どのウィンドウの話かを探すことになります。

AigoPilot は、全プロジェクトのセッションを1つのウィンドウに並べて、質問に答える必要のあるもの、権限の確認を待っているもの、終わったばかりで、まだ見ていないものを、1つの列にまとめます。通知を減らすのではなく、通知が指す先を1か所にそろえる考え方です。AigoPilot は、Anthropic とは別の会社が作っている独立したソフトウェアです。iPhone アプリも作ってありますが、App Store での公開準備中で、まだ使えません。通知と承認をまとめて受け取る方法は、機能のページで説明しています。

よくある質問

Windows の Claude Code で、作業が終わったときにデスクトップ通知を出せますか?

出せます。Claude Code の標準の通知は、iTerm2、Ghostty、Kitty でしかデスクトップ通知を出さないので、Windows では hooks を使います。Stop イベントに PowerShell のスクリプトをつなぐと、応答が終わるたびに通知と通知音を出せます。承認待ちを知りたいときは、Notification イベントの permission_prompt にもつなぎます。

Stop フックは、作業が完全に終わったときだけ発火しますか?

いいえ。Stop は、Claude が応答を終えるたびに発火します。短い質問に答えただけでも発火します。ユーザーが中断したときは発火せず、API エラーで止まったときは、代わりに StopFailure が発火します。

idle_prompt は、作業の完了通知に使えますか?

完了の知らせには向きません。idle_prompt は、Claude が応答を終えて約60秒たち、その間に入力がなかったときに出ます。完了の瞬間に知りたいなら Stop を使い、idle_prompt は、席を離れたあとの念押しが欲しいときだけ足します。

通知音だけを鳴らすことはできますか?

できます。Stop イベントに、PowerShell で System.Media.SoundPlayer を呼び出すコマンドをつなぎます。SoundPlayer が再生できるのは .wav ファイルだけで、.mp3 は再生できません。Windows に入っている音は C:\Windows\Media にあります。

スマホに通知を送るには、どうすればよいですか?

公式の方法は、Remote Control のモバイルプッシュ通知です。Claude アプリを入れて、同じアカウントでサインインし、Claude Code の /config でプッシュを有効にします。Pro、Max、Team、Enterprise のプランが必要で、API キーでは使えません。自分で内容を決めたいときは、hooks から自分の Telegram ボットにメッセージを送る方法もあります。

フックを登録したのに、通知が出ません。何を確認すればよいですか?

まず Claude Code で /hooks を実行して、フックが登録されているか確認します。次に、スクリプトを単体で動かして、通知が出るか試します。そのうえで、ターミナルで入力中ではないか、Windows の通知設定と応答不可がオンになっていないか、日本語を含む .ps1 を BOM 付きの UTF-8 で保存したかを見ます。

出典