Claude Code hooksシステム完全ガイド|PreToolUse/PostToolUse/Notificationの使い方と実践例

AI・自動化
スポンサーリンク
※ 本記事には広告・PR(アフィリエイト)リンクが含まれています

📋 Claude Code コマンド指示書(クリックで展開)

.claude/commands/ に保存して /コマンド で実行

---
description: "Claude Code hooksシステム完全ガイド|PreToolUse/PostToolUse/Notificationの使い方と実践例"
---

# Claude Code hooksシステム完全ガイド|PreToolUse/PostToolUse/Notificationの使い方と実践例

この指示書は https://akahara-vlab.com/claude-code-hooks-guide/ の内容をClaude Codeコマンドとして実行するためのものです。

## 概要

Claude Code hooksシステム完全ガイド|PreToolUse/PostToolUse/Notificationの使い方と実践例

## 使い方

1. このテキストを `.claude/commands/claude-code-hooks-guide.md` に保存
2. Claude Codeで `/claude-code-hooks-guide` と入力して実行

## 指示

上記の記事の知識をもとに、ユーザーの質問に回答してください。
記事URL: https://akahara-vlab.com/claude-code-hooks-guide/

※ 平文なので中身を確認してから使ってください。安全性は目視で確認できます。


この記事でわかること
– 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 にはツール名(BashEditWriteなど)またはワイルドカード *(全ツール)が使える。


実践例

例1:危険なコマンドをブロックする

rm -rfgit 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 Documentation — Hooks, Claude Code Settings


{
“@context”: “https://schema.org”,
“@type”: “FAQPage”,
“mainEntity”: [
{
“@type”: “Question”,
“name”: “Claude Code hooksとは何ですか?”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “Claude Codeのツール実行前後や通知・終了などのイベントに合わせてシェルコマンドを自動実行できる仕組みです。settings.jsonに設定します。PreToolUse、PostToolUse、Notification、Stopの4種類があります。”
}
},
{
“@type”: “Question”,
“name”: “hooksはどこに設定しますか?”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “~/.claude/settings.jsonのhooksフィールドに設定します。グローバル設定(全プロジェクト共通)はこのファイル、プロジェクト固有の設定は.claude/settings.jsonに書きます。”
}
},
{
“@type”: “Question”,
“name”: “PreToolUseでコマンドをブロックできますか?”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “はい。PreToolUseフックのスクリプトが終了コード2で終了するとClaude Codeはそのツール呼び出しをブロックします。危険なコマンドの実行防止に使えます。”
}
}
]
}

見てもらえるだけで応援になります

このブログはアフィリエイトリンクで運営されています。以下のリンクから気になるサービスをチェックしてもらえると、僕たちの活動の支えになります。


この記事を書いたのは わさび(ニホンイシガメ / 3歳 / VTuberあかはら。の家族)です。

あかはらVラボ — Claude特化の情報を発信中。

この記事が参考になったら|以下のリンクから見てもらえるだけで、ブログ運営の応援になります。




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

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

コメント

タイトルとURLをコピーしました