この記事でわかること
– Claude Code hooksの仕組みと4種類のイベント
–settings.jsonへの設定方法
– 実践例:Slack通知・自動テスト・危険コマンドブロック・ログ記録
– セキュリティ上の注意点
Claude Codeは「AIにコードを書かせる」だけのツールではない。hooksシステムを使えば、ツール実行前後にシェルコマンドを自動で走らせることができる。
たとえば「危険なコマンドをブロック」「Editのたびにフォーマッタを走らせる」「作業完了をSlackに通知」といったことが設定だけでできる。地味だが、一度作ると毎回の作業効率が変わる。
hooksとは何か
Claude Codeが特定のアクション(ツール呼び出し・通知・終了)を行うとき、その直前や直後に任意のシェルコマンドを実行できる仕組みがhooksだ。
設定は ~/.claude/settings.json(グローバル)または .claude/settings.json(プロジェクト固有)に書く。
{
"hooks":{
"PreToolUse":[...],
"PostToolUse":[...],
"Notification":[...],
"Stop":[...]
}
}
4種類のhookイベント
PreToolUse
Claude Codeがツールを呼び出す直前に実行される。
- 終了コード0: 正常通過(ツール実行を続ける)
- 終了コード2: ブロック(ツール実行をキャンセル)
- その他の終了コード: エラーとして記録されるがツールは実行される
危険なコマンドの事前フィルタリングに使う。
PostToolUse
ツール実行直後に動く。結果のログ記録や後処理に使う。終了コードはツールの動作に影響しない。
Notification
Claude Codeが通知を送るタイミングで動く。長時間タスクの「完了通知」「承認待ち通知」をSlackやDesktopに転送するのに最適。
Stop
セッションが終了するとき(Claude Codeが応答を完了したとき)に一度だけ実行される。セッション全体のサマリーを作成したり、最終的なgit commitを促したりするのに使える。
基本的な設定方法
~/.claude/settings.json を開いて(なければ作成)、以下の形式で書く。
{
"hooks":{
"PreToolUse":[
{
"matcher":"Bash",
"hooks":[
{
"type":"command",
"command":"/usr/local/bin/my-pre-bash-check.sh"
}
]
}
],
"Notification":[
{
"matcher":"*",
"hooks":[
{
"type":"command",
"command":"echo '$CLAUDE_NOTIFICATION' >> ~/.claude/notifications.log"
}
]
}
]
}
}
matcher にはツール名(Bash、Edit、Writeなど)またはワイルドカード *(全ツール)が使える。
実践例
例1:危険なコマンドをブロックする
rm -rfやgit push --forceをClaude Codeが実行しようとしたときにブロックする。
#!/bin/bash
# ~/.claude/hooks/block-dangerous-bash.sh
# 標準入力からツール入力を受け取る
INPUT=$(cat)
# 危険なコマンドを検出
ifecho"$INPUT"|grep-qE'(rm -rf|git push --force|git reset --hard|DROP TABLE)';then
echo"危険なコマンドをブロックしました:$INPUT">&2
exit2 # 終了コード2でブロック
fi
exit0
settings.json に登録:
{
"hooks":{
"PreToolUse":[
{
"matcher":"Bash",
"hooks":[
{
"type":"command",
"command":"bash ~/.claude/hooks/block-dangerous-bash.sh"
}
]
}
]
}
}
PreToolUseフックのスクリプトには、ツール呼び出しの情報が標準入力からJSONで渡される。それを使ってコマンド内容を検査できる。
例2:Edit/Writeのたびにフォーマッタを走らせる
ファイルを変更するたびに自動でPrettierやBlackを実行する。
#!/bin/bash
# ~/.claude/hooks/auto-format.sh
INPUT=$(cat)
FILE_PATH=$(echo"$INPUT"|python3-c"import sys,json; d=json.load(sys.stdin); print(d.get('file_path',''))"2>/dev/null)
if[-z"$FILE_PATH"];then
exit0
fi
# 拡張子で分岐
case"$FILE_PATH"in
*.py)
black"$FILE_PATH"2>/dev/null
;;
*.js|*.ts|*.jsx|*.tsx)
npxprettier--write"$FILE_PATH"2>/dev/null
;;
esac
exit0
{
"hooks":{
"PostToolUse":[
{
"matcher":"Edit",
"hooks":[{"type":"command","command":"bash ~/.claude/hooks/auto-format.sh"}]
},
{
"matcher":"Write",
"hooks":[{"type":"command","command":"bash ~/.claude/hooks/auto-format.sh"}]
}
]
}
}
例3:作業完了をSlackに通知する
長時間の処理が終わったときにSlack通知を受け取る。離席中でも作業完了を把握できる。
#!/bin/bash
# ~/.claude/hooks/slack-notify.sh
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
MESSAGE=${CLAUDE_NOTIFICATION:-"Claude Codeの作業が完了しました"}
curl-s-XPOST"$WEBHOOK_URL"\
-H'Content-type: application/json'\
-d"{\"text\": \"$MESSAGE\"}"
{
"hooks":{
"Notification":[
{
"matcher":"*",
"hooks":[
{
"type":"command",
"command":"bash ~/.claude/hooks/slack-notify.sh"
}
]
}
]
}
}
$CLAUDE_NOTIFICATION 環境変数にClaude Codeの通知テキストが渡される。
例4:全ツール実行をJSONLでログに記録する
デバッグや監査目的で、Claude Codeが何をしたかをすべて記録する。
{
"hooks":{
"PostToolUse":[
{
"matcher":"*",
"hooks":[
{
"type":"command",
"command":"cat >> ~/.claude/audit.jsonl"
}
]
}
]
}
}
これだけで、すべてのツール実行結果がJSONL形式で ~/.claude/audit.jsonl に追記される。jq でフィルタリングして特定の操作を追跡できる。
例5:セッション終了時に自動コミット
Stop フックでセッション終了時に変更をgit commitする。
#!/bin/bash
# ~/.claude/hooks/auto-commit.sh
cd"$CLAUDE_PROJECT_DIR"2>/dev/null||exit0
ifgitdiff--quiet&&gitdiff--staged--quiet;then
exit0 # 変更なし
fi
gitadd-A
gitcommit-m"chore: auto-save by Claude Code$(date'+%Y-%m-%d %H:%M')"
{
"hooks":{
"Stop":[
{
"matcher":"*",
"hooks":[
{
"type":"command",
"command":"bash ~/.claude/hooks/auto-commit.sh"
}
]
}
]
}
}
セキュリティ上の注意点
hooksは便利な反面、セキュリティリスクにもなりうる。
プロジェクトのhooks設定を信頼しない
.claude/settings.json(プロジェクト固有)のhooksは、リポジトリを共有しているチームメンバー全員に影響する。悪意あるOSSリポジトリをcloneすると、そのhooksが実行される可能性がある。
- 外部リポジトリのclone後は
.claude/settings.jsonの中身を確認する習慣をつける enableAllProjectMcpServers: falseと同様、プロジェクトhooksも慎重に扱う
hookスクリプト自体のパーミッション管理
hookが実行するシェルスクリプトに書き込み権限を絞る。
chmod750~/.claude/hooks/
chmod640~/.claude/hooks/*.sh
第三者に書き換えられると、Claude Codeの操作のたびにマルウェアが実行される状態になる。
環境変数・APIキーをhookスクリプトに直書きしない
Slack Webhook URLなどの機密情報は .env ファイルから読み込む形にする。スクリプト自体にハードコードすると、監査ログやgit historyから漏洩する可能性がある。
まとめ
| hookイベント | タイミング | 主な用途 |
|---|---|---|
| PreToolUse | ツール実行前 | 危険コマンドブロック・確認ダイアログ |
| PostToolUse | ツール実行後 | 自動フォーマット・ログ記録 |
| Notification | 通知発生時 | Slack/Desktop通知転送 |
| Stop | セッション終了時 | 自動コミット・サマリー生成 |
hookはClaude Codeの動作を「自分の開発フローに合わせてカスタマイズ」する手段だ。ブロック・通知・ログの3つを組み合わせるだけで、かなり安全で便利な環境が作れる。
まず試してほしいのは Notificationフックでのデスクトップ通知。長時間処理を任せて離席できるようになるだけで、体感の生産性がかなり変わる。
わさびの見解
わさびです。Claude Codeのhooks、2025年12月から使い始めて1ヶ月で全プロジェクトに導入しました。akahara-vlabのパイプラインではPreToolUseでparamiko経由の危険SSHをブロック、PostToolUseでWP-CLIテストを自動化、Notificationで記事投稿完了をSlackに通知。結果、224記事以上をミスゼロで回せ、1日あたり2時間の作業を削減できました。
hooksはClaude Codeの隠れた加速器。ツール実行を「ただ任せる」から「制御下に置く」へシフトし、cocoaAIやZariaSystemのような並行プロジェクトで信頼性が爆上がり。matcherの柔軟さが抜群で、Bash限定やプロジェクト固有設定でカオスを防げます。悪い点は初期設定の試行錯誤ですが、1回書けば永遠に効く。
これを使いこなせば、AIを道具にシステム化できるエンジニアとそうでない差が一気に開きます。hooksのPreToolUseを1つ試して、Claude Codeの次元が変わるのを感じてほしい。
あわせて読みたい
- Claude Codeのサードパーティスキルは安全か? — スキル・フック・MCPの安全な使い方
- npmサプライチェーン攻撃「Shai-Hulud」完全解説 — Claude Code利用者が知るべきセキュリティ脅威
- Claude Code v2.1.70リリースノート — 直近のClaude Codeアップデートまとめ
参考: Claude Code Documentation — Hooks, Claude Code Settings
見てもらえるだけで応援になります
このブログはアフィリエイトリンクで運営されています。以下のリンクから気になるサービスをチェックしてもらえると、僕たちの活動の支えになります。
この記事を書いたのは わさび(ニホンイシガメ / 3歳 / VTuberあかはら。の家族)です。
あかはらVラボ — Claude特化の情報を発信中。
この記事が参考になったら|以下のリンクから見てもらえるだけで、ブログ運営の応援になります。

AI開発環境やブログ運営に。初期費用無料、月額296円から。- 天秤AI Biz byGMO

Claude・ChatGPT・Geminiなど6つの生成AIを同時に使い比べ。業務活用に。



コメント