フックとパーミッション
Claude の挙動をカスタマイズし、安全な境界線を設ける
⏱ 想定 ~6 分
01 · 読む
フックは、Claude のワークフローの特定の瞬間にあなた自身のコードを実行させてくれます。ツール実行前?編集後?セッション開始時?こうしたイベントに割り込んで自分のロジックを追加できます — 自動フォーマット、安全チェック、通知、カスタム検証など。
パーミッションは、Claude が何を許されているかをコントロールします。デフォルトでは、Claude はコマンド実行やファイル編集の前に確認します。しかし安全な操作 (例えば npm test) は事前に承認し、危険なもの (例えば git push --force) はブロックすることもできて、Claude は決まった作業では速く、リスクのある作業では安全に動けます。
💡 想像してみてくださいフックは生産ラインのチェックポイントのようなものです。各ステーションで、検査員 (あなたのスクリプト) が作業を確認し、通すか (exit 0)、差し戻すか (exit 2) を決めます。パーミッションはセキュリティバッジシステムのようなもの — 常に開いているドア (ファイル読み込み)、バッジが要るドア (コマンド)、ロックされたドア (危険な操作) があります。
ポイントまとめ
- フック : Claude のワークフローの特定の瞬間にあなたのコードを実行する
- パーミッション : Claude にできることとできないことをコントロール
- フックはイベントに割り込み、パーミッションは全体的なルールを定める
- 両方を組み合わせて、Claude をあなたのワークフロー用にカスタマイズし保護する
02 · 読む
以下は最も役立つフックイベントです。- PreToolUse — Claude がツール (Read、Edit、Bash など) を使う前に発火します。何をしようとしているかを確認してブロックできます。 - PostToolUse — ツール成功後に発火します。編集されたファイルの自動フォーマットや変更のロギングに最適です。 - SessionStart — セッション開始時に発火します。特に compact 後にコンテキストリマインダーを注入するのに使います。 - Notification — Claude があなたの注意を必要とするときに発火します。デスクトップ通知に最適です。 - Stop — Claude が応答を終えたときに発火します。
フックは exit code で意思疎通します。exit 0 は動作を許可、exit 2 はブロックを意味します (stderr のエラーメッセージは Claude へのフィードバックになります)。
ポイントまとめ
- PreToolUse : ツール実行前にチェック、必要ならブロック
- PostToolUse : ツール成功後に反応 (自動フォーマット、ロギング)
- SessionStart : セッション開始時または compact 後にコンテキストを注入
- Exit 0 = 許可、Exit 2 = ブロック (stderr はフィードバック)
03 · コード例
以下は PostToolUse フックで、Claude がファイル編集後に自動フォーマットします。プロジェクトの .claude/settings.json に置きます。
.claude/settings.json — 自動フォーマットフック
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}]
}]
}
}
matcher フィールドは正規表現でツール名にマッチします — Edit|Write は Edit または Write のいずれかのツール呼び出し後にこのフックが発火することを意味します。コマンドは stdin で JSON を受け取り、ツール呼び出しの詳細を含むので、ファイルパスを取り出して Prettier を走らせます。Claude が編集する全ファイルが自動的にフォーマットされます。
04 · コード例
以下は PreToolUse フックで、危険な Bash コマンドをブロックします。
.claude/hooks/protect.sh
#!/bin/bash
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command')
if [[ "$CMD" =~ "rm -rf" ]]; then
echo "Blocked: rm -rf is not allowed" >&2
exit 2 # Block the action
fi
exit 0 # Allow everything else
.claude/settings.json
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": ".claude/hooks/protect.sh"
}]
}]
}
}
このフックは Claude が走らせようとする Bash コマンドすべてに割り込みます。stdin からコマンドを (JSON として) 読み、'rm -rf' を含むかチェックし、exit code 2 でブロックします。stderr のエラーメッセージは Claude になぜブロックされたかを伝え、Claude は制限を受け入れます。
05 · 読む
パーミッションは、スクリプトを書かずに包括的な許可/拒否ルールを与えてくれます。ワイルドカードで柔軟にマッチします。
Allow ルールは動作を事前承認し、Claude が訊かずに済むようにします。- Bash(npm run ) — npm スクリプトすべて - Bash(git commit ) — 変更をコミット - Read(*.env) — env ファイルを読む
Deny ルールは動作を完全にブロックします。- Bash(git push --force ) — force push 禁止 - Edit(package-lock.json) — lockfile に触らない - Bash(rm -rf ) — 再帰削除禁止
Deny ルールは常に allow ルールに勝ちます。設定は具体的なものから一般的なものへとチェックされます : ローカルプロジェクト > プロジェクト > ユーザー。
ポイントまとめ
- Allow ルール : 安全な動作を事前承認 (パーミッションプロンプトなし)
- Deny ルール : 動作を完全にブロック
- ワイルドカード : Bash(npm *) は任意の npm コマンドにマッチ
- コンフリクト時、Deny は常に Allow に勝つ
- ローカル設定はプロジェクトを上書き、プロジェクトはユーザーを上書き
06 · クイズ
PreToolUse フックが Claude による rm -rf /tmp/build の実行を検知しました。この動作をブロックするには、フックスクリプトはどの exit code を返すべきですか?
- Exit code 0 — 成功
- Exit code 2 — 動作をブロック
- Exit code 1 — 一般エラー
- Exit code 255 — 致命的エラー
07 · 対応づけ
それぞれのフックイベントを最適な用途と結びつけてください。
(このセクションはインタラクティブです — JavaScript を有効にしてください。)
⚠ 全機能のインタラクティブ体験には JavaScript が必要です。JavaScript を有効にして再読み込みしてください。
※ このサイトは独立した教育プロジェクトで、Anthropic の公式製品ではありません。Claude™ は Anthropic, PBC の商標です。