🪝

Claude Codeのhooksで応答停止・ツール使用の確認時のみ通知を受け取る方法

に公開

はじめに

Claude Code 1.0.38で導入されたhooks機能を使って、応答停止とツール使用の確認時のみ通知を受け取る方法を解説します。

  • 応答停止時

応答停止時

  • ツール使用の確認時

ツール使用の確認時

hooks登場前は~/.claude/projects/以下のファイル変更を監視して通知を行う機能を自作していたのですが、厳密な通知制御ができず意図しない通知が送られてしまう問題に悩まされていました。公式でhooks対応が入ったことで、通知を厳密に制御できるようになりました。

hooks機能とは

hooksはClaude Codeの特定のイベントに対してカスタムコマンドを実行できる機能です。

今回使用したHook Event

  • Stop: Claude Codeの応答が停止した場合のイベント(作業完了時)
  • Notification: Claude Codeが通知を送信した場合のイベント(ツール使用確認時)

設定手順

手順1: 設定ファイルの作成

まず、Claude Codeの設定ディレクトリを作成し、settings.jsonファイルを作成します:

# Claude Codeの設定ディレクトリを作成
mkdir -p ~/.claude

~/.claude/settings.jsonに以下の設定を追加します:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command", 
            "command": "~/.claude/notify-me.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command", 
            "command": "~/.claude/notify-me.sh"
          }
        ]
      }
    ]
  }
}

手順 2: 必要なツールのインストール

通知スクリプトではjqコマンドを使用するため、事前にインストールしておきます:

brew install jq

手順 3: 通知スクリプトの作成

  • PCの前で作業をしている場合はローカル通知
  • リモートから操作している場合はWebhookでの通知

というように状況に応じて通知方法を切り替えたかったので、以下のような ~/.claude/notify-me.shを作成しました。

LOCAL_SOUND_NAMEWEBHOOK_URLは適宜変更してください。

#!/bin/bash

# 設定
# 利用可能サウンド: Basso, Blow, Bottle, Frog, Funk, Glass, Hero, Morse, Ping, Pop, Purr, Sosumi, Submarine, Tink
LOCAL_SOUND_NAME="default"
WEBHOOK_URL="https://webhook.example.com/messages"

# メッセージの決定
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

# 設定読み込み
NOTIFICATION_TYPE="webhook"
[ -f "$HOME/.claude/notify-me-config" ] && source "$HOME/.claude/notify-me-config"

# 通知送信
case "$NOTIFICATION_TYPE" in
    "local")
        osascript -e "display notification \"$MESSAGE\" with title \"Claude Code\" sound name \"$LOCAL_SOUND_NAME\""
        echo "[ローカル通知] $MESSAGE"
        ;;
    "webhook")
        curl -d "$MESSAGE" "$WEBHOOK_URL"
        echo "[Webhook通知] $MESSAGE"
        ;;
    *)
        echo "エラー: 不明な通知タイプ: $NOTIFICATION_TYPE" >&2
        exit 1
        ;;
esac

実行権限を付与:

chmod +x ~/.claude/notify-me.sh

補足:通知方法の切り替え

私はRaycastを利用しているので、Scripts Commandsを作成して通知方法をパッと切り替えられるようにしています。

通知方法の切り替え

Raycast Scripts Commandsを使った通知方法切り替えスクリプト
#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch Claude Code Notification Method
# @raycast.mode silent
# @raycast.packageName Claude Code Utils

# Optional parameters:
# @raycast.icon 🔔
# @raycast.argument1 { "type": "dropdown", "placeholder": "通知方法", "data": [ {"title": "Webhook", "value": "webhook"}, {"title": "Local", "value": "local"} ] }

# 設定ファイルのパス
CONFIG_FILE="$HOME/.claude/notify-me-config"
CONFIG_DIR="$HOME/.claude"

# ディレクトリが存在しない場合は作成
if [ ! -d "$CONFIG_DIR" ]; then
    mkdir -p "$CONFIG_DIR"
fi

# 選択された通知タイプ
NOTIFICATION_TYPE="$1"

# 設定ファイルに保存
echo "NOTIFICATION_TYPE=\"$NOTIFICATION_TYPE\"" > "$CONFIG_FILE"

# 確認メッセージ
case "$NOTIFICATION_TYPE" in
    "local")
        echo "✅ ローカル通知に切り替えました"
        ;;
    "webhook")
        echo "✅ Webhook通知に切り替えました"
        ;;
esac

トラブルシューティング

通知が送信されない場合

ローカル通知が表示されない(macOS): システム環境設定の通知設定を確認

スクリプトエディタを一度も起動したことがない場合は、「アプリケーション」→「ユーティリティ」→「スクリプトエディタ.app」を起動してください。
新規スクリプト作成画面に移動すると、通知バーが表示されるので通知を許可するようにしてください。

動作確認方法

設定が完了したら、以下の方法で動作確認できます:

# スクリプトを直接実行してテスト
~/.claude/notify-me.sh "テストメッセージ"

まとめ

hooks機能により、応答停止とツール使用の確認時のみ通知を受け取ることができるようになり快適です!これで自作ツールの出番はなくなりました。

今回はStopNotificationの2つのイベントを使用しましたが、今後は他のhooksも活用していきたいと思います。

Discussion