
Claude Code の回答完了を macOS の通知で受け取り、クリックで作業中のウィンドウに戻れるようにしてみた
1. はじめに
こんにちは。リテールアプリ共創部の中村です。
みなさんは、Claude Code に作業を任せている間、回答が終わったことにどうやって気づいていますか?
私は複数のプロジェクトで Claude Code を並行して動かすことが多く、別の作業に移ると回答の完了を見落としがちでした。そこで、回答が終わったら macOS の通知を出し、クリックすればそのプロジェクトのウィンドウに戻れる仕組みを作ってみました。
本記事では、以下の内容についてまとめます。
2. フックでできることと、osascript の通知の限界
2-1. 通知に使うフックは Stop と Notification
Claude Code のフック(hooks)は、決まったタイミングでシェルコマンドを実行できる仕組みです。今回は次の2つを使います。
| イベント | 動くタイミング | 今回使うデータ |
|---|---|---|
Stop |
メインのエージェントが応答を完了したとき | last_assistant_message(最終応答のテキスト) |
Notification |
Claude Code が通知を送るとき(権限の確認待ち、入力待ちなど) | message(通知のテキスト) |
どちらのイベントも、session_id・cwd(作業フォルダ)・hook_event_name などの共通の項目を、JSON 形式のデータとして受け取ります。
(※ 公式ドキュメントでは、Stop はユーザーが中断して止めた場合には実行されないと書かれています。また、Notification フックは通知を止めたり書き換えたりはできず、ログなどの副作用に使う想定です。)
2-2. 公式の例(osascript)では、クリック時の動作は指定できない
公式ガイドでは、macOS 向けに osascript で通知を出す例が紹介されています。手軽に試せますが、指定できる項目は限られています。Apple の公式リファレンスによると、AppleScript の display notification で指定できるのは本文・タイトル・サブタイトル・音の4つです。通知をクリックしたときの動作は指定できません。
また、osascript の通知は Script Editor(スクリプトエディタ)を経由して送られます。そのため、macOS の設定で Script Editor の通知を許可しておく必要があります。
参考:hooks でアクションを自動化する|Claude Code Docs、Commands Reference|AppleScript Language Guide
3. 通知の出し方の比較
「通知をクリックしたら作業中のウィンドウに戻れること」を条件に、2つの方法を比べてみました。
凡例:○ できる ✕ できない
| 観点 | ① osascript | ② terminal-notifier |
|---|---|---|
| 追加のインストール | 不要 | Homebrew で入れる |
| タイトル・サブタイトル・音 | ○ | ○ |
| クリック時にコマンドを実行 | ✕ | ○(-execute) |
| 同じ種類の通知を1件にまとめる | ✕ | ○(-group) |
3-1. ① osascript(見送り)
macOS に最初から入っているので、設定は一番簡単です。今回はクリックして元の画面に戻れることを条件にしたので、採用を見送りました。
3-2. ② terminal-notifier(採用)
terminal-notifier は、コマンドラインから macOS の通知を出せるツールです。公式の README によると、-execute オプションに書いたコマンドが、通知をクリックしたときに実行されます。-group に同じ ID を渡すと、古い通知が新しい通知に置き換わります。

出典:julienXX/terminal-notifier|GitHub(README の -subtitle の例)
3-3. 割り切ったポイント
terminal-notifier を使うには、パッケージ管理ツールの Homebrew でインストールする必要があります。少し手間はかかりますが、クリックして作業に戻れる便利さのほうが大きいと考え、ここは割り切りました。
なお、terminal-notifier が入っていない環境でも動くように、ツールが見つからないときは osascript で通知する予備の処理も入れています。
参考:terminal-notifier|Homebrew Formulae
4. 設定してみる
ここからは、terminal-notifier を使って実際に設定していきます。全体の流れは次のとおりです。

図1:フックから通知を出し、クリックしてエディタ(Zed)のウィンドウに戻るまでの流れ
4-1. terminal-notifier を入れる
Homebrew でインストールします。
brew install terminal-notifier
(※ 筆者の環境ではバージョン 3.1.0 が入りました。初めて通知を出すときに、macOS 側で terminal-notifier の通知を許可するか聞かれるので、許可してください。)
参考:Homebrew、terminal-notifier|Homebrew Formulae
4-2. 通知を出すスクリプトを用意する
通知を出すスクリプトを ~/.claude/hooks/notify.sh に置きます。スクリプトがやっていることは次の4つです。
- フックから JSON を受け取り、
jqで必要な項目を取り出す - イベントの種類(
StopかNotificationか)で、タイトルを「✅ 回答完了」と「⏳ 確認待ち」に分ける - 本文に直前の回答(
last_assistant_message)か通知のテキスト(message)を入れ、120文字に切る - terminal-notifier を呼び、クリックしたときに
open -a Zed <作業フォルダ>が動くようにする
受け取るデータと、通知に表示される場所の対応は次のとおりです。

図2:受け取る JSON の項目と、通知のタイトル・サブタイトル・本文の対応
terminal-notifier を呼ぶ部分は次のとおりです。
/opt/homebrew/bin/terminal-notifier \
-title "$title" \
-subtitle "$project · $session" \
-message "$body" \
-sound "$sound" \
-group "claude-code-$session" \
-execute "open -a Zed $cwd"
(※ 公式ドキュメントでは、会話の記録ファイルは非同期に書き込まれ、フックが動いた時点では最新のメッセージがまだ入っていない場合があるため、最終的な回答のテキストが必要なフックでは Stop の last_assistant_message を使うよう案内されています。-group をセッションごとにしているので、同じセッションの通知は最新の1件に置き換わります。-execute のコマンドはドットファイルを読み込まない /bin/sh -c で実行されるため、コマンドはフルパスで書いています。)
参考:フックリファレンス|Claude Code Docs、julienXX/terminal-notifier|GitHub
4-3. フックに登録する
~/.claude/settings.json の hooks に、2つのイベントを追加します。引数で本文の初期値と通知音を渡しています。
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command",
"command": "bash ~/.claude/hooks/notify.sh '回答が完了しました' Glass" }] }
],
"Notification": [
{ "hooks": [{ "type": "command",
"command": "bash ~/.claude/hooks/notify.sh '確認待ちです' Ping" }] }
]
}
}
(※ 条件を絞る matcher を省略すると、Notification はすべての通知タイプで動きます。権限の確認待ちだけに絞りたい場合は "matcher": "permission_prompt" を指定します。音の名前は /System/Library/Sounds にあるファイル名から選べます。)
参考:hooks でアクションを自動化する|Claude Code Docs
4-4. 通知をクリックするまで残す
初期設定のままだと、通知はしばらくすると自動で消えます。クリックするまで画面に残したい場合は、macOS の[システム設定]→[通知]で terminal-notifier を選び、通知スタイルを変更します。
- 一時的:しばらくすると通知が消えます
- 持続的:閉じるまで通知が画面に残ります
(※ 表記は Apple の公式ヘルプに合わせています。この設定はアプリ単位のため、通知の種類ごとには選べません。筆者の環境(macOS 26.7)では、閉じるまで残るスタイルを選んで動作を確認しました。)
4-5. 動作を確かめる
設定が終わったら、実際に動かしてみます。
- Claude Code で何か質問し、回答が終わるのを待ちます。
- 「✅ 回答完了」の通知が出て、サブタイトルにプロジェクト名が出ることを確かめます。
- 別のアプリに切り替えてから通知をクリックし、エディタ(今回は Zed)のウィンドウが前面に出ることを確かめます。
(※ うまく動かないときは、Claude Code 上で /hooks を開き、フックが登録されているか確認してください。設定ファイルの変更は通常自動で反映されますが、反映されない場合はセッションを再起動します。通知自体が出ないときは、terminal-notifier -diagnose で通知の許可状態などを確認できます。)
5. 実現できたこと
実際に出た通知です。まずは「回答完了」の通知で、本文に直前の回答の冒頭が表示されています。

筆者の環境で出た「回答完了」の通知(プロジェクト名はぼかしています)
次は「確認待ち」の通知です。サブタイトルにプロジェクト名とセッション ID、本文に Claude Code からのメッセージが表示されています。

筆者の環境で出た「確認待ち」の通知(プロジェクト名と背景はぼかしています)
導入してみてよかったと感じている点は、次の2つです。
- どの作業が終わったかが、通知だけでわかるようになった
サブタイトルのプロジェクト名と本文の冒頭を見れば、ウィンドウを開かなくても状況を判断しやすくなりました。 - 通知をクリックして、作業中のプロジェクトに戻れるようになった
通知が消えずに残るので、少し席を外していても見落としにくくなりました。
6. 残る課題
戻れるのはアプリのウィンドウまでで、ターミナルのタブまでは選べません。
今回の方法は、open -a Zed でプロジェクトのフォルダを開き直す仕組みです。同じプロジェクトで複数のセッション(タブ)を動かしている場合は、通知のセッション ID を見てどのタブか判断する必要があります。
(※ 通知の左に出るアイコンは terminal-notifier のものになります。公式の README では、アイコンを変えたい場合はアプリのコピーを自分でビルドする方法が紹介されていますが、今回は手間を考えて見送りました。)
7. まとめ
公式ガイドにある osascript の例は手軽ですが、クリックしたときの動作までは指定できません。フックの入力データと terminal-notifier を組み合わせると、どのプロジェクトの通知かがわかります。さらに、クリックして元の画面に戻れる仕組みまで作れました。
Claude Code を複数並行して動かしていて、完了を見落としがちな方の参考になれば幸いです。
8. 参考資料
本記事の内容は、以下の公式情報で確認しました(2026年10月28日時点)。
Claude Code
terminal-notifier・Homebrew
Apple









