CC逆引きリファレンス

ツール実行前にフックしたい

10. フック

コマンド / 機能

PreToolUse

事前処理

概要

ツール(Bash、Write、Edit など)が実行される直前に呼び出されます。exit 0 で許可、exit 2 でブロック(エラー表示あり)、それ以外はエラーとして扱われます。

設定例

// settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"[$(date '+%Y-%m-%d %H:%M:%S')] Bash: $CLAUDE_TOOL_INPUT\" >> ~/.claude/commands.log"
          }
        ]
      },
      {
        "matcher": "Bash(rm -rf*)",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'rm -rf は禁止されています' && exit 2"
          }
        ]
      },
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"書き込み対象: $CLAUDE_FILE_PATH\" >> ~/.claude/writes.log"
          }
        ]
      }
    ]
  }
}

こんな時に使う

  • 実行前にチェックを入れたい時
  • 危険な操作をブロックしたい時
  • 操作をログに記録したい時
  • 特定のファイルへのアクセスを制限したい時

使い方

  1. 1PreToolUse イベントにフック定義を追加
  2. 2matcher でツール名を指定(Bash、Write、Edit、Read など)
  3. 3ブロックしたい場合は exit 2 を返す
  4. 4環境変数 $CLAUDE_TOOL_INPUT でツール入力を取得

Tips

  • exit 0: 許可して続行
  • exit 2: ブロックしてエラーメッセージを Claude に表示
  • stdout への出力は Claude にフィードバックされる
  • 複数の matcher を設定すると、マッチした全てのフックが実行される