「必ずこれをやってほしい」という指示は、CLAUDE.mdに書いても確実には守られない。この章を読むと、決まった場面で処理を自動的に走らせる方法が分かる。AIの判断を挟まないため、確実に実行させたい処理を任せられるようになる。

目次

章タイトル
1Hooksとは
2Hooksを使うメリット
3実行されるタイミング
4置き場所
5Hookの記載内容
6matcher で対象を絞る
7Hooksの活用例

1. Hooksとは

Hooksは、決まった場面になったら、自動的に処理を実行してくれるようにする仕組みになる。

たとえば、次のようなことである。

・ファイルを書き換えたら、必ず記録を残す
・作業を始める前に、必ず複製を取る
・応答が終わったら、必ず知らせる

どれも「必ず」やってほしいことになる。この「必ず」が、これまでの機能では作れなかった。

「必ずやらせる」手段が無かった

「CLAUDE.md — 会話をまたいで前提を引き継がせる」の「書き方のコツ」で、CLAUDE.mdには強制力がないと書いた。「必ず〜して」と書いても、AIが判断すれば従わないことがある。

「Permissions — 確認を減らしつつ、危険な操作だけ止める」では権限設定を扱った。こちらは確実に効くが、できるのは操作を止めることだけである。

CLAUDE.md :「やって」と頼める。ただし確実ではない
Permissions:「させない」を確実にできる。ただし止めるだけ

「必ずやらせる」手段が、まだ無い。 この穴を埋めるのがHooksになる。


2. Hooksを使うメリット

使うと何が変わるのかを、2つに分けて示す。

何が変わるか
1AIが忘れても、設定した場面では必ず走る
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つ挙げる。

やりたいことタイミング走らせるコマンド
作業を始めるとき、決めごとを読ませるSessionStartcat ルール.md
ファイルを書き換えたら、記録を残すPostToolUseecho edited >> log.txt
応答が終わったら、知らせるStopecho 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から直接、外のデータを扱えるようになる。


← ⑭ Skills | 次:⑯ MCP →