「必ずこれをやってほしい」という指示は、CLAUDE.mdに書いても確実には守られない。この章を読むと、決まった場面で処理を自動的に走らせる方法が分かる。AIの判断を挟まないため、確実に実行させたい処理を任せられるようになる。
目次
| 章 | タイトル |
|---|---|
| 1 | Hooksとは |
| 2 | Hooksを使うメリット |
| 3 | 実行されるタイミング |
| 4 | 置き場所 |
| 5 | Hookの記載内容 |
| 6 | matcher で対象を絞る |
| 7 | Hooksの活用例 |
1. Hooksとは
Hooksは、決まった場面になったら、自動的に処理を実行してくれるようにする仕組みになる。
たとえば、次のようなことである。
・ファイルを書き換えたら、必ず記録を残す
・作業を始める前に、必ず複製を取る
・応答が終わったら、必ず知らせる
どれも「必ず」やってほしいことになる。この「必ず」が、これまでの機能では作れなかった。
「必ずやらせる」手段が無かった
「CLAUDE.md — 会話をまたいで前提を引き継がせる」の「書き方のコツ」で、CLAUDE.mdには強制力がないと書いた。「必ず〜して」と書いても、AIが判断すれば従わないことがある。
「Permissions — 確認を減らしつつ、危険な操作だけ止める」では権限設定を扱った。こちらは確実に効くが、できるのは操作を止めることだけである。
CLAUDE.md :「やって」と頼める。ただし確実ではない
Permissions:「させない」を確実にできる。ただし止めるだけ
「必ずやらせる」手段が、まだ無い。 この穴を埋めるのがHooksになる。
2. Hooksを使うメリット
使うと何が変わるのかを、2つに分けて示す。
| 何が変わるか | |
|---|---|
| 1 | AIが忘れても、設定した場面では必ず走る |
| 2 | 手作業でやっていた後処理が、自動で終わる |
以降で1つずつ扱う。
メリット1:AIが忘れても必ず走る
これがHooksの最大の特徴になる。
【CLAUDE.mdの場合】
ファイルを書き換える
↓
AIが「記録を残せと書いてあったな」と思い出す ← 忘れることがある
↓
記録を残す
【Hooksの場合】
ファイルを書き換える
↓
Claude Codeが自動で処理を走らせる ← AIは関与しない
↓
記録が残る
AIが忘れる・判断を変える、という余地がない。設定した場面では必ず走る。
メリット2:手作業でやっていた後処理が、自動で終わる
記録を残す、複製を取る、終わったことを知らせる — こうした後処理を、自分の手でやらなくてよくなる。
作業に集中しているときほど、後処理は抜け落ちる。 仕組みに預けておけば、集中していても抜けない。
1章「Hooksとは」で見た通り、CLAUDE.mdは頼めるだけ、Permissionsは止めるだけになる。「必ずやらせる」を担当できるのはHooksだけである。
3. 実行されるタイミング
処理を走らせるタイミングは多数用意されているが、よく使うものは限られる。
| タイミング | 設定に書く名前 |
|---|---|
| 会話の開始時 | SessionStart |
| 指示を送ったとき | UserPromptSubmit |
| 操作の実行前 | PreToolUse |
| 操作の実行後 | PostToolUse |
| 応答の完了時 | Stop |
右の列が、設定ファイルに書くときの名前になる。どのタイミングで走らせるかは、この名前を書き分けて決める(→5章「Hookの記載内容」)。
実行前と実行後の2つが中心になる。実行後は記録や整形の用途になる。ただしこの2つは、そのままだとあらゆる操作で走るため、対象を絞る書き方が要る(→6章「matcher で対象を絞る」)。
4. 置き場所
「設定ファイル — settings.json でツールの動作を決める」で扱った settings.json に書く。専用のファイルを作る必要はない。
「.claude フォルダー — Claude Codeの持ち物が集まる場所」で扱った、2つの置き場所の使い分けと同じ考え方になる。
| 置き場所 | 効く範囲 |
|---|---|
~/.claude/settings.json | 自分の全作業 |
.claude/settings.json | そのフォルダでの作業 |
- どの作業でも走らせたい処理 → ユーザー用(
~/.claude/settings.json) - このプロジェクトだけで走らせたい処理 → プロジェクト用(
.claude/settings.json)
迷ったらプロジェクト用でよい。 Hooksは書いたコマンドがそのまま実行されるため、効く範囲を狭くしておくほうが安全になる。
5. Hookの記載内容
settings.json に hooks という項目を書く。
最小の例
「AIの応答が終わったら音を鳴らす」設定を書いてみる。
hooks が2回出てくるが、外側と内側で役割が違う。
{
"hooks": { ← 外側:設定ファイルの項目名。この中にタイミングを並べる
"Stop": [ ← いつ走らせるか
{
"hooks": [ ← 内側:そのタイミングで実行するコマンドを書く場所
{
"type": "command",
"command": "echo done"
}
]
}
]
}
}
読み方は次の通りである。
| 部分 | 意味 |
|---|---|
外側の "hooks" | 設定ファイルの項目名。この中にタイミングを並べる |
"Stop" | いつ走らせるか(応答の完了時) |
内側の "hooks" | 実行するコマンドを書く場所。2つ以上書けば、上から順に実行される |
"type": "command" | コマンドを実行する |
"command": "echo done" | 実行する中身 |
echo done の部分を、自分が走らせたい処理に置き換える形になる。
「設定ファイル — settings.json でツールの動作を決める」の「書くときの注意点」の決まり(コメント不可・末尾カンマ不可)はここでも同じである。
複数の処理を一度に仕込む
タイミングを変えれば、別の場面で走らせられる。3つ挙げる。
| やりたいこと | タイミング | 走らせるコマンド |
|---|---|---|
| 作業を始めるとき、決めごとを読ませる | SessionStart | cat ルール.md |
| ファイルを書き換えたら、記録を残す | PostToolUse | echo edited >> log.txt |
| 応答が終わったら、知らせる | Stop | echo done |
この3つは、1つの設定にまとめて書ける。
{
"hooks": {
"SessionStart": [
{
"hooks": [
{ "type": "command", "command": "cat ルール.md" },
{ "type": "command", "command": "date >> log.txt" },
{ "type": "command", "command": "git status" }
]
}
],
"PostToolUse": [
{ "hooks": [ { "type": "command", "command": "echo edited >> log.txt" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command", "command": "echo done" } ] }
]
}
}
2つのことが同時に起きている。
| 見るところ | 分かること |
|---|---|
SessionStart・PostToolUse・Stop が並んでいる | タイミングは、いくつでも並べて書ける |
SessionStart の内側にコマンドが3つある | 同じタイミングに、コマンドを複数書ける(上から順に実行される) |
SessionStart の3つは、どれも作業を始めるときにやりたいことになる(決めごとを読む・日時を記録する・今の状態を確認する)。まとめて書いておけば、会話を始めるたびに3つとも走る。
6. matcher で対象を絞る
matcher とは
matcher は、どの操作のときに動かすかを指定する項目になる。5章「Hookの記載内容」で見た設定に、1行足して使う。
これが要るのは、「操作の実行前」「操作の実行後」を選んだときだけである。他のタイミング(会話の開始時・応答の完了時など)は、そもそも操作と結びついていないため指定しない。
指定しないとどうなるか
指定しないと、すべての動作に反応してしまう。
たとえば「ファイルを書き換えた後だけ、記録を残したい」と考えて「操作の実行後」を選んだとする。ところが matcher を指定しないと、読み込みなど他の動作でも同じ処理が実行される。
(やりたいこと)
ファイルを書き換えたときだけ、記録を残したい
(matcher を指定しないと)
ファイルを読んだ → 実行される ← 意図していない
ファイルを書き換えた → 実行される
コマンドを実行した → 実行される ← 意図していない
読んだだけ・調べただけの操作まで記録が残り、本当に書き換えた記録がその中に埋もれることになる。
| 何を書くか | |
|---|---|
| 指定しない | タイミングの名前だけを書く。その名前に当たる動作すべてで実行される |
| 指定する | matcher を足し、動かしたい操作の名前を書く |
matcher の書き方
「ファイルの編集・作成のときだけ記録を残す」なら、次のように書く。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "echo edited >> log.txt"
}
]
}
]
}
}
5章「Hookの記載内容」の最小の例と比べると、matcher の行が1つ増えただけになる。
Edit(編集)、Write(作成)、Bash(コマンド実行)のように操作の名前を書き、| で区切ると複数を指定できる。
7. Hooksの活用例
ここまでで書き方は揃った。最後に、実際に使われている例を挙げる。
指示内容を書いておき、それを実行してもらう
やってほしいことをファイルに書いておくと、そのとおりにAIが動く。 Hookで走らせるのはコマンドだが、その中身はファイルを読むだけでよい。読み込まれた指示は、AIがそのまま受け取って実行する。
3章「実行されるタイミング」の表にある「指示を送ったとき」を使うと、自分が指示を送るたびに、書いておいた内容を実行してもらえる。
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "cat instructions.md"
}
]
}
]
}
}
cat は「ファイルの中身を表示する」コマンドになる。つまりこの設定は、毎回 instructions.md を読ませるという意味である。
読ませるファイルの中身は、普通の日本語でよい。
(instructions.md の例)
・作業を始める前に、前回の指摘事項を メモ.md から読み上げる
・作業が終わったら、やったことを 作業ログ.md に追記する
・使い終わった一時ファイルがあれば、消してよいか聞いてから消す
コマンドとして書くのは cat instructions.md の1行だけで、やってほしい作業はファイル側に日本語で書ける。
毎回実行されることを前提に書く。 この設定は指示を送るたびに走るため、確認なしで消す・送信するといった指示は書かない。上の3つ目を「聞いてから消す」にしているのはこのためになる。
次のページ
ここまでで、任せる範囲を決め、手順を登録し、自動処理を仕込むところまでを見てきた。ここまではすべて、自分のパソコンの中で完結する話だった。
しかし実際の作業では、外のサービスにあるデータを使いたい場面が出てくる。
次の「MCP — 外部サービスのデータを直接読み書きする」では、外部サービスに接続してデータを読み書きする仕組みを扱う。Claude Codeから直接、外のデータを扱えるようになる。