WHITEPLUS TechBlog

株式会社ホワイトプラスのエンジニアによる開発ブログです。

Claude CodeのHooksで入力待ち・完了を通知する方法

こんにちは!
株式会社ホワイトプラスのエンジニアリング部 CX開発Gのyumeです。

Claude Codeの応答待ち中に別作業へ移っても、ベストタイミングで戻れるようにしたくて通知音を鳴らす設定を入れてみました。

本記事では、Claude CodeのHooks(Stopイベント)を使って通知音を鳴らす手順と、うまく鳴らないときの確認ポイントをまとめます。


前提(環境)

  • macOS Sequoia 15.5
    • 手順に記載されているコマンドはMac用です
    • WindowsやLinuxなどをお使いの場合は適宜書き換えてください
  • Claude Code 2.1.14
  • Cursor 2.3.34

Claude Codeの入力待ち・完了で通知音を鳴らす設定

背景

Claude Codeを使っていると、応答待ちの間に画面を他のブラウザやSlackに切り替えて作業を進めることが多いのですが、タイミングが合わずに非効率な動きをしていると感じることがありました。

そこで、Claude Codeが止まったタイミングで通知音を鳴らすカスタマイズを入れて、ウィンドウを切り替えていてもすぐに気づけるようにしました。

実現方法

調べると claude config set --global preferredNotifChannel terminal_bell という設定方法が出てきたのですが、サポートが終了しているのか設定できず、公式資料も見つけられませんでした。

そのため今回はClaude Codeの Hooks を使って設定を行います。
特定のイベントが発動したタイミングで任意のコマンドを実行できる機能です。

Stopイベント(処理が止まったタイミング)をフックして、macOS標準のサウンドを afplay で鳴らすように設定しました。

Stop以外のHook イベントはClaude Code Docsから確認できます。

設定手順

1. afplay コマンドで音が鳴るか確認する

まずターミナルで以下を実行し、音が鳴ることを確認しておきます。

afplay /System/Library/Sounds/Glass.aiff

音はお好みで、他システムの通知音と被らないものを選ぶとよいと思います。

$ ls -1 /System/Library/Sounds/
Basso.aiff
Blow.aiff
Bottle.aiff
Frog.aiff
Funk.aiff
Glass.aiff
Hero.aiff
Morse.aiff
Ping.aiff
Pop.aiff
Purr.aiff
Sosumi.aiff
Submarine.aiff
Tink.aiff

2. /hooks で Stop にコマンドを設定する

  1. /hooks を実行 Claude Codeに `/hooks` を入力しているスクリーンショット
  2. Stop - Right before Claude concludes its response を選択 Claude CodeのHooksで表示されているイベント一覧から `Stop` を選択しているスクリーンショット
  3. + Add new hook… を選択 Claude CodeのHooksでStopに対して `Add new hook...` を選択しているスクリーンショット
  4. コマンド afplay /System/Library/Sounds/Glass.aiff を入力 Claude CodeのHook追加でコマンドを指定しているスクリーンショット

~/.claude/settings.json に以下のような設定が入ります。

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "afplay /System/Library/Sounds/Glass.aiff"
          }
        ]
      }
    ]
  }
}

3. Claude Codeを再起動する

設定を反映させるため、Claude Codeを再起動します。

以降、応答が止まったタイミングで通知音が鳴ってくれるので、Claude Codeの状態を気にせずに別の作業に移れるようになりました 🎉

Claude Codeがユーザーの許可を求めて止まる際も鳴ってくれます。

トラブルシューティング:もし音が鳴らなかったら

私はCursorエディタ上のターミナルでClaude Codeを使用していますが、上記の手順でスムーズに設定が完了しました。

もしVSCode/Cursorをお使いの方で音が鳴らない場合は、IDEの設定からterminalBellsoundon にしてみると解決するかもしれません。

  1. 設定を開く (⌘ + ,)
  2. 検索欄に terminalBell と入力する
  3. accessibility.signals.terminalBellsoundon にする

Cursorの設定でTerminal Bellのsound項目を表示しているスクリーンショット

そのほか、以下も確認してみてください。

  • Claude Codeは再起動しましたか?
  • 音量が0やミュートになっていませんか?
  • 未装着のイヤホンに接続されていませんか?
  • 集中モードがオンになっていませんか?

応用:音だけでなく通知も表示する

音だけでは気付けなかったり、作業環境的に音を出せないということもあるかもしれません。

音だけでなく以下のような通知を表示するようにすることもできます。 Claude Codeの完了通知

この通知は osascript を使用するため、スクリプトエディタからの通知扱いとなります。
そのため、スクリプトエディタからの通知を許可する必要があります。
※ 許可済みの場合、下記手順の1, 2は不要です。

  1. スクリプトエディタを起動して、適当な通知スクリプトを実行 スクリプトエディタのスクリーンショットで、「新規書類」ボタンをピンクの枠で囲っています

     display notification "test" with title "TEST"
    

    スクリプトエディタに `display notification "test" with title "TEST"` を入力し、実行ボタンにカーソルを当てているスクリーンショット

  2. "スクリプトエディタの通知" が表示されるので、「オプション」から「許可」を選択 スクリプトエディタの通知の「オプション>許可」を表示しているスクリーンショット
  3. Claude CodeのHooksに以下のコマンドを設定

     osascript -e 'display notification \"完了しました!\" with title \"Claude Code\" sound name \"Glass\"'
    
  4. Claude Codeを再起動

これで音だけでなく通知も表示されるようになりました 🎉

まとめ

Claude CodeのHooksを活用すると、特定のタイミングで指定したコマンドを実行することができました。

今回は通知というシンプルな動作を設定しましたが、「ファイル編集後にフォーマッターをかける」「セッション終了時にセッションのサマリーを作成する」など、ほかにも活用できそうです。

さいごに

ホワイトプラスでは、ビジョンバリューに共感していただけるエンジニアを募集しています!
ネットクリーニングの「リネット」など「生活領域×テクノロジー」で事業を展開している会社です。

どんな会社か気になった方は、オウンドメディア「ホワプラSTYLE」をぜひご覧ください。
エンジニアの方向けのエントランスブック「WHITEPLUS Entrance Book for Engineer」もございます。

オンラインでカジュアル面談もできますので、ぜひお気軽にお問い合わせください!

www.wh-plus.co.jp