Claude Code の hooks で Mac 標準の通知音を設定する完全ガイド:開発効率を劇的に向上させる実践的手法

  1. はじめに:なぜ通知音設定が重要なのか
  2. Claude Code hooks の基礎知識
    1. hooks とは何か
    2. 4つの hooks イベントタイプ
      1. 1. PreToolUse
      2. 2. PostToolUse
      3. 3. Notification
      4. 4. Stop
  3. Mac での通知音設定:3つのアプローチ
    1. 方法1:osascript を使った macOS 標準通知(推奨)
      1. 設定手順
      2. 利用可能な macOS 標準サウンド
    2. 方法2:SoX を使った合成音生成
      1. セットアップ
      2. カスタマイズ例
    3. 方法3:terminal-notifier を使った高機能通知
      1. インストールと設定
  4. 実践的な設定方法:段階的アプローチ
    1. ステップ1:基本的な通知設定
    2. ステップ2:状況別通知の設定
      1. ~/.claude/notify-script.sh の作成
      2. 権限設定とhooks登録
    3. ステップ3:プロジェクト別カスタマイズ
      1. プロジェクト設定例:Webアプリ開発
      2. プロジェクト設定例:データ分析
  5. トラブルシューティング:よくある問題と解決策
    1. 問題1:通知音が鳴らない
      1. 原因と対策
    2. 問題2:VSCode ターミナルで音が出ない
      1. 対策
    3. 問題3:hooks が実行されない
      1. 確認事項
  6. 応用設定:さらなる活用方法
    1. 1. Slack 連携通知
    2. 2. 時間帯別通知制御
    3. 3. 処理時間による通知変更
  7. セキュリティ考慮事項
    1. 1. 入力検証の徹底
    2. 2. パストラバーサル対策
    3. 3. 絶対パスの使用
  8. パフォーマンス最適化
    1. 1. 軽量なスクリプトの作成
    2. 2. バックグラウンド実行
  9. チーム開発での活用
    1. 1. 統一設定の共有
    2. 2. 個人設定の分離
  10. まとめ:開発効率向上の実感
    1. 定量的な効果
    2. 定性的な効果
    3. 特に効果的だった場面
  11. 次のステップ:さらなる発展
    1. 1. AI 駆動の通知最適化
    2. 2. 統合開発環境との連携
    3. 3. メトリクス収集と分析

はじめに:なぜ通知音設定が重要なのか

Claude Code を使い始めて3ヶ月が経ちました。最初は画面に張り付いて作業の進行を監視していましたが、長時間の処理やバックグラウンドでの実行時に、処理完了のタイミングを見逃すことが頻繁にありました。

特にコードの自動生成やファイル解析、テスト実行などで数分から数十分かかる処理では、他の作業に集中していると完了に気づかず、貴重な時間を無駄にしてしまうことが多々ありました。

そこで導入したのが Claude Code の hooks 機能を使った通知音システム です。この設定により、処理完了と同時に心地よい通知音で知らせてくれるようになり、開発効率が格段に向上しました。

本記事では、実際に私が試行錯誤して構築した設定方法から、トラブルシューティング、さらなる応用例まで、実体験に基づいた完全ガイドとして解説します。

Claude Code hooks の基礎知識

hooks とは何か

Claude Code の hooks(フック)機能 は、AI開発ツールのライフサイクルの特定のタイミングで、ユーザー定義のシェルスクリプトを自動実行する仕組みです。

LLMの判断に依存せず、確実にアクションを実行できるのが最大の特徴で、以下のような場面で威力を発揮します:

  • 処理完了の自動通知
  • コードフォーマットの自動実行
  • 危険なコマンドの事前チェック
  • ログの自動記録
  • チーム規約の強制適用

4つの hooks イベントタイプ

Claude Code では、用途に応じて4つのイベントタイプが用意されています:

1. PreToolUse

  • 実行タイミング:Claudeがツールパラメータ作成後、ツール実行前
  • 用途:危険なコマンドのブロック、事前チェック
  • 具体例rm -rf コマンドの実行前に確認ダイアログを表示

2. PostToolUse

  • 実行タイミング:ツール実行完了後
  • 用途:コードフォーマット、ログ記録
  • 具体例:ファイル編集後のPrettier自動実行

3. Notification

  • 実行タイミング:Claude Codeが通知を送信した場合
  • 用途:ユーザー確認待ち状態の通知
  • 具体例:ツール使用の許可を求める際の音声通知

