ntfy で Claude Code の push 通知を受け取るには、スマートフォンに ntfy アプリをインストールし、推測されにくい名前のトピックを購読して、curl -d "message" https://ntfy.sh/your-topic を実行する Claude Code の hook を追加します。Notification hook は Claude が権限を求めているときや入力を待っているときに、Stop hook はターンが終わった瞬間に通知します。無料で、10 分ほどで設定でき、Mac、Windows、Linux で動作します。
01ステップ 1: トピックを決めて購読する
ntfy にはアカウント登録がありません。トピックは誰かが最初に publish または購読した時点で作成され、名前を知っていれば誰でも読めます。ntfy の公式ドキュメントにもあるとおり、トピック名は実質的にパスワードなので、claude-7f3k9q2xw4mz のように長くランダムな名前にしてください。使える文字は英字、数字、アンダースコア、ハイフンで、最大 64 文字です。
ntfy アプリ(App Store、Google Play、F-Droid)をインストールし、+ をタップして ntfy.sh 上のトピックを購読します。
terminal から動作を確認します:
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
1~2 秒以内にスマートフォンが振動するはずです。Windows 10 と 11 には curl.exe が標準で入っており、同じコマンドがそのまま使えます。
02ステップ 2: hook スクリプト(Mac と Linux)
Claude Code は各 hook に標準入力で JSON オブジェクトを渡します。どちらのイベントにも cwd や hook_event_name などの共通フィールドがあります。Notification には message と notification_type が、Stop には Claude の最後の返答テキストである last_assistant_message が追加されます。このスクリプトはどちらのイベントも読みやすい push に変換します。jq が必要です(brew install jq、Debian や Ubuntu なら apt install jq)。
~/.claude/ntfy-notify.sh として保存し、chmod +x ~/.claude/ntfy-notify.sh を実行します:
#!/bin/sh
TOPIC_URL="https://ntfy.sh/claude-7f3k9q2xw4mz"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
title="Claude finished: $project"
body=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "Done") | .[0:300]')
priority=3
else
title="Claude needs you: $project"
body=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
priority=4
fi
curl -s -H "Title: $title" -H "Priority: $priority" -H "Tags: robot" \
-d "$body" "$TOPIC_URL" > /dev/null
exit 0
Priority は 1(最低)から 5(緊急)まで指定できます。Tags は通知に絵文字を付けるもので、robot ならロボットの顔が表示されます。
03ステップ 3: settings.json に登録する
~/.claude/settings.json に hook を追加します。ファイルにすでに hooks オブジェクトがある場合は、置き換えずにその中へイベントを追加してください。
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh", "async": true }
]
}
]
}
}
"async": true を指定すると Stop hook がバックグラウンドで送信するため、ネットワークが遅くても Claude の動作は遅れません。hook はセッション開始時に読み込まれるので、新しい Claude Code セッションを開始してください。
Stop と idle_prompt のどちらを使うか
Stop は、キーボードの前にいても Claude が終わった瞬間に発火します。通知が多すぎる場合は Stop ブロックを削除し、代わりに matcher permission_prompt|idle_prompt を使ってください。Anthropic のドキュメントによると、idle_prompt は Claude の完了から約 60 秒後、その間に入力がなかった場合のみ発火し、permission_prompt は権限確認が約 6 秒間キー入力なしで待機した時点で発火します。これで「離席中だけ通知する」簡易フィルターが手軽に実現できます。各フィールドとタイミングの詳細は Notification hook ガイドと Stop hook ガイドを参照してください。
04Windows(PowerShell)
Windows では、これを %USERPROFILE%\.claude\ntfy-notify.ps1 として保存します。追加のインストールは不要です:
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') {
$title = "Claude finished: $project"
$body = [string]$in.last_assistant_message
if ($body.Length -gt 300) { $body = $body.Substring(0, 300) }
$priority = '3'
} else {
$title = "Claude needs you: $project"
$body = [string]$in.message
$priority = '4'
}
Invoke-RestMethod -Method Post -Uri 'https://ntfy.sh/claude-7f3k9q2xw4mz' `
-Headers @{ Title = $title; Priority = $priority } `
-Body ([Text.Encoding]::UTF8.GetBytes($body)) | Out-Null
そのうえで、上記の command 行の代わりに次の hook エントリを使います:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\ntfy-notify.ps1\""
}
WSL 内で Claude Code を実行している場合は、Mac と Linux 用のスクリプトを使ってください。hook から見れば WSL は Linux です。
05プライバシーを守る
push の内容はすべて ntfy サーバーを経由し、ntfy.sh ではトピック名を知っている人なら誰でも読めます。上の Stop メッセージには Claude の返答の冒頭が含まれ、コードやファイル名が入ることもあります。対策は 3 つあります:
- 送る情報を減らす。
Stopの本文を"Done"のような固定文字列にし、タイトルにはプロジェクト名だけを残します。 - アクセストークンを使う。 ntfy はどの publish でも
-H "Authorization: Bearer tk_..."を受け付けます。自前のサーバーではauth-default-access: "deny-all"を設定し、ntfy user addでユーザーを、ntfy token addでトークンを作成します。 - 自前のサーバーを立てる。 ntfy はセルフホストできます。iPhone アプリへ即時配信するには、ntfy のドキュメントにあるとおり
upstream-base-url: "https://ntfy.sh"を設定します。これによりメッセージ ID とトピックのハッシュだけが ntfy.sh に転送されてスマートフォンが起動し、アプリは本文を自分のサーバーから取得します。
Claude Code をリモートサーバーで実行している場合も同じ hook がそのまま動くので、ntfy は SSH 越しの通知にも向いています。
06Claude Code Notifier の位置づけ
一方向の通知が目的なら、上の設定で十分ですし、無理に別の方法を勧めるつもりもありません。ただし、これは知らせるところまでです。push で Claude が権限を求めていると分かっても、キーボードに戻るまでセッションは待ち続けます。
ntfy には HTTP リクエストを送るアクションボタンがあるので、返信の仕組みを自作することもできます。リクエストを publish し、別のトピックで応答を待ち、判断を返す PermissionRequest hook を作るという方法で、実際にそうしているオープンソースプロジェクトもあります(比較記事を参照)。
Claude Code Notifier はその仕組みをパッケージ化したものです。スマートフォンをペアリングすれば、権限の「今回のみ許可」「セッション中は許可」「拒否」、Claude からの質問への回答、Claude 完了後の次の指示の送信を、すべてスマートフォンから行えます。在席確認も行い、直近 30 秒以内に入力があれば terminal で通常どおり確認し、スマートフォン側では何も待ちません。離席中は設定した上限時間まで terminal が回答を待ち、キーボードに触れた瞬間に待機をやめます。ccn は Mac、Windows、Linux で動作します。スマートフォンアプリについては ccn のページと料金をご覧ください。
07よくある質問
Claude Code の通知に ntfy は無料で使えますか?
ntfy.sh への publish と購読にアカウントは不要で、サーバーは誰でも利用できます。ntfy には有料プランもあり、セルフホストも可能です。最新の制限は ntfy の公式サイトで確認してください。
ntfy の hook が発火しないのはなぜですか?
hook は起動時に読み込まれるため、settings.json を編集したら新しい Claude Code セッションを開始してください。次に curl のテストコマンドを手動で実行し、echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh のようにサンプル JSON をスクリプトに渡して試します。それ以外の確認事項はトラブルシューティングのチェックリストにまとめています。
ntfy の通知から Claude Code に返信できますか?
単純な publish ではできません。ntfy の HTTP アクションボタンでリクエストは送れますが、回答を待って Claude Code が理解できる判断に変換する hook が必要です。
すべての通知タイプで push が届きますか?
届くのは指定した matcher の分だけです。Notification エントリの matcher を省略すると、認証や MCP のダイアログを含むすべてのタイプを受け取れます。