Claude Code をリモートサーバーで実行すると、notify-send や osascript の hook はサーバー上で実行されますが、そこには通知を表示するデスクトップがありません。有効な方法は 2 つあります。1 つ目は terminal エスケープシーケンスです。Claude Code の組み込み通知、または terminalSequence を返す hook は SSH 接続を通ってローカルに戻り、ローカルの terminal(Ghostty、Kitty、iTerm2)が表示します。ただし、接続中で terminal を開いている間に限られます。2 つ目は、ntfy、webhook、Claude Code Notifier を使い、サーバーからネットワーク経由でスマートフォンに push する方法です。こちらはノートパソコンを閉じていても機能します。
01SSH 経由ではローカルの通知コマンドが動かない理由
hook は、Claude Code が動いているマシン上で Claude Code が実行するコマンドです。SSH で接続したサーバーなら、そのサーバー上で実行されます。そこで notify-send を使うにはデスクトップ通知デーモンが必要ですが、Anthropic の hooks ガイドにもあるとおり、ヘッドレスサーバーや SSH セッションにはこれがありません。osascript や PowerShell のトースト通知はそもそも存在しません。
つまり問題は「どの通知コマンドを使うか」ではなく、「サーバーからどうやって自分にシグナルを届けるか」です。方法は 3 つあります。
02方法 1:SSH の terminal を通じた通知
Claude Code 自体の通知は、terminal に書き込まれるエスケープシーケンスです。Anthropic の terminal ガイドによると、これは SSH を通じてローカルマシンに届くため、リモートセッションからでも通知を受け取れます。Ghostty と Kitty は設定なしでデスクトップの通知センターに渡します。iTerm2 は有効化が必要です。Settings > Profiles > Terminal で Notification Center Alerts にチェックを入れ、Filter Alerts で Send escape sequence-generated alerts をオンにしてください。
これら以外の terminal を使っている場合や、独自のテキストを表示したい場合は、Claude Code に書き込ませるエスケープシーケンスを hook から返せます。hook 自体は terminal を持たないため、terminalSequence フィールドで返します。次の内容をサーバー上の ~/.claude/hooks/notify-ssh.sh に保存してください。
#!/bin/bash
body=$(jq -r '.message // "Claude Code needs your attention"')
# OSC 9 for iTerm2, WezTerm and ConEmu; use '\033]777;notify;%s;%s\007' for Ghostty
seq=$(printf '\033]9;%s\007' "$body")
jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
次に、サーバー上の ~/.claude/settings.json に追加します。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/notify-ssh.sh" }
]
}
]
}
}
chmod +x ~/.claude/hooks/notify-ssh.sh を実行し、サーバーに jq をインストールしてください。Anthropic のリファレンスでは、対応するシーケンスとして OSC 9(iTerm2、ConEmu、Windows Terminal、WezTerm)、OSC 99(Kitty)、OSC 777(urxvt、Ghostty、Warp)、単体のベルが挙げられています。Claude Code がシーケンスを書き込むのは、インタラクティブセッションでインターフェースが画面に表示されている間だけです。
この方法には構造上の制約があります。SSH 接続が切れたり、ノートパソコンがスリープしたり、タブを閉じたりすると、何も届きません。tmux 内で Claude Code を実行している場合は、サーバー上の ~/.tmux.conf に set -g allow-passthrough on を追加してください。詳細やデタッチしたセッションについては tmux ガイドを参照してください。
03方法 2:サーバーからの push
push は terminal に依存しないため、長時間のジョブに適しています。hook がサーバーから HTTPS リクエストを送り、サービスがそれをスマートフォンやチャットに届けます。動作する hook の例は ntfy ガイドと Telegram・Slack・Discord ガイドにあります。ただし、これらは何かが起きたことを知らせるだけです。コマンドの承認や質問への回答はできないため、Claude は再接続するまで待ち続けます。
04方法 3:サーバー上で Claude Code Notifier を使う
Claude Code Notifier は独立したツールです(Anthropic ではなく TouchTap が開発)。無料のコマンドラインツール ccn は Mac、Windows、Linux で動作するので、Claude Code が動いているサーバーにインストールします。
curl -fsSL https://claudecodenotifier.com/install.sh | sh
サーバーの ~/.claude/settings.json に hook のエントリを追加し、既存の設定はそのまま残してバックアップも作成します。ccn のデスクトップ通知は ccn が動いているマシンに表示されるため、ヘッドレスサーバーでは役に立ちません。有効なのはスマートフォンです。スマートフォンへの通知は SSH 接続ではなく TouchTap の暗号化されたリレーサーバーを経由するため、インターネットに接続できれば ccn が動くどのマシンからでも届きます。
SSH 経由でのペアリング
ペアリングにサーバー上のブラウザは不要です。SSH セッションで ccn pair を実行すると、terminal に QR コードと 24 時間有効なリンクが表示されるので、スマートフォンのカメラで QR コードを読み取ります。または、スマートフォンでアプリを開いて Computers > Add a computer に進み、表示されたコマンドを実行すれば、インストールとペアリングが一度に完了します。
curl -fsSL https://claudecodenotifier.com/install.sh | sh -s 482913
(6 桁のコードは例です。アプリに表示されたコードを使ってください。)1 台のスマートフォンに複数のコンピューターを登録できるため、ノートパソコンとサーバーの両方から通知を受け取れます。詳しくはペアリングガイドを参照してください。
スマートフォンからできること
ペアリングが済むと、Claude の完了時、許可が必要なとき、質問が来たときに push が届きます。許可リクエストには「今回だけ許可」「このセッション中は許可」「拒否」で応答でき、Claude の質問には回答を選べます。Claude が完了したら次の指示を送ることもできます。席を外している間は、設定した上限時間まで terminal がスマートフォンからの応答を待ち、キーボードで入力した瞬間に待機をやめます。hook、認証情報、リレーへの接続を確認するには、サーバーで ccn doctor を実行してください。スマートフォンアプリについては料金をご覧ください。コマンドラインツールは無料です。
05SSH が切れても Claude Code を動かし続ける
3 つの方法のいずれも、Claude Code 自体が動き続けていることが前提です。SSH のシェルから直接 claude を起動すると、接続が切れた時点でセッションも終了します。tmux や GNU screen の中で実行すれば切断後も生き残り、あとから再アタッチできます。デタッチ中のセッションでも hook は発火し続けるので、ここでスマートフォンへの push が真価を発揮します。この使い方については tmux ガイドと長時間タスク中に席を外すで解説しています。
06よくある質問
SSH 経由で Claude Code を使うと notify-send が何もしないのはなぜですか?
hook はサーバー上で実行されますが、サーバーにはデスクトップ通知のデーモンがないためです。ローカルの terminal が解釈できるエスケープシーケンスか、push サービスを使ってください。
Claude Code の組み込み通知は SSH 経由でも動きますか?
対応している terminal であれば動きます。Anthropic のドキュメントによると、デスクトップ通知は SSH 越しにローカルマシンへ届きます。Ghostty と Kitty は設定なしで表示でき、iTerm2 はエスケープシーケンスによるアラートを有効にすれば表示されます。接続が開いている必要があります。
ccn はノート PC とサーバーのどちらにインストールしますか?
サーバーです。Claude Code とその hook が動いているのはサーバーだからです。ノート PC でも Claude Code を使うならそちらにもインストールしてください。1 台のスマートフォンを両方とペアリングできます。
SSH セッションが切断されても通知は届きますか?
サーバーからの push を使い、かつ tmux の中などで Claude Code が動き続けている場合に限り届きます。エスケープシーケンスは接続が切れた時点で届かなくなります。
スマートフォン通知のためにサーバーでポートを開ける必要はありますか?
ccn にインバウンド接続は不要です。リレーサーバーに到達するためのアウトバウンドのインターネット接続が必要です。