はじめに:なぜ通知音設定が重要なのか
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 標準通知(推奨)
最も安定性が高く、設定も簡単な方法です。
設定手順
- hooks 設定画面を開く
# Claude Code のセッション内で
/hooks
- Stop イベントを選択
- メニューから「4. Stop」を選択
- 「+ Add new hook…」をクリック
- 通知コマンドを設定
osascript -e 'display notification "タスクが完了しました" with title "Claude Code" subtitle "処理終了" sound name "Hero"'
- 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 を使った合成音生成
より細かい音の制御が可能な方法です。
セットアップ
- SoX のインストール
brew install sox
brew install lame # MP3サポート用
- permissions 設定
# ~/.claude/settings.json
{
"permissions": {
"allow": [
"Bash(play:*)"
]
}
}
- 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 を使った高機能通知
最も高機能で見た目も美しい通知が可能です。
インストールと設定
- terminal-notifier のインストール
# Homebrewでインストール(推奨)
brew install terminal-notifier
# RubyGemsでインストール
gem install terminal-notifier
- 基本的な使い方
# シンプルな通知
terminal-notifier -message "タスクが完了しました"
# タイトル付き通知
terminal-notifier -title "Claude Code" -message "処理が完了しました"
# サウンド付き通知
terminal-notifier -title "作業完了" -message "すべての処理が終了しました" -sound default
- 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 が実行されない
確認事項
- settings.json の構文チェック
# JSONの構文エラーがないか確認
cat ~/.claude/settings.json | jq .
- 権限設定の確認
# 実行権限があるかチェック
ls -la ~/.claude/notify-script.sh
- ログの確認
# 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回程度発生していたのがゼロに
定性的な効果
- ストレス軽減:画面監視から解放
- 集中力向上:他の作業に没頭できる
- 達成感の向上:心地よい通知音で満足度アップ
特に効果的だった場面
- 長時間のコード生成や解析処理
- データベースマイグレーション作成(平均15分)
- 大規模リファクタリング(平均25分)
- セキュリティ監査レポート作成(平均35分)
- バックグラウンド処理中の並行作業
- テスト実行中のドキュメント作成
- ビルド中のコードレビュー
- デプロイ中の次タスクの準備
- チーム開発でのコミュニケーション向上
- ペアプログラミング時の作業完了共有
- レビュー完了の即座な通知
- 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 機能は、単なる通知以上の価値を提供します。開発ワークフローの自動化、品質向上、チーム協業の促進など、可能性は無限大です。
ぜひこの記事を参考に、あなたも効率的な開発環境を構築してみてください。質問やより高度な設定について知りたい方は、コメントでお聞かせください!