macOS では、Ghostty、Kitty、iTerm2 なら Claude Code が標準でデスクトップ通知を送ります(iTerm2 はアラート設定の有効化が必要)。しかし Apple Terminal やその他の多くのターミナルでは何も表示されません。どのターミナルでも通知を受け取るには、~/.claude/settings.json に osascript -e 'display notification ...' を実行する Notification hook を追加します。Claude が終わった瞬間も知りたい場合は Stop hook も追加してください。また、システム設定でスクリプトエディタの通知を許可しておかないと、osascript コマンドは何のエラーも出さずに失敗します。
01Claude Code 標準の通知動作
Claude Code は、タスクを終えたときや権限の承認を待っているときに、ユーザーがターミナルを離れているようであれば通知イベントを発生させます。Anthropic のターミナルガイドによると、表示内容はターミナルによって異なります。
iTerm2 では、Settings > Profiles > Terminal を開いて Notification Center Alerts にチェックを入れ、Filter Alerts をクリックして Send escape sequence-generated alerts をオンにします。あわせて システム設定 > 通知 で iTerm2 の通知が許可されているかも確認してください。
Apple Terminal では、少なくとも音を鳴らすことはできます。~/.claude/settings.json に "preferredNotifChannel": "terminal_bell" を設定し、設定 > プロファイル > 詳細 で オーディオベル をオンにします。詳しくはターミナルベルのガイドを参照してください。
組み込みのアラートには制約があります。Claude Code がユーザーが離席中だと判断したときにしか発火せず、何かが起きたことしか伝えず、通知がそのコンピュータの外に届くこともありません。
02osascript を使った通知 hook
hook なら IDE のターミナルを含め、どのターミナルでも動作します。以下は Anthropic の hooks ガイドにある macOS 向けの例です。既存のキーは残したまま、~/.claude/settings.json に追加してください。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
Claude Code で /hooks と入力し、Notification の下に表示されていることを確認します。
スクリプトエディタの通知許可
osascript はスクリプトエディタとして通知を送ります。スクリプトエディタに通知の権限がないと、コマンドは何も言わずに失敗し、macOS も許可を求めてきません。まずターミナルで次のコマンドを一度実行してください。
osascript -e 'display notification "test"'
初回は何も表示されません。システム設定 > 通知 を開き、スクリプトエディタ を探して 通知を許可 をオンにします。もう一度コマンドを実行すると、テスト通知が表示されるはずです。
発火タイミング
matcher を空にすると、すべての通知タイプで発火します。特に重要なのは permission_prompt(Claude が承認を約6秒待っていて、ユーザーが何も入力していない)と idle_prompt(Claude が約60秒前に処理を終え、それ以降入力がない)の2つです。すべてのタイプと発火タイミングは Notification hook ガイドにまとめています。
03Claude の完了をすぐに知る
idle_prompt は1分待ってから発火します。すぐに知りたい場合は、Claude がターンを終えたときに実行される Stop hook を追加しましょう。Stop には matcher は不要です。
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\" sound name \"Glass\"'"
}
]
}
]
}
}
sound name には /System/Library/Sounds 内の任意のサウンド(Glass、Ping、Hero など)を指定できます。音だけで十分なら、コマンドに afplay /System/Library/Sounds/Glass.aiff を使うこともできます。このイベントの詳細は Stop hook ガイドを参照してください。
04実際のメッセージを表示する
hook は標準入力で JSON を受け取ります。Notification の入力には「Claude needs your permission」のような message フィールドが含まれます。小さなスクリプトを使えば、このテキストを通知に表示できます。次の内容を ~/.claude/hooks/notify-mac.sh として保存してください。
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
osascript -e 'on run argv' \
-e 'display notification (item 1 of argv) with title "Claude Code"' \
-e 'end run' "$msg"
テキストを AppleScript の文字列に埋め込まず引数として渡しているので、メッセージに引用符が含まれていてもコマンドが壊れません。chmod +x ~/.claude/hooks/notify-mac.sh で実行権限を付与し、hook のコマンドを ~/.claude/hooks/notify-mac.sh に設定します。このスクリプトには jq が必要です(jq --version が失敗する場合は brew install jq でインストールしてください)。
05terminal-notifier:クリックでターミナルに戻る
osascript の通知はクリックするとスクリプトエディタが開いてしまい、目的の場所には戻れません。terminal-notifier を使えば、前面に出すアプリを指定できます。
brew install terminal-notifier
terminal-notifier -title "Claude Code" -message "Claude has finished" -sound default -activate com.googlecode.iterm2
Apple Terminal なら com.apple.Terminal、エディタならその bundle ID を指定します。同じコマンドを hook の command フィールドに設定してください。初回はシステム設定で terminal-notifier の通知を許可する必要があります。
06集中モードとおやすみモード
これらはすべて通常の macOS 通知なので、集中モードによって非表示になることがあります。特定の時間帯に通知が届かない場合は、システム設定 > 集中モード を確認し、通知を送るアプリ(スクリプトエディタ、terminal-notifier、またはお使いのターミナル)を許可してください。自分で決めた時間帯に合わせて通知を制御したい場合は、quiet hours とおやすみモードを参照してください。
07Claude Code Notifier の位置づけ
Mac の前に座っていて、ちょっとした合図が欲しいだけなら、上記の hook で十分です。しかし席を離れると物足りなくなります。Mac の通知はキッチンにいるあなたには届きませんし、Claude に返答することもできないからです。
Claude Code Notifier は、同じ hook を基盤にした独立したツールです(Anthropic ではなく TouchTap が開発)。無料のコマンドラインツール ccn は Mac、Windows、Linux で動作します。Mac には次のコマンドでインストールできます。
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Homebrew の場合は brew trust --formula touch-tap/tap/ccn && brew install touch-tap/tap/ccn です。~/.claude/settings.json に自身の hook エントリを追加し、ファイルの他の部分には手を加えず、バックアップも残します。以降は Claude が処理を終えたとき、権限を求めたとき、質問したときに macOS の通知を表示します。ネットワークやスマートフォンは不要です。
iPhone や Android のスマートフォンをペアリングすると、同じイベントが push 通知で届き、スマートフォンから権限の許可・拒否、Claude の質問への回答の選択、次の指示の送信ができます。直近30秒以内にターミナルで入力していた場合は、通常どおりターミナルで確認が行われ、スマートフォン側では待機しません。詳しくはスマートフォンのペアリングとccn のページをご覧ください。スマートフォンアプリの利用にはサブスクリプションまたは買い切りの購入が必要です。料金をご確認ください。
ccn を導入する場合は、自作の osascript hook を削除してください。残したままだと、イベントごとに通知が2つ表示されます。また、旧版の Mac メニューバーアプリもありますが、同じ Mac で ccn と併用しないでください。
08よくある質問
osascript の hook で何も表示されないのはなぜですか?
多くの場合、スクリプトエディタに通知の許可がないため、macOS がエラーを出さずに通知を破棄しています。一度 osascript -e 'display notification "test"' を実行してから、システム設定 > 通知 でスクリプトエディタを許可してください。それでも表示されない場合は、集中モードが有効になっていないか、/hooks に hook が表示されているかを確認してください。
Claude Code は設定なしで macOS の通知を送りますか?
はい。Ghostty と Kitty では送られます。iTerm2 でも通知センターへのアラートを有効にすれば送られます。Apple のターミナルや IDE の terminal ではデフォルトでデスクトップ通知が出ないため、hook か ccn を使ってください。
Claude が終わった 1 分後ではなく、すぐに通知を受け取るには?
Stop hook を使ってください。idle_prompt 通知は Claude の完了から約 60 秒後、しかもその間に入力がなかった場合にのみ発火しますが、Stop は毎ターンの終わりに実行されます。
バナーの代わりに音で知らせることはできますか?
はい。hook のコマンドに afplay /System/Library/Sounds/Glass.aiff を使うか、osascript のコマンドに sound name "Glass" を追加すれば両方を得られます。
macOS の通知から権限を承認できますか?
osascript や terminal-notifier ではできません。これらはテキストを表示するだけです。hook から権限リクエストに応答するには PermissionRequest イベントが必要です。hook から権限リクエストに応答する方法を参照するか、Claude Code Notifier でスマートフォンから承認してください。