Claude Hooks とは何か。タイミングで動く拡張のしくみ
Claude Code の Hooks(フック)は、「特定のイベントが起きたときに、決まったシェルコマンドを自動で走らせる」しくみです。Skills が「Claude を賢くする」、MCP が「Claude を外に繋ぐ」のに対し、Hooks は「タイミングで動かす」担当——ファイル保存後の自動 lint や、危険な操作の前の確認強化、ログ取得などに効きます。
はじめに
Step 3 の3つ目の柱、Hooks(フック) に入ります。Skills と MCP に続く、Claude Code の3大拡張機構の最後です。
ここまでの流れを整理しておくと、
| 拡張機構 | 担当 | 例 |
|---|---|---|
| Skills | Claude を賢くする(専門知識を渡す) | LP コーディング規約の Skill |
| MCP | Claude を外の世界に繋ぐ | Drive・Gmail・社内 DB の接続 |
| Hooks | タイミングで動かす(イベント駆動の自動化) | ファイル保存後に自動 lint、危険操作の前に確認 |
Hooks の正体は 「特定のイベントが起きたときに、決まったシェルコマンドを自動で走らせる」 しくみです。Web 制作でいうと WordPress のアクションフック にとても近い発想——「投稿が保存されたとき」「ユーザーがログインしたとき」に決まった処理を挟むあの仕組みを、Claude Code 側でも使えるようにしたものだと思ってください。
本記事では、
- Hooks とは何か(動く仕組み)
- なぜ生まれたのか(解決している問題)
- どんなイベントで発火するのか(イベントの全体像)
- Skills や SubAgent との違い
- 何に使うか(典型的な用途)
- Claude が実行するのではなく harness が実行する という重要なポイント
の順で、概念をいちから整理します。具体的な書き方は次の記事「Claude Hooks の基本の書き方」で扱います。
Hooks の正体
Hooks は、~/.claude/settings.json という設定ファイルに「このイベントが起きたら、このコマンドを走らせて」と書いておくだけ で動きます。プログラミングは不要、書くのは JSON だけです。
たとえば「ファイルを編集するたびに、その変更を git diff で表示する」という Hook はこう書けます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "git diff --stat HEAD" }
]
}
]
}
}
これだけで、Claude が Edit か Write ツールでファイルを書き換えるたびに、自動で git diff --stat HEAD が走り、結果が会話に表示されるようになります。シェルコマンドが書ければ、Hook は書ける という素朴さです。
なぜ Hooks が必要だったか
Claude Code を使い込んでいると、「毎回同じ後処理を頼んでいる自分」に気づきます。
- ファイルを書き換えてもらうたびに、「
npm run lint走らせて」と頼んでいる - 大きな修正のあとに、毎回「コミットメッセージ案を3つ出して」と頼んでいる
rm系コマンドを実行する前に、「念のため一覧を見せて」と頼んでいる
これを毎回口頭で頼むのは時間の無駄です。Skills に書く方法もありますが、Skills は 「いつ動くか」を Claude の判断に委ねる ので、確実性に欠けます。
Hooks は、この問題を 「特定のイベントが起きたら、必ず・確実に・人間の判断を経ずに、決まったコマンドを走らせる」 という発想で解いています。
| 拡張機構 | 発火の判断 | 確実性 |
|---|---|---|
| Skills | Claude が「使うべき」と判断したとき | ◯(曖昧な依頼だと動かないことがある) |
| Hooks | 設定したイベントが起きたら 必ず | ◎(条件が合えば100%発火) |
「確実性が欲しい」「人間の判断を経ずに動かしたい」が、Hooks を選ぶ理由になります。
Claude が実行するのではない、harness が実行する
ここがいちばん大事なポイントです。Hooks のコマンドは、Claude(AI)ではなく、Claude Code 本体(harness)が実行 します。
ふだん Claude にコマンドを頼むと、Claude は「実行していいですか?」という確認を出してから動きます。これは Claude が AI として判断している ためです。
一方 Hooks は、
[イベント発生]
↓
[harness が settings.json を見る]
↓
[条件が合えば、harness がコマンドを直接実行]
という流れで動きます。ここに Claude の判断は介在しません。「設定ファイルに書いてあるから走らせる」というだけの、機械的な動きです。
これは2つの意味で重要です。
メリット:確実に動く
Claude の気まぐれで「今回は実行するのをやめておこう」と判断されることがありません。決めたことは決めたとおりに動く という確実性が出ます。
デメリット:誤った設定がそのまま実行される
逆に、間違ったコマンドを書いてしまうと、それも機械的にそのまま実行されます。Claude は止めてくれません。「ファイル編集後に rm -rf / を走らせる」と書いてしまえば、それが実行されます(極端な例ですが)。
Hooks を書くときは、「これは AI が判断するのではなく、自分が書いたコマンドが直に走る」 という意識を持つのが、何より大事です。
どんなイベントで発火するか
Hooks が動けるイベント(以下、イベント種別)はいくつか用意されています。代表的なものは、
| イベント種別 | いつ発火するか | 典型的な用途 |
|---|---|---|
| PreToolUse | Claude がツール(Edit、Bash 等)を使う 直前 | 危険なコマンドのブロック、確認の追加 |
| PostToolUse | Claude がツールを使った 直後 | 編集後の自動 lint、git diff 表示 |
| UserPromptSubmit | ユーザーがプロンプトを送信した直後 | プロンプトのログ取得、定型文の挿入 |
| Stop | Claude が応答を終えたとき | 通知音、Slack 通知 |
| SubagentStop | サブエージェントが終了したとき | サブエージェントのログ取得 |
| PreCompact | 会話の自動圧縮(compact)が走る前 | 圧縮前のスナップショット保存 |
このうち最初に覚えるべきは PostToolUse と PreToolUse の2つです。「ツールを使う前後で何かしたい」というのが、いちばん多い使いどころです。
イベントの完全な一覧と詳細な挙動は時期によって増減するので、本記事では「代表的なものはこれ」という認識を持っていただければ十分です。
matcher で対象ツールを絞る
各イベントの中で、「どのツールが使われたとき」に発火するか を matcher で指定できます。
"PostToolUse": [
{
"matcher": "Edit|Write", // Edit か Write のとき
"hooks": [...]
},
{
"matcher": "Bash", // Bash のとき
"hooks": [...]
}
]
matcher には正規表現が書けます。"Edit|Write" で「Edit と Write の両方」、""(空文字)で「全ツール」を指す、といった書き分けが可能です。「全部のツールで動かすと重くなる」 ので、対象を絞るのが基本になります。
Skills や SubAgent との使い分け
ここで、Step 3 の他の拡張機構との使い分けを整理しておきます。
| 拡張 | 「何をしたいか」 | 例 |
|---|---|---|
| Skills | Claude に 新しい知識 を持たせたい | 「LP のコーディング規約を Claude に覚えさせたい」 |
| MCP | Claude を 外の世界に繋ぎたい | 「Drive 上のファイルを読ませたい」 |
| Hooks | 特定のタイミングで何かを自動実行したい | 「ファイル編集後に自動で lint を走らせたい」 |
| SubAgent | 重い仕事を別働隊に任せたい | 「コードベースの調査を別 Claude にやらせたい」 |
迷ったときの判断軸は、
- 「Claude に〜してほしい」(知識・接続・判断が必要)→ Skills か MCP
- 「特定のタイミングで〜してほしい」(機械的に動かしたい)→ Hooks
- 「メイン会話を汚さず別に動かしたい」→ SubAgent
という分け方になります。Hooks は 「Claude の判断をスキップして、機械的に動かしたい」 ときの選択肢、と覚えると間違えにくいです。
Hooks が活きる典型シーン
Hooks の威力が出るシーンを、いくつか具体的に紹介しておきます。
シーン1. ファイル編集後の自動チェック
PostToolUse(Edit) で、編集対象が .ts だったら tsc --noEmit を、.css だったら stylelint を走らせる、というような 自動品質チェック。Claude が間違えた変更を入れたとき、ターミナルに「型エラーが出た」とすぐ出るので、その場で直してもらえます。
シーン2. 危険操作のブロック
PreToolUse(Bash) で、コマンド内容に rm -rf や git push --force が含まれていたら そのコマンドを止める、という保険。Claude の判断ミスを harness 側で止められるので、強力なセーフティネットになります。
シーン3. ログ取得
UserPromptSubmit で、自分が打ったプロンプトをファイルに追記する プロンプトログ。あとから「あの依頼、なんて書いたっけ」を遡れるようになるので、自分の質問パターンを振り返るのに使えます。
シーン4. 通知
Stop で、Claude が長い応答を終えたタイミングで macOS の通知センターに通知 を出す。長く走らせて別作業をしているときに、終わったことを物理的に知れます。
osascript -e 'display notification "Claude の応答が終わりました" with title "Claude Code"'
このようなコマンドを Stop フックに仕込めば、それだけで動きます。
Hooks の3つのスコープ
Hooks も Skills と同じく、置き場所で適用範囲が変わります。
| 置き場所 | 適用範囲 |
|---|---|
~/.claude/settings.json | あなたの全プロジェクト |
<案件>/.claude/settings.json | その案件フォルダの中だけ |
<案件>/.claude/settings.local.json | その案件、かつあなたのマシンだけ(git に上げない) |
「全プロジェクトで使いたい便利フックは User 設定、案件固有のチェックは Project 設定、自分のマシンでだけ動かしたいデバッグ用は Local 設定」 という分け方が自然です。
settings.local.json は Git にコミットされない ことが多い(.gitignore で除外する運用)ので、他人と共有したくない自分専用の設定 に向いています。
セキュリティの基本
最後に、Hooks のセキュリティ意識について。
Hooks は 任意のシェルコマンドを harness が機械的に実行する 仕組みです。これを忘れると事故ります。
| 観点 | 何に気をつけるか |
|---|---|
| 自分で書くとき | コマンドのタイポが致命傷になる。テスト用フォルダで先に動作確認 |
| 他人が書いた Hook を取り込むとき(プラグイン経由など) | プラグインに含まれる Hook の中身を 必ず 一度読む |
| 環境変数や入力値を使うとき | クォーティングを意識する。ユーザー入力をシェルに直接渡さない |
WordPress のアクションフックでも「不用意な書き方が脆弱性につながる」のと同じです。「これは harness が直に実行する」 という意識さえ持てば、ほとんどの事故は避けられます。
触り始めるときの順序
Hooks はパワフルな分、最初の一歩で 慎重に行く のがおすすめです。慣れるまでの順序は、
PostToolUseで「結果を表示するだけ」の Hook から始める(読むだけは安全)- 慣れたら
PreToolUseでブロック系の Hook を試す - 最後に 副作用のある Hook(ファイル書き込み、外部通知)を仕込む
の順が無理がありません。最初から「rm を全部止める Hook」を書こうとすると、思わぬところでブロックされて作業が止まる、という事態が起きます。
まとめ
Hooks の要点を整理します。
- Hooks は「特定のイベントで自動的にシェルコマンドを走らせる」しくみ
- 書き場所は
~/.claude/settings.json(または案件配下) - JSON だけで書ける:プログラミング不要
- Claude ではなく harness が実行する:機械的に動く
- 代表的なイベント:
PreToolUse/PostToolUse/UserPromptSubmit/Stopほか matcherで対象ツールを絞る:正規表現が使える- 使いどころ:自動チェック/危険操作のブロック/ログ取得/通知
- 3つのスコープ:User / Project / Local
- セキュリティ:書き間違いが直に走る/他人の Hook は中身を読む
- 始めるときは「読むだけ」から:副作用のある Hook はあとで
Hooks の概念がつかめたら、次の記事「Claude Hooks の基本の書き方」で、settings.json の書き方を 最小例から動くまで いちから扱います。PostToolUse(Edit) で git diff を表示する Hook を、3分で書いて動かすところまで進みます。続けて読むと、Hooks が「設定ファイルに書くだけで動く」素朴さが体感できます。
WordPressを実際に動かしてきたサーバー:ロリポップ
Claude Code でWordPressサイトを組み立てるとき、最初に置く先として無理のないレンタルサーバー。月数百円から始められ、WordPressの自動インストールにも対応しています。設定で詰まりがちな初期段階の時間をかなり減らせます。