4. Stop

  • 実行タイミング:Claude Codeの応答が停止した場合
  • 用途:処理完了通知
  • 具体例今回のメインテーマである通知音設定

Mac での通知音設定:3つのアプローチ

実際に検証した結果、Macで通知音を設定する方法は大きく分けて3つあります。それぞれの特徴とメリット・デメリットを詳しく解説します。

方法1:osascript を使った macOS 標準通知(推奨)

最も安定性が高く、設定も簡単な方法です。

設定手順

  1. hooks 設定画面を開く
# Claude Code のセッション内で
/hooks
  1. Stop イベントを選択
    • メニューから「4. Stop」を選択
    • 「+ Add new hook…」をクリック
  2. 通知コマンドを設定
osascript -e 'display notification "タスクが完了しました" with title "Claude Code" subtitle "処理終了" sound name "Hero"'
  1. Notification イベントも設定(オプション)
osascript -e 'display notification "Claude Codeが許可を求めています" with title "Claude Code" subtitle "確認待ち" sound name "Glass"'

利用可能な macOS 標準サウンド

macOS には以下の標準通知音が用意されており、sound name で指定できます:

  • Basso:低音の警告音
  • Blow:息を吹くような音
  • Bottle:ポップな音
  • Frog:カエルのような音
  • Funk:ファンキーな音
  • Glass:ガラスを叩く音
  • Hero:ヒーロー的な音
  • Morse:モールス信号風
  • Ping:高音のピン音
  • Pop:ポップ音
  • Purr:猫の鳴き声風
  • Sosumi:クラシックなMac音
  • Submarine:潜水艦のソナー音
  • Tink:金属音

実際に使ってみて、私のお気に入りは:

  • 作業完了:「Hero」(達成感がある)
  • 確認待ち:「Glass」(注意を引くが邪魔にならない)
  • エラー通知:「Basso」(警告らしい重低音)

方法2:SoX を使った合成音生成

より細かい音の制御が可能な方法です。

セットアップ

  1. SoX のインストール
brew install sox
brew install lame  # MP3サポート用
  1. permissions 設定
# ~/.claude/settings.json
{
  "permissions": {
    "allow": [
      "Bash(play:*)"
    ]
  }
}
  1. CLAUDE.md への設定追加
# ~/.claude/CLAUDE.md または プロジェクトの CLAUDE.md
- YOU MUST: タスク完了またはユーザーにメッセージを返すときに最後に一度だけ `play -n synth 0.5 sine 1000-100 vol 0.2` コマンドを実行して通知する

カスタマイズ例

# 短い高音の通知音
play -n synth 0.2 sine 1500 vol 0.3

# 心地よいメロディー
play -n synth 0.3 sine 800 vol 0.2 : synth 0.3 sine 1000 vol 0.2 delay 0.3

# Mac標準音の再生
play /System/Library/Sounds/Funk.aiff vol 2

方法3:terminal-notifier を使った高機能通知

最も高機能で見た目も美しい通知が可能です。

インストールと設定

  1. terminal-notifier のインストール
# Homebrewでインストール(推奨)
brew install terminal-notifier

# RubyGemsでインストール
gem install terminal-notifier
  1. 基本的な使い方
# シンプルな通知
terminal-notifier -message "タスクが完了しました"

# タイトル付き通知
terminal-notifier -title "Claude Code" -message "処理が完了しました"

# サウンド付き通知
terminal-notifier -title "作業完了" -message "すべての処理が終了しました" -sound default
  1. hooks での設定例
terminal-notifier -title "Claude Code" -subtitle "処理完了" -message "タスクが正常に完了しました" -sound Hero

実践的な設定方法:段階的アプローチ

ステップ1:基本的な通知設定

まずは最もシンプルな設定から始めましょう。

# Claude Code のセッション内で
/hooks

Stop イベントを選択して、以下のコマンドを設定:

osascript -e 'display notification "完了" with title "Claude Code" sound name "Ping"'

ステップ2:状況別通知の設定

処理の種類に応じて異なる通知音を設定します。

~/.claude/notify-script.sh の作成

#!/bin/bash

# 設定
LOCAL_SOUND_NAME="Hero"
WEBHOOK_URL="https://your-webhook-url.com/messages"  # Slack等への通知用

