Claude Code hooks 設定方法|PreToolUse/PostToolUse で自動整形・危険操作ブロック【2026年版】

執筆・監修: Links-Create AI研修チーム
Claude Code・MCP・AI エージェントを実プロダクト開発で日常的に運用するチームが、 実務で詰まった点に基づいて執筆しています。 公開: 2026-06-16

この記事でわかること

  • hooks とは: ツール実行の前後などに任意のシェルコマンドを自動実行する仕組み
  • 設定場所: .claude/settings.json(プロジェクト) / ~/.claude/settings.json(ユーザー) の hooks セクション
  • 主なイベント: PreToolUse(実行前)・PostToolUse(実行後)・Stop・UserPromptSubmit・SessionStart
  • matcher で対象ツールを絞る(例: Bash だけ、Edit|Write だけ)
  • 実例: 編集後の自動 lint/format、危険な bash のブロック、操作ログ記録

結論:hooks は「Claudeに頼らず必ず走る自動処理」

Claude Code の hooks は、ツール実行の前後など決まったタイミングで、あなたのマシンが任意のシェルコマンドを自動実行する仕組みです。Claude の判断に依存せず必ず走るのが最大の特徴で、これが「毎回確実にやりたいこと」に向く理由です。

代表的な用途は3つ:

  • 安全ガード: 危険な bash(rm -rf 等)を実行前にブロック
  • 品質ガード: ファイル編集後に lint / format を自動実行
  • 監査: どのツールがいつ呼ばれたかをログに記録

この記事では .claude/settings.json の設定構造・イベント・matcher・実例を、コピーして使える形で解説します。

hooks の基本構造

.claude/settings.json(プロジェクト)または ~/.claude/settings.json(ユーザー)の hooks セクションに書きます。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          { "type": "command", "command": "/path/to/format-changed.sh" }
        ]
      }
    ]
  }
}

構造を分解すると:

  • イベント名(PostToolUse 等): いつ発火するか
  • matcher: どのツールを対象にするか(ツール名 or 正規表現。空/省略で全ツール)
  • hooks[].command: 実行するコマンド(type: "command")

主なイベント

イベント発火タイミング主な用途
PreToolUseツール実行の直前危険操作のブロック、許可制
PostToolUseツール実行の直後自動整形、lint、通知
UserPromptSubmitユーザー入力の送信時入力の前処理・コンテキスト注入
Stop応答の終了時後処理、まとめログ
SessionStartセッション開始時初期コンテキストの読み込み

迷ったら「実行前に止めたい→PreToolUse」「実行後に整える→PostToolUse」で選びます。

実例1: 編集後に自動整形

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          { "type": "command", "command": "/abs/path/format-changed.sh" }
        ]
      }
    ]
  }
}

hook には編集されたファイルパスを含む JSON が stdin で渡るので、スクリプト側でそれを読み、当該ファイルだけ整形します(全体整形は大量差分を生むため避ける)。

#!/bin/bash
# format-changed.sh — stdin の JSON から file_path を取り出して整形
file=$(python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('file_path',''))")
case "$file" in
  *.ts|*.tsx) npx prettier --write "$file" ;;
  *.py)       ruff format "$file" ;;
esac

実例2: 危険な bash をブロック

{
  "hooks": {
    "PreToolUse": [
      { "matcher": "Bash", "hooks": [ { "type": "command", "command": "/abs/path/bash-guard.sh" } ] }
    ]
  }
}
#!/bin/bash
# bash-guard.sh — 危険コマンドなら exit 2 でブロック
cmd=$(python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))")
if echo "$cmd" | grep -qE 'rm -rf /|:\(\)\{|mkfs|dd if='; then
  echo "危険なコマンドをブロックしました: $cmd" >&2
  exit 2   # PreToolUse で 2 を返すと実行を拒否
fi
exit 0

これは Claude への「お願い」ではなく実行レベルの遮断なので確実です。逆に「許可したコマンドだけ通す(allowlist)」設計にもできます。

実例3: 操作ログ

{
  "hooks": {
    "PreToolUse": [
      { "matcher": "", "hooks": [ { "type": "command", "command": "/abs/path/log-tool.sh" } ] }
    ]
  }
}

全ツール対象(matcher: "")で、いつ何が呼ばれたかを追記ログに残します。障害調査やセキュリティ監査に効きます。

配置場所と優先順位

置き場所スコープ
.claude/settings.jsonプロジェクト(Git共有)
~/.claude/settings.jsonユーザー(自分の全プロジェクト)
.claude/settings.local.jsonローカル限定の上書き(コミットしない)

チームで揃えたい安全ガード・整形はプロジェクト側に置いてコミットします。

よくあるハマり

  • JSON 崩れ: settings.json 全体が無効になる。エディタの JSON 検証を使う
  • matcher 広すぎ: 全ツールに重い処理が走り遅くなる。必要なツールに絞る
  • command が相対パス: 絶対パス + 実行権限を確認
  • 発火しない: まず echo ログだけの hook で発火を確かめてから本処理を足す

まとめ

  • hooks = Claude に頼らず必ず走る自動処理(安全ガード/品質ガード/監査)
  • .claude/settings.jsonhooks に「イベント→matcher→command」で書く
  • PreToolUse で exit 2 → 操作をブロック、PostToolUse → 編集後の自動整形
  • hook コマンドは stdin で JSON(ツール入力)を受け取り、ファイルパスやコマンドを検査できる
  • matcher は必要なツールに絞り、スクリプトもリポジトリでレビュー

手を動かして定着させる:安全ガードや整形 hook は実プロジェクトで一度組むと効果が腑に落ちます。当サイトの「バイブコーディング実践編」では Claude Code を業務に使う際の許可設定・安全運用を提出物付き演習で扱います。4週間限定で無料公開中

関連ガイド:

関連する AI 研修コース・事例

このガイドで解説した内容を、提出物・採点ルーブリック付きの実装演習で 実務レベルまで定着させるためのコースと、国内外の AI 活用事例を見るための入口です。