Claude Code、まだ「ターミナルに張り付いて完了を待つツール」だと思ってませんか?
うちは長らく、長時間タスクの完了通知のために ntfy.sh の private トピックでしのいできました。サーバを自前で立てるわけでもなく、ただ十分に長くてランダムなトピック名を private 扱いで使う、という運用です。Claude Code の Stop フックから curl を 1 行叩いて、iPhone に push を飛ばす、それだけ。これがあるかないかで体験は天と地ほど違って、もう手放せないやつでした。
それが、2026 年 4 月 15 日リリースの Claude Code v2.1.110 で、設定 1 つで完全に置き換わってしまいました。本記事は、その移行の記録です。
なんで通知ってそんなに大事なんですか?
うちの開発スタイルは neovim + tmux + Kitty + Claude Code を中心に組み立てていて、ぶっちゃけ、Claude Code に長時間タスクを任せて自分は別のことをしている、という時間がかなり多いです。
たとえばこんな場面:
- マルチエージェントパイプラインを再構築させていて、10 分くらい走り続ける
- リファクタリング後の
pnpm typecheckがフルで走る - Plan モードのレビュー後に「実装どうぞ」と渡して長く戻ってこない
このとき何が困るって、Claude が途中で「権限プロンプト」や「実装終わったから見て」みたいなブロッキングに突入してしまう ことです。気づかないと 30 分そのまま待たされる。Slack で別の話に集中していたら、結局 1 時間ロス、なんて経験を何度もしました。
集中を奪わずに、終わったときだけ知らせてくれる。それくらいでいいんです、こちらが欲しいのは。
今までの構成: ntfy.sh + Stop フック
ntfy はいいツールです。ntfy.sh の好きなトピックに POST するだけで、登録したスマホに push が飛ぶ。サインアップもサーバ立ても要りません。これだけ。
私は Claude Code の Stop フックでこれを叩いていました。
bash# ~/.claude/hooks/stop.sh
curl -s \
-H "Title: Claude Code finished" \
-H "Priority: default" \
-d "Session $CLAUDE_SESSION_ID completed at $(date)" \
https://ntfy.sh/grz-claude-private-xxxxx
これで、何かしらセッションが終わるたびに iPhone がブブッと震える わけです。
便利でした。が、運用してみると地味に気になる点が 2 つ。
- どんな終わり方でも push する。ファイル 1 つ書いて終わったセッションでも鳴る。要は、ノイズが多い。
- トピック名が事実上のパスワード。長くてランダムにしてもらってますが、漏れたら他人にも push を撃たれる。public な ntfy.sh に POST しているわけで、運用としてはちょっと気が重い。
「ノイズだけ消したい」と思って、フックスクリプトを少しずつ育てていく…という選択肢もありますが、長時間タスクの通知のために Bash スクリプトを延々と育てる、というのもなんだか目的を見失っている気がします。
v2.1.110 で公式 push が入りました
そこに 2026-04-15 の Claude Code v2.1.110 で、モバイル push がしれっと組み込まれました。changelog の文面はえらく素っ気なくて、
Added push notification tool — Claude can send mobile push notifications when Remote Control and "Push when Claude decides" config are enabled.
これだけ。でも、中身を読むとなかなかすごいです。
仕組みは超シンプル:
- 公式の Claude モバイルアプリ(iOS / Android)にログインしておく
- ローカルの Claude Code セッションで Remote Control を有効化
/configからPush when Claude decidesをtrueに
これで終わり。agentPushNotifEnabled: true が settings.json に書かれます。
json{
"agentPushNotifEnabled": true
}
ペアリングは、初回にモバイルアプリを開くだけです。私は最初これを忘れて CLI に「No mobile registered」と言われました。アプリ起動した瞬間に push token が refresh されて解決。
「Claude が判断する」がいい仕事してくれる
ここがこの機能の一番面白いところです。自分で「いつ通知するか」を細かく設定しなくていい。Claude がその時々の文脈を見て、「ここは止まるから通知すべき」と判断してくれます。
ドキュメントを読むと、push が飛ぶのはだいたい次の 3 ケース:
- 長時間タスクの完了 — テストや build が走り終わったとき
- 判断要求 — 権限プロンプトや、Plan モード承認待ちのとき
- 明示的に依頼したとき — プロンプトに「終わったら知らせて」と書けば、終了時に確実に push
これがちょうど、私が ntfy で頑張ってフィルタしようとしていた条件そのものなんですよ。なんなら自分でルール書くより精度が高い。yarn install が終わっただけでは push されない。「30 分かかった typecheck の最後で型エラーが残っていて、ユーザーに尋ねるしかない瞬間」だけ届く わけです。
体感で、ノイズが 1/10 になりました。これで集中も切れません。至れり尽くせり。
ぶっちゃけ、弱点もあります
正直、これは万能じゃないです。私は自分のラップトップで Claude Code を回している時間が多いから刺さるけれど、用途によっては従来の ntfy のほうが向いてます。
| シナリオ | ntfy / curl | Claude Code 公式 push |
|---|---|---|
| ローカル Claude Code の長時間タスク | ✅ | ✅ |
| GitHub Actions / CI ジョブ | ✅ (curl 1 行) | ❌ (Remote Control 不可) |
| サーバ常駐の cron 完了通知 | ✅ | ❌ |
| 他人の Claude Code セッションを共有 | ✅ (URL 渡せば誰でも) | △ (個人アカウント紐付け) |
要は 「自分のマシンで動いている Claude Code セッションだけ」 が対象です。CI 完了通知が要るケースだと、ntfy はやっぱり残しておく必要があります。私もそうしてます。GitHub Actions の curl 1 行は、これからも消しません。
Before / After
textBefore: Stop hook → curl → ntfy.sh の private トピック → モバイルアプリ ・hook スクリプトのメンテ ・トピック名 = 事実上のパスワード、漏れたら他人にも push 可能 ・どんな終了でも一律 push (ノイズ多) After: /config → agentPushNotifEnabled: true ・モバイルアプリにログインするだけ ・Claude が「止まる瞬間」だけ判断して push ・トピック秘匿の心配なし
設定値 1 つでこれが全部置き換わる、という体験は、自前 hook の運用と比べると拍子抜けします。
まとめ
- Claude Code v2.1.110 でモバイル push が 標準機能 になりました
- 設定は
agentPushNotifEnabled: true1 つ。モバイルアプリにログインしてペアリングするだけ - 「Claude が判断する」 ので、ノイズが激減します。これがほんとに気持ちいい
- ただし対象はローカルセッションのみ。CI 通知はこれからも ntfy 併用です
ツール選定は「自分が何の運用をやめたいか」という問いに帰着することが多いです。ntfy 自体は今後も大好きで、GitHub Actions からの CI 通知では使い続けます。けれど、Claude Code セッションの通知のためだけに維持していた hook スクリプトと private トピックは、もう要らない。
~/.claude/hooks/stop.sh を一回 git rm して、寝ます。
Less infrastructure is better infrastructure.
— 公式ドキュメント: Remote Control / Mobile Push Notifications / Changelog v2.1.110