# メッセージの決定
if [ -t 0 ]; then
    [ $# -eq 0 ] && { echo "使い方: $0 \"メッセージ\""; exit 1; }
    MESSAGE="$1"
else
    HOOK_INPUT=$(cat)
    TOOL_MESSAGE=$(echo "$HOOK_INPUT" | jq -r '.message // "N/A"')
    MESSAGE="${1:-$([ "$TOOL_MESSAGE" != "N/A" ] && echo "⚙️ $TOOL_MESSAGE" || echo "👍 Done!")}"
fi

# ローカル通知の実行
osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\" sound name \"$LOCAL_SOUND_NAME\""

# Webhook通知(オプション)
if [ -n "$WEBHOOK_URL" ]; then
    curl -X POST "$WEBHOOK_URL" \
         -H "Content-Type: application/json" \
         -d "{\"text\": \"$MESSAGE\"}" \
         --silent > /dev/null
fi

権限設定とhooks登録

# スクリプトに実行権限を付与
chmod +x ~/.claude/notify-script.sh

# hooks に登録
# Stop イベント: ~/.claude/notify-script.sh
# Notification イベント: ~/.claude/notify-script.sh "確認待ち"

ステップ3:プロジェクト別カスタマイズ

プロジェクトの性質に応じて通知を調整します。

プロジェクト設定例:Webアプリ開発

// .claude/settings.local.json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Webアプリの処理が完了しました\" with title \"Development\" sound name \"Glass\"'"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command", 
            "command": "npm run format && git add -A"
          }
        ]
      }
    ]
  }
}

プロジェクト設定例:データ分析

// .claude/settings.local.json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "terminal-notifier -title 'データ分析' -message '解析が完了しました' -sound Submarine"
          }
        ]
      }
    ]
  }
}

トラブルシューティング:よくある問題と解決策

問題1:通知音が鳴らない

原因と対策

1. スクリプトエディタの権限不足

# 解決方法
# 1. 「アプリケーション」→「ユーティリティ」→「スクリプトエディタ.app」を起動
# 2. 通知許可のダイアログが表示されるので許可
# 3. システム環境設定 → 通知 → スクリプトエディタで通知を有効化

2. システムの通知設定

# 確認方法
# システム設定 → 通知 → Claude Code(またはターミナル)の通知設定を確認
# 「通知を許可」がオンになっているかチェック

3. 集中モードの影響

# 確認方法
# メニューバー → コントロールセンター → 集中モードがオフになっているかチェック

問題2:VSCode ターミナルで音が出ない

対策

// VSCode settings.json に追加
{
  "accessibility.signals.terminalBell": {
    "sound": "on"
  }
}

また、Claude Code の設定も確認:

claude config set --global preferredNotifChannel terminal_bell

問題3:hooks が実行されない

確認事項

  1. settings.json の構文チェック
# JSONの構文エラーがないか確認
cat ~/.claude/settings.json | jq .
  1. 権限設定の確認
# 実行権限があるかチェック
ls -la ~/.claude/notify-script.sh
  1. ログの確認
# hooks 実行ログの確認
tail -f ~/.claude/projects/PROJECT_NAME/logs/

応用設定:さらなる活用方法

1. Slack 連携通知

#!/bin/bash
# ~/.claude/slack-notify.sh

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
MESSAGE="${1:-Claude Code のタスクが完了しました}"

# Slack に通知
curl -X POST "$SLACK_WEBHOOK_URL" \
     -H "Content-Type: application/json" \
     -d "{\"text\": \"$MESSAGE\", \"username\": \"Claude Code\", \"icon_emoji\": \": robot_face:\"}"

# ローカル通知も実行
osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\" sound name \"Hero\""

2. 時間帯別通知制御

#!/bin/bash
# ~/.claude/time-aware-notify.sh

HOUR=$(date +%H)
MESSAGE="${1:-処理が完了しました}"

# 夜間は音を小さく、日中は通常音量
if [ "$HOUR" -ge 22 ] || [ "$HOUR" -le 7 ]; then
    # 夜間:静かな通知
    osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\" sound name \"Tink\""
else
    # 日中:通常通知
    osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\" sound name \"Hero\""
fi

3. 処理時間による通知変更

#!/bin/bash
# ~/.claude/duration-notify.sh

START_TIME_FILE="/tmp/claude_start_time"
CURRENT_TIME=$(date +%s)

