Claude Code の実行許可を macOS 通知で行う

背景

Claude Code を使っていると、ツールの実行許可を求められる場面があります。Bash コマンドの実行やファイルの読み書き、Web からの情報取得など、さまざまな操作で許可が必要です。

普段は画面を見ながら作業しているので問題ありませんが、長い処理を待っている間に別のアプリを触ることがあります。そんなとき、許可を求めるプロンプトが表示されたまま Claude Code が待機していると、気づくまで処理が進みません。

そこで macOS のネイティブ通知を使って許可・拒否できるようにしてみました。

macOS 通知での許可確認

Claude Code の hooks 機能

Claude Code には hooks という機能があります。特定のイベントが発生したときにカスタムスクリプトを実行できる仕組みです。

その中でも PermissionRequest イベントは、ツール実行の許可判断をカスタマイズできます。フックスクリプトが JSON で許可・拒否を返すことで、Claude Code の動作を制御できます。

インストール

通知を表示するために claude-notifier を作成しました。

Homebrew でインストール可能です。

brew tap kusumotoa/tap
brew install claude-notifier

初回起動時に通知の許可を求められるので、許可してください。

hooks の設定

1. フックスクリプトの作成

~/.claude/hooks/permission-request.sh を作成します。

#!/bin/bash
set -e

INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // "Unknown"')

case "$TOOL_NAME" in
  "Bash")
    COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""')
    if [ ${#COMMAND} -gt 200 ]; then
      COMMAND="${COMMAND:0:200}..."
    fi
    SUBTITLE="Bash"
    MESSAGE="$COMMAND"
    ;;
  "Write")
    FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
    SUBTITLE="Write File"
    MESSAGE="$FILE_PATH"
    ;;
  "Edit")
    FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
    SUBTITLE="Edit File"
    MESSAGE="$FILE_PATH"
    ;;
  *)
    SUBTITLE="$TOOL_NAME"
    MESSAGE=$(echo "$INPUT" | jq -r '.tool_input | tostring' | head -c 200)
    ;;
esac

ANSWER=$(claude-notifier \
  -title "Claude Code" \
  -subtitle "$SUBTITLE" \
  -message "$MESSAGE" \
  -actions "Allow,Deny" \
  -sound default \
  -timeout 300 2>/dev/null) || ANSWER="@TIMEOUT"

case "$ANSWER" in
  "Allow")
    cat << 'EOF'
{
  "hookSpecificOutput": {
    "hookEventName": "PermissionRequest",
    "decision": {
      "behavior": "allow"
    }
  }
}
EOF
    ;;
  *)
    cat << 'EOF'
{
  "hookSpecificOutput": {
    "hookEventName": "PermissionRequest",
    "decision": {
      "behavior": "deny",
      "message": "Denied via notification"
    }
  }
}
EOF
    ;;
esac

実行権限を付与します。

chmod +x ~/.claude/hooks/permission-request.sh

2. settings.json の設定

~/.claude/settings.jsonhooks セクションに以下を追加します。

{
  "hooks": {
    "PermissionRequest": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/permission-request.sh"
          }
        ]
      }
    ]
  }
}

使い方

設定後、Claude Code を再起動すると有効になります。

ツールの実行許可が必要になると、macOS 通知が表示されます。通知には実行しようとしているツール名とコマンド(またはファイルパス)が表示されます。

  • Allow をクリックすると許可
  • Deny をクリック、または無視すると拒否

タイムアウトは 300 秒(5 分)に設定しています。

まとめ

Claude Code の PermissionRequest hook と自作の claude-notifier を組み合わせて、ツール実行の許可を macOS 通知から行えるようにしました。

参考リンク