Claude Code のフック(hooks)を読む——AIに任せず、決まった点検を毎回走らせる仕組み

 文・監修:宮本 太郎

Claude Code の「フック(hooks)」を使うと、ファイル編集の前後などに、決まった点検を毎回自動で実行できます。公式ガイドの記載をもとに、何ができて何ができないのかを、医療・ヘルスケアの開発に携わる方向けに整理します。

結論:「AIが忘れないように頼む」より「仕組みで毎回走らせる」

Claude Code(Anthropic 社の開発支援ツール)には、CLAUDE.md などに書いた指示をAIが読んで従う仕組みがあります。ただし、指示に従うかどうかは最終的にAIの判断に委ねられます。

これに対して「フック(hooks)」は、利用者が定義したシェルコマンドを、Claude Code の動作の決まった時点で実行する仕組みです。公式ガイドはこれを「deterministic control(決定的な制御)」と表現し、AIが実行を選ぶことに頼らず、ある動作が毎回起きるようにできる、と説明しています。

医療・ヘルスケアのシステム開発では、「触ってはいけないファイル」「編集後に必ず通す整形や検査」のような決まりごとが多くあります。こうした決まりごとをAIへの「お願い」にとどめず、プログラム側で毎回確かめる。フックはそのための道具の一つです。

フックが動くタイミング

公式ガイドには、フックを登録できるイベントの一覧があります。代表的なものは次のとおりです。

  • PreToolUse:ツールを実行する前。ガイドには「Can block it(止められる)」と書かれています
  • PostToolUse:ツールの実行が成功した後
  • UserPromptSubmit:プロンプトが送信され、Claude が処理する前
  • SessionStart:セッションの開始時や再開時
  • Stop:Claude が応答を終えたとき

「matcher」という項目でツール名を指定すると、対象を絞れます。たとえば Edit|Write と書くと、ファイルを編集するツールを使ったときだけフックが動き、Bash や Read では動きません。

設定はJSON形式の設定ファイルに書きます。ガイドでは、置き場所によって効く範囲が変わると説明されています。

  • ~/.claude/settings.json:自分の全プロジェクト(自分のPCだけ)
  • .claude/settings.json:そのプロジェクト(リポジトリに含めてチームで共有できる)
  • .claude/settings.local.json:そのプロジェクト(共有しない)
  • 管理ポリシー設定(Managed policy settings):組織全体(管理者が管理)

設定済みのフックは、Claude Code の中で /hooks と入力すると一覧で確認できます。

公式の例:大事なファイルの編集を止める

ガイドには「Block edits to protected files(保護したいファイルの編集を止める)」という例があります。.env、package-lock.json、.git/ 配下のような重要なファイルを、Claude が編集しようとしたときに止めるものです。

仕組みは単純です。PreToolUse イベントに、Edit|Write を matcher としたフックを登録します。呼び出されたスクリプトは、編集しようとしているファイルのパスを保護対象のパターンと照らし合わせ、該当すれば理由を標準エラー出力に書いて「exit 2」で終了します。ガイドによると、exit 2 で終わると Claude Code はその動作を止め、イベントによっては理由をClaudeに返します。この例では、Claude は止められた理由を受け取り、別のやり方を考えられます。

PostToolUse の例としては、ファイルを編集した後に整形ツール(Prettier)を自動で走らせる設定も紹介されています。「編集のたびに整形と検査を通す」という決まりを、人やAIの記憶に頼らず続けられます。

医療・ヘルスケアの開発でどう生かすか

公式の例を、医療・ヘルスケア分野の開発に当てはめると、たとえば次のような使い方が考えられます。

  • 触れてほしくないファイルを守る:接続設定や鍵を置いたファイル、本番環境の設定ファイルなどを、保護対象のパターンに加えます
  • 編集後の検査を毎回走らせる:コードの編集後に、整形や静的検査、決まりごとを確かめるスクリプトを実行します
  • 実行したコマンドの記録を残す:ガイドには、Bash で実行したコマンドを PostToolUse で記録ファイルに追記する例もあります。後から作業を振り返るときの材料になります

ここで強調したいのは、フックは患者情報を扱ってよい理由にはならないという点です。Claude Code はAIモデルに情報を送って動くツールです。フックで特定のファイルの編集を止められても、患者さんの情報や健診結果の実データを作業用フォルダに置いてよいことにはなりません。開発や検証には、架空の値で作った合成データを使ってください。実データを置かない運用を前提に、フックを「うっかりの操作を止める補助」として重ねる、という順番が適切だと考えます。

できないこと・注意点

公式ガイドの「Limitations」には、設計時に知っておくべき制約が書かれています。主なものを紹介します。

  • PostToolUse では元に戻せない:ツールの実行がすでに終わっているため、その動作を取り消すことはできません。止めたい操作は PreToolUse で扱います
  • Stop は「作業完了」の合図ではない:Stop フックは、作業が完了したときだけでなく、Claude が応答を終えるたびに動きます
  • 複数のフックが同じ入力を書き換えると順番が定まらない:フックは並行して動くため、どれが最後に効くかが決まりません
  • if による絞り込みは「best-effort(できる範囲で)」:ガイドは、コマンドの中身で絞り込む if について、確実な許可・拒否を強制するにはフックではなく権限の仕組み(permission system)を使うよう勧めています

一方で、PreToolUse フックはどの権限モードでも、権限モードの確認より前に動くと書かれています。フックが deny を返すと、利用者が権限モードを切り替えてもそのツールは止まります。逆に、フックが allow を返しても、設定ファイルの deny ルールを越えることはできません。つまり、フックは制限を厳しくする方向には使えますが、権限ルールで許可していない範囲まで緩めることはできません。

権限ルール(allow・ask・deny)とフックは役割が重なる部分もあります。「この操作はそもそも許さない」は権限ルールで、「編集のたびにこの検査を走らせる」「止めた理由をAIに伝えて方針を変えさせる」はフックで、というように分けて考えると整理しやすくなります。権限ルールについては、別のコラムで詳しく扱っています。

まとめ

  • フックは、Claude Code の決まった時点で利用者のコマンドを実行する仕組みで、AIの判断に頼らず毎回動きます
  • PreToolUse で止め、PostToolUse で整形や検査を走らせる、という使い分けが基本です
  • 確実に禁止したい操作は権限ルールで、フックはその上に重ねる補助として使います
  • フックがあっても、患者情報などの実データを作業環境に置かないことが前提です

AIに開発を任せる範囲が広がるほど、「AIにお願いする決まり」と「プログラムで毎回確かめる決まり」を分けておくことが大切になります。医療・ヘルスケア分野でのAI活用や開発体制づくりについて、お気軽にご相談ください。

まずはお気軽にご相談ください

「AIで何かできそうだが、何から始めればよいか分からない」段階からのご相談を歓迎します。医師×AIの視点で、貴社の課題に合ったアプローチをご提案します。