スマホから Claude Code を操作・承認する方法
Claude Code スマホ対応の方法を整理します。リモートコントロールの始め方、切れたときの再接続、SSH アプリ、クラウドセッションと、それぞれのセキュリティを解説します。
記事を読む長い作業の完了や承認待ちに気づけないと、その時間がそのまま無駄になります。hooks の Notification と Stop、PowerShell の通知と通知音、Remote Control と Telegram によるスマホへの送り方、通知が出ないときの確認項目を、公式ドキュメントに沿ってまとめました。
Notification イベントを、応答を終えたときに Stop イベントを出します。この2つに hooks をつなぐと、Windows の通知や通知音で知らせられます。preferredNotifChannel か、hooks のどちらかで補います。Stop、承認待ちは permission_prompt を受けるのがおすすめです。idle_prompt は応答の約60秒後に出るので、完了の知らせには遅すぎます。/hooks に登録されているか、次にスクリプト単体で動くか、最後に Windows 側の通知設定と応答不可を確認します。Claude Code に長い作業を任せて別の作業をしていると、終わったことにも、承認を待って止まっていることにも気づけません。気づくのが10分遅れれば、その10分は丸ごと無駄になります。この記事では、Claude Code の通知設定を、Windows の通知、通知音、スマホの順に説明します。最後に、通知が出ないときの確認項目をまとめました。
設定の書式と挙動は、2026年10月7日に確認した Anthropic と Microsoft の公式ドキュメントに載っているものだけを使っています。手元で実際に実行して確かめたのは claude --version(2.1.280)だけです。記事のスクリプトは、PowerShell の構文として解析できるところまで確認しました。実際に通知が出るかどうかは、途中のテスト用コマンドで、あなたの環境で確かめてください。
Claude Code が人を待つ場面は、思ったより多くあります。
セッションが1つだけなら、ターミナルをときどき見れば足ります。ところが 並列実行で複数のセッションを動かし始めると、どれが終わって、どれが返事を待っているのかを、画面を見て確かめるだけでは追いきれなくなります。通知は、人が見に行く回数を減らすための仕組みです。
hooks は、Claude Code の動きの特定の場面で、あなたが決めたコマンドを自動で実行する仕組みです。通知に使うのは主に次の2つのイベントです。
Claude Code が通知を出すときに発火します。matcher で通知の種類を絞れます。空にすると、すべての種類で発火します。通知に関係の深い種類を挙げます。
| matcher | 発火するタイミング |
|---|---|
permission_prompt | ツールの使用などの承認が必要で、プロンプトが約6秒待たされているとき |
idle_prompt | Claude が応答を終えて約60秒たち、その間あなたが何も入力していないとき |
elicitation_dialog | MCP サーバーが入力フォームを開き、約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秒後に発火します。
メインの Claude Code エージェントが応答を終えたときに発火します。作業の完了を知りたいなら、Stop が向いています。ただし次の点に気をつけてください。
Esc などで中断したときは発火しません。Stop ではなく StopFailure が発火します。レート制限や認証エラーなどで止まったことを知らせたいなら、StopFailure にもフックをつなぎます。Stop に渡される情報には、Claude の最後の応答の全文が入った last_assistant_message や、動作中のバックグラウンドタスクの一覧が入った background_tasks があります。通知に応答の内容を載せることもできますが、スマホなど社外のサービスに送るときは、載せないほうが安全です。
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 を書かなくても使えます。
ここからは、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 を直接起動する書き方にします。
%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」にします。日本語を使わずに英語の文面にすれば、この問題は起きません。
cwd の最後のフォルダ名を、通知のタイトルに使います。複数のプロジェクトを動かしているときに、どれの通知かが分かります。Stop は「終わりました」、StopFailure は「エラーで止まりました」、permission_prompt は「承認を待っています」です。NotifyIcon の ShowBalloonTip を使っています。タスクバーの通知領域に、タイトルと本文の付いた吹き出しを出すメソッドです。Start-Sleep。スクリプトがすぐ終わると、通知が表示される前にアイコンが片付けられるおそれがあります。表示のために数秒待っています。Windows の「通知センター」に出る、いわゆるトースト通知を使う方法もありますが、この記事では採りませんでした。Microsoft のドキュメントでは、デスクトップアプリがトースト通知を出すには、アプリの識別子(AppUserModelID)を渡す必要があるとされています。識別子を持たない PowerShell のスクリプトから出すには、別途の準備が要ります。ShowBalloonTip は、その準備なしで使えます。見た目は Windows のバージョンによって変わります。
同じドキュメントには、気をつけたい点がいくつか書かれています。タイムアウトの引数(ここでは 5000)は非推奨で、表示される時間は、システムのアクセシビリティの設定に従います。また、タスクバーに一度に表示できる吹き出しは1つだけです。2つのセッションがほぼ同時に終わると、先に出た通知が途中で消えることがあります。複数のセッションを動かすなら、通知音も使って、通知が重なっても気づけるようにしておくと安心です。
%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 が表示されれば登録できています。設定ファイルの変更は通常は自動で反映されますが、数秒たっても出ないときは、セッションを開き直してください。
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_dialog | MCP サーバーを使う場合だけで足ります |
| 使用制限の待ちが終わって再開した | Notification の quota_auto_resume_fired | 使用制限に当たりやすい人向けです |
idle_prompt は、はずしました。応答を終えて約60秒たち、まだ何も入力していないときに出るため、Stop と同じ出来事を、1分遅れでもう一度知らせることになります。席を離れたあとの「念押し」として使いたい場合にだけ、足してください。
承認待ちを、もっと早く知りたい場合は、permission_prompt の代わりに PermissionRequest イベントを使う方法があります。公式のリファレンスには、Claude がツールの権限を求めたときにすぐフックを動かしたいなら、PermissionRequest を使うようにと書かれています。PermissionRequest のフックは、承認や拒否の判断を返すこともできます。通知だけが目的なら、判断を何も出力しないスクリプトにしてください。この記事の notify.ps1 は何も出力しないので、そのまま使えます。
席を離れても通知を受け取りたいなら、スマホに送ります。方法は3つあります。
Claude Code の Remote Control がオンのとき、Claude はスマホにプッシュ通知を送れます。送られるのは、長い作業が終わったときや、続けるのに判断が必要なときなどです。「テストが終わったら通知して」のように、プロンプトで頼むこともできます。
設定の手順は、公式ドキュメントでは次のとおりです。
/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 では、通知を受けるだけでなく、スマホからセッションを続けられます。くわしくは、スマホから操作する方法にまとめました。
プッシュ通知の種類や条件を自分で決めたいなら、フックから Telegram に送ります。Telegram の Bot API は、HTTPS で https://api.telegram.org/bot<token>/sendMessage に chat_id と text を送ると、メッセージを届けてくれます。
準備は次のとおりです。
/newbot を送って、ボットを作ります。返ってくるトークンを控えます。https://api.telegram.org/bot<token>/getUpdates を開き、返ってきた JSON から、自分の chat の id を探します。<token> の部分には、手順 1 のトークンを入れます。[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 の要領で試してください。
Claude Code の「チャネル」は、Telegram や Discord などのチャットから、実行中のセッションにメッセージを送り込む機能です。通知を受けるだけでなく、チャットから返信もできます。権限の確認をチャットに転送する機能に対応したチャネルなら、外出先から承認や拒否もできます。ただし、チャネルはリサーチプレビューの段階で、claude.ai か Console の API キーによる認証が必要です。プラグインのインストールにも Bun が要ります。この記事の範囲を超えるので、設定は公式ドキュメントを見てください。
上から順に確認すると、原因を見つけやすくなります。
/hooks を実行し、期待したイベントの下にフックが出ているか確認します。出ないときは、JSON が正しいか(末尾のカンマやコメントがないか)、設定ファイルの場所が合っているか(全プロジェクトなら %USERPROFILE%\.claude\settings.json)を見ます。組織の管理設定で allowManagedHooksOnly が有効だと、ユーザーの設定ファイルのフックは実行されません。matcher が合っているか。matcher は大文字と小文字を区別します。permission_prompt の綴りを確認してください。permission_prompt は発生しません。idle_prompt も、約60秒たたないと出ません。確認するときは、別のウィンドウに切り替えて、10秒ほど待ちます。Stop は、あなたが中断したときには発火しません。API エラーで止まったなら、Stop ではなく StopFailure です。.ps1 が BOM なしで保存されています。「UTF-8(BOM 付き)」で保存し直してください。RemoteSigned で、自分で作ったローカルのスクリプトは実行できます。インターネットからダウンロードしたスクリプトには署名が必要なので、このページからコピーして自分で保存したファイルを使ってください。会社の端末で、ポリシーがもっと厳しく設定されている場合は、実行が拒否されることがあります。Ctrl+O を押すと、トランスクリプトに、フックの実行結果が出ます。スクリプトが0以外の終了コードで終わると、「hook error」のような通知が出ます。さらに詳しく知りたいときは、claude --debug-file でログの出力先を決めて起動すると、どのフックが一致して、どう終わったかが記録されます。powershell.exe が PATH から見える必要があります。ここまでの方法は、1つのセッション、1台の PC なら、よく働きます。プロジェクトが3つ、セッションが6つ、さらに別の PC にも動いているものがある、となると、通知は鳴りっぱなしになります。鳴るたびに、どのウィンドウの話かを探すことになります。
AigoPilot は、全プロジェクトのセッションを1つのウィンドウに並べて、質問に答える必要のあるもの、権限の確認を待っているもの、終わったばかりで、まだ見ていないものを、1つの列にまとめます。通知を減らすのではなく、通知が指す先を1か所にそろえる考え方です。AigoPilot は、Anthropic とは別の会社が作っている独立したソフトウェアです。iPhone アプリも作ってありますが、App Store での公開準備中で、まだ使えません。通知と承認をまとめて受け取る方法は、機能のページで説明しています。
出せます。Claude Code の標準の通知は、iTerm2、Ghostty、Kitty でしかデスクトップ通知を出さないので、Windows では hooks を使います。Stop イベントに PowerShell のスクリプトをつなぐと、応答が終わるたびに通知と通知音を出せます。承認待ちを知りたいときは、Notification イベントの permission_prompt にもつなぎます。
いいえ。Stop は、Claude が応答を終えるたびに発火します。短い質問に答えただけでも発火します。ユーザーが中断したときは発火せず、API エラーで止まったときは、代わりに StopFailure が発火します。
完了の知らせには向きません。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 で保存したかを見ます。
async、args と shell、PowerShell、デバッグ):code.claude.com/docs/ja/hooks(2026年10月7日に確認)preferredNotifChannel):code.claude.com/docs/ja/settings-reference(2026年10月7日に確認)-NoProfile、-File、-WindowStyle):learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_powershell_exe(2026年10月7日に確認)bellStyle):learn.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-advanced(2026年10月7日に確認)sendMessage、getUpdates):core.telegram.org/bots/api(2026年10月7日に確認)claude --version(2.1.280、2026年10月7日)。記事のスクリプトは、PowerShell の構文として解析できることだけを確認しています。