if [ -f "$START_TIME_FILE" ]; then
    START_TIME=$(cat "$START_TIME_FILE")
    DURATION=$((CURRENT_TIME - START_TIME))
    
    if [ "$DURATION" -gt 300 ]; then  # 5分以上
        # 長時間処理:特別な通知音
        osascript -e 'display notification "長時間処理が完了しました" with title "Claude Code" sound name "Submarine"'
    else
        # 短時間処理:通常通知
        osascript -e 'display notification "処理が完了しました" with title "Claude Code" sound name "Glass"'
    fi
    
    rm "$START_TIME_FILE"
else
    echo "$CURRENT_TIME" > "$START_TIME_FILE"
fi

セキュリティ考慮事項

hooks 機能を使用する際は、以下のセキュリティ原則を必ず守ってください:

1. 入力検証の徹底

#!/bin/bash
# 安全なスクリプト例

# 入力値の検証
if [[ "$1" =~ [^a-zA-Z0-9\ \-\_] ]]; then
    echo "不正な文字が含まれています"
    exit 1
fi

MESSAGE="$1"
osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\""

2. パストラバーサル対策

# 危険な例(やってはいけない)
cat "$USER_INPUT"  # ユーザー入力をそのまま使用

# 安全な例
SAFE_PATH=$(basename "$USER_INPUT")
cat "/safe/directory/$SAFE_PATH"

3. 絶対パスの使用

# hooks 設定では絶対パスを使用
{
  "type": "command",
  "command": "/usr/local/bin/my-script.sh"  # 相対パスは避ける
}

パフォーマンス最適化

1. 軽量なスクリプトの作成

#!/bin/bash
# 高速な通知スクリプト

# 重い処理は避ける
# osascript のみを使用してシンプルに
osascript -e 'display notification "完了" with title "Claude Code" sound name "Ping"' &

2. バックグラウンド実行

# hooks 設定でバックグラウンド実行
{
  "type": "command", 
  "command": "~/.claude/notify.sh &"  # & を付けてバックグラウンド実行
}

チーム開発での活用

1. 統一設定の共有

// プロジェクトの .claude/settings.json(Git管理対象)
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npm run lint:fix && npm run format"
          }
        ]
      }
    ]
  }
}

2. 個人設定の分離

// ~/.claude/settings.json(個人設定)
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/personal-notify.sh"
          }
        ]
      }
    ]
  }
}

まとめ:開発効率向上の実感

3ヶ月間、Claude Code の hooks 機能を活用して通知音システムを運用した結果、以下のような効果を実感しています:

定量的な効果

  • 待機時間の削減:平均で1日30分の時間節約
  • マルチタスク効率向上:他作業との並行実行が可能に
  • 処理完了の見逃し:月20回程度発生していたのがゼロに

定性的な効果

  • ストレス軽減:画面監視から解放
  • 集中力向上:他の作業に没頭できる
  • 達成感の向上:心地よい通知音で満足度アップ

特に効果的だった場面

  1. 長時間のコード生成や解析処理
    • データベースマイグレーション作成(平均15分)
    • 大規模リファクタリング(平均25分)
    • セキュリティ監査レポート作成(平均35分)
  2. バックグラウンド処理中の並行作業
    • テスト実行中のドキュメント作成
    • ビルド中のコードレビュー
    • デプロイ中の次タスクの準備
  3. チーム開発でのコミュニケーション向上
    • ペアプログラミング時の作業完了共有
    • レビュー完了の即座な通知
    • CI/CD パイプライン状況の把握

次のステップ:さらなる発展

本記事の設定をマスターしたら、以下の発展的な活用も検討してみてください:

1. AI 駆動の通知最適化

# 処理内容に応じた動的通知音選択
if echo "$TASK_DESCRIPTION" | grep -i "test"; then
    SOUND="Tink"  # テスト関連は軽い音
elif echo "$TASK_DESCRIPTION" | grep -i "deploy"; then
    SOUND="Hero"  # デプロイは重要な音
else
    SOUND="Glass"  # デフォルト
fi

2. 統合開発環境との連携

  • VS Code 拡張機能との連携
  • Figma プラグインとの協調
  • GitHub Actions との同期

3. メトリクス収集と分析

# 処理時間とタスク内容のログ記録
echo "$(date),${DURATION},${TASK_TYPE}" >> ~/.claude/metrics.csv

Claude Code の hooks 機能は、単なる通知以上の価値を提供します。開発ワークフローの自動化、品質向上、チーム協業の促進など、可能性は無限大です。

ぜひこの記事を参考に、あなたも効率的な開発環境を構築してみてください。質問やより高度な設定について知りたい方は、コメントでお聞かせください!