Claude Codeのタスクが完了したら通知を受け取る
背景
Claude Codeを使ったコーディングやドキュメンテーションはとても便利になりました。
プロンプトを投げて、Claude君が考えている間に自分は調べごと…とターミナルから離れているとClaude君に仕事を任せたことをすっかり忘れて自分の作業に夢中になって数十分経っている…といく経験を幾度となくしてきました。
Claude Codeに依頼したタスクが完了したら、通知を受け取れる仕組みを試してみました。
ゴール
Claude Codeのタスクが完了したら、デスクトップに通知音とともに通知を表示させます。

環境
MacOSのみを想定しています。
執筆時: Tahoe Version 26.1
やること
Ckaude Code Hooksを設定し、タスク完了時に起動させ、MacOSに標準搭載されているosascriptコマンドを実行します。
手順
claudeを起動して、/hooksでHooksの設定を開きます。

STOPを選択し、+ Add new hook…を選択します。

Command に以下を設定します。
osascript -e 'display notification "Task Completed" with title "Claude Code" subtitle "" sound name "Ping"'

" " で囲まれている部分は変数として設定が可能です。
以下のようなイメージで登録しています。
title = "Claude Code"
display_notification = "Task Completed"
subtitle = "" (なし)
sound_name = "Ping"
sound name はMacOSに標準で設定されている以下から選択可能です。
Basso / Blow / Bottle / Frog / Funk / Glass / Hero / Morse / Ping / Pop / Purr / Sosumi / Submarine / Tink
効率の良い音の確認方法が見つけられなかったので、良い方法があればコメントなどで教えてくださいmm
いくつか試しましたが、一旦無難そうな "Ping" に落ち着いています。
次に、設定ファイルを指定します。
個人利用であれば User setings を選択することでグローバルに適用されます。

設定後はescキーで戻ることで設定を確認できます。
1 hookと表示されているので、先ほどのHookが設定できていることがわかります。

最後に、設定を確認します。
Claude Codeでテストをします。
タスク完了後に以下のように、"Claude Code Task Completed" と設定通りの通知が通知音とともにデスクトップに表示されれば設定完了です。(通知の下はテストしたターミナルのサンプルです。)

補足
設定可能なHooksは公式によると以下。
| フック名 | 実行タイミング | 備考 |
|---|---|---|
| PreToolUse | ツール呼び出しの前 | ブロック可能 |
| PermissionRequest | 権限ダイアログが表示されたとき | 許可または拒否可能 |
| PostToolUse | ツール呼び出しの完了後 | - |
| UserPromptSubmit | ユーザーがプロンプトを送信したとき | Claude が処理する前 |
| Notification | Claude Code が通知を送信するとき | - |
| Stop | Claude Code が応答を終了するとき | - |
| SubagentStop | サブエージェントタスクが完了したとき | - |
| PreCompact | コンパクト操作を実行しようとする前 | - |
| SessionStart | 新しいセッションを開始するか、既存のセッションを再開するとき | - |
| SessionEnd | Claude Code セッションが終了するとき | - |
Notificationも同様に設定することで、ユーザーの許可やアクションが求められる時にも通知を飛ばせると予想しているが、未検証。
参考
Claude Code Docs - Claude Code フックの使い始め
(余談)Cursorの通知機能
Cursorでは通知機能自体があり、タスク完了時に完了音を出すことが可能。
Cursor Settings > Notifications にて "Completion Sound"をオンにするのみ。

Discussion