Claude Code hooks 設定方法|PreToolUse/PostToolUse で自動整形・危険操作ブロック【2026年版】
この記事でわかること
- 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.jsonのhooksに「イベント→matcher→command」で書く- PreToolUse で exit 2 → 操作をブロック、PostToolUse → 編集後の自動整形
- hook コマンドは stdin で JSON(ツール入力)を受け取り、ファイルパスやコマンドを検査できる
- matcher は必要なツールに絞り、スクリプトもリポジトリでレビュー
手を動かして定着させる:安全ガードや整形 hook は実プロジェクトで一度組むと効果が腑に落ちます。当サイトの「バイブコーディング実践編」では Claude Code を業務に使う際の許可設定・安全運用を提出物付き演習で扱います。4週間限定で無料公開中。
関連ガイド:
- Claude Code 入門 — CLI の環境構築と許可設定
- Claude Code サブエージェントの作り方・使い方 — 別コンテキストへの委譲
- Claude Code Skills とは・使い方・作り方 — 手順書の拡張機能
- Claude Code セキュリティガイド — 業務利用の統制
関連する AI 研修コース・事例
このガイドで解説した内容を、提出物・採点ルーブリック付きの実装演習で 実務レベルまで定着させるためのコースと、国内外の AI 活用事例を見るための入口です。
- バイブコーディング実践編 (vibe_practice)Claude Code を業務コードに使うときの安全設定・許可コマンド・ ログ管理を、提出物付き 40 レッスンで体系化。4 週間限定で無料公開中。
- AIエージェント活用実践編 (agent_practice)Claude Agent SDK と MCP で AI を働かせる実装演習。 Claude Code に慣れた次のステップ。
- サイバーセキュリティ基礎 (cybersec_basic)AI を業務に取り入れる際の社内ガードレール・情報統制と一緒に学ぶ 実務者向けセキュリティ 40 レッスン。
- AI 活用事例集KDDI・SAP・freee・メルカリ等、国内外の企業 AI 導入実例を業種別に確認。
- AI研修 コース一覧概論レーン (経営者向け) + 実践レーン (エンジニア向け) の全 6 コースを一覧。