Claude CodeのHooks機能が地味にすごい話

Claude CodeのHooks機能が地味にすごい話

Claude Codeを使い始めてしばらく経ちますが、最近ようやく「Hooks機能」を設定しました。

正直に言うと、最初は名前を見ただけで「エンジニア向けの難しい機能」と思って後回しにしていました。でも実際に設定してみたら、毎回手動でやっていた作業がスッと消えて、「なんでもっと早く使わなかったんだろう」と後悔したほどです。

今回は、非エンジニアの私がHooks機能を設定して何が変わったか、正直に書いていきます。

Hooks機能を設定したら、「毎回やっていたアレ」がなくなった

結論から言います。

Claude CodeのHooksは、「決まったタイミングで決まった処理を自動実行する仕組み」です。

たとえば私の場合、Claude Codeに何かファイルを編集してもらうたびに「ちゃんと保存されてるかな」「フォーマットが崩れてないかな」と毎回確認していました。Hooksを使えば、ファイルが変更されたあとに自動で整形処理を走らせることができます。自分で確認する必要がなくなりました。

ほかにも「危険なコマンドを実行しようとしたら止める」「セッションが始まったときにログを残す」といった使い方ができます。

Hooksが動くタイミングは6種類ある

Hooks機能には、処理を差し込めるタイミング(イベント)が複数あります。私がよく使うのは以下の3つです。

イベント名 動くタイミング
`PreToolUse` Claudeがツールを実行する直前
`PostToolUse` ツールが実行された直後
`UserPromptSubmit` 自分がプロンプトを送信した直後

このほかにも `SessionStart`(セッション開始時)や `SessionEnd`(終了時)などがあります。

「直前に止める」か「直後に何かする」かで使い分けます。とはいえ、最初はこの2つだけ覚えておけば十分です。

設定の仕方は思ったより簡単だった

Hooksの設定は `settings.json` というファイルに書きます。場所は `~/.claude/settings.json`(全プロジェクト共通)です。

たとえば、Claudeがファイルを編集したあとに自動でフォーマットをかけるなら、こう書きます:


{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'ファイルが編集されました' >> ~/claude_edit_log.txt"
          }
        ]
      }
    ]
  }
}

このサンプルは「`Write` か `Edit` ツールが実行されたあと、ログファイルに一行書き込む」という処理です。`command` の部分に実行したいシェルコマンドを書くだけなので、意外とシンプルです。

設定したあとClaude Codeを再起動すれば、すぐに動き始めます。

実際に私が設定したHooks

ここからは、私が実際に使っているHooksを紹介します。

1. 危険なコマンドをブロックするHook

Claudeに作業をお願いしていると、ときどきファイルをごっそり削除するようなコマンドを実行しようとすることがあります(体験済み)。

こういうケースを防ぐために、`rm -rf` などの危険なコマンドが含まれていたら止めるHookを入れました:


{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|DROP TABLE' && exit 2 || exit 0"
          }
        ]
      }
    ]
  }
}

`exit 2` を返すと処理がブロックされ、Claudeにもその旨が通知されます。最初に設定したとき「本当に止まるのかな」と半信半疑でしたが、試してみたらきちんと止まりました。ちょっと感動しました。

2. セッション開始時に日時をログに残すHook

「あの作業、いつやったっけ?」と振り返りたいことがあります。セッションが始まるたびに日時をテキストに書き出すHookを設定しています:


{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') - セッション開始\" >> ~/claude_sessions.txt"
          }
        ]
      }
    ]
  }
}

これだけで、毎日どれくらいClaude Codeを使っているかの記録が自動で貯まっていきます。地味だけどじわじわ便利です。

読者の方が試せるプロンプト

Hooks設定を自分で考えるのが難しい場合は、Claude Codeに相談するのが一番早いです。チャット欄にそのまま貼ってください:


私のClaude CodeのHooks機能を設定したいです。
以下の状況に合うHooksの設定を settings.json 形式で教えてください:

- [やりたいこと:例「ファイルを編集するたびにログに記録したい」]
- 私は非エンジニアなのでシンプルな設定にしてください
- ~/.claude/settings.json に追記する形で提案してください

現在の settings.json の内容:
[ここに現在の内容を貼る、なければ「空です」と書く]

`[やりたいこと]` の部分を自分の状況に書き換えて使ってください。Claudeが settings.json 形式で書いてくれるので、そのままコピーするだけで設定できます。

まだわかっていないこと・試行中のこと

正直、すべてを使いこなせているわけではありません。

  • `UserPromptSubmit` のHookで「送信内容に特定のワードが含まれていたら警告する」という設定を試しているのですが、うまく動かないことがある
  • イベントの種類が増えているようで(最新版では14種類以上という情報も)、全部を把握しきれていない
  • Hooksのデバッグ方法がまだよくわかっておらず、設定が正しく動いているか確認する方法を探し中

こういった部分は引き続き試しながら、わかったことを追記していく予定です。

まとめ

  • Claude CodeのHooks機能は、特定のタイミングで自動処理を走らせる仕組み
  • `~/.claude/settings.json` に書くだけで設定できる(再起動で有効化)
  • `PreToolUse`(実行前)と `PostToolUse`(実行後)の2つを覚えれば始められる
  • 危険なコマンドのブロック、ログの自動記録など、地味だけど確実に効く
  • 設定方法に迷ったらClaude Codeに相談するのが一番早い

Hooks機能は「設定すると何かが派手に変わる」タイプではないのですが、積み重なると確実に作業の手間が減ります。「毎回同じことをやっているな」と感じる作業があれば、Hooksで自動化できないか考えてみるといいかもしれません。

*Claude Codeの設定まわりについては、CLAUDE.mdに書くだけでAIが自分の分身になる話も参考にしてみてください。*