世界を動かす技術を、日本語で。

クロードコードがフックをサポートしました

概要

Claude Codeの hooks は、ユーザー定義のシェルコマンドで動作制御を自動化 通知やフォーマット、権限制御など 多様なユースケース に対応 設定ファイルで 柔軟に管理 でき、MCPツールとの連携も可能 JSON入出力 やexit codeでClaudeと連携し、詳細な制御が可能 セキュリティリスクもあるため、 安全な運用 が重要

Claude Code Hooksの概要

  • Claude Code hooks は、ユーザーが任意のシェルコマンドをライフサイクルの各ポイントで自動実行
  • LLMの判断に依存せず、確実な動作・自動化ルールの実装
  • 代表的な用途
    • 通知 :入力待ちや実行許可などのカスタム通知
    • 自動フォーマット :ファイル編集後にprettierやgofmt等を自動実行
    • ログ記録 :実行コマンドのトラッキングや監査
    • フィードバック :コード規約違反時の自動指摘
    • 権限制御 :本番ファイルや機密ディレクトリの変更ブロック

クイックスタート:コマンド実行ログフックの追加

  • 前提条件 :jq(JSON処理ツール)のインストール
  • 手順
    • /hooksコマンドでPreToolUseイベントを選択
      • PreToolUseはツール実行前に動作、ブロックやフィードバックが可能
      • Add new matcher…でBashツールのみ対象に設定
      • Add new hook…で任意のシェルコマンドを登録
    • 保存先はUser settingsを選択(全プロジェクト共通で適用)
    • 設定を保存しREPLに戻ればフック登録完了
    • /hooksや~/.claude/settings.jsonで設定確認

設定ファイルと構造

  • 設定ファイル一覧
    • ~/.claude/settings.json :ユーザー全体設定
    • .claude/settings.json :プロジェクト単位
    • .claude/settings.local.json :ローカル設定(非コミット)
    • Enterprise managed policy settings :企業管理用
  • 構成
    • matcher :ツール名やパターン指定(PreToolUse/PostToolUseのみ適用)
      • 例:Write(完全一致)、Edit|Write(正規表現)、Notebook.*(プレフィックス)
      • 空欄の場合は全イベント対象
    • hooks :一致時に実行するコマンド配列
      • typeは現状"command"のみ
      • commandでbashコマンド指定

フックイベントの種類

  • PreToolUse :ツールパラメータ生成後、実行前に動作
    • 代表matcher:Task, Bash, Glob, Grep, Read, Edit, Write, WebFetch, WebSearch
  • PostToolUse :ツール実行後、即時動作
  • Notification :Claude Codeからの通知時に動作
  • Stop :Claude Codeの応答完了時に動作

フックの入出力仕様

  • 入力 :stdinでJSON形式のセッション・イベント固有データ受け取り
    • PreToolUse, PostToolUse, Notification, Stopごとにスキーマが異なる
  • 出力 :Claude Codeへの戻り値は2方式
    • シンプル方式 :exit code, stdout, stderrで状態通知
      • 0:正常、stdoutはユーザー表示
      • 2:ブロック、stderrはClaudeへ自動返却
      • その他:非ブロックエラー、stderrはユーザー表示
    • JSON方式 :stdoutで構造化JSON返却
      • continue(falseで以降処理停止)、stopReason(ユーザー向け理由)
      • PreToolUse/PostToolUse/Stopごとにdecision(approve/block/undefined)指定可

MCPツールとの連携

  • MCPツール名のパターン :mcp__<server>__<tool>
    • 例:mcp__memory__create_entities, mcp__github__search_repositories
  • 特定MCPツールやサーバー単位でフック設定可能

代表的なフック例

  • 自動フォーマット :ファイル編集後に自動整形
  • カスタム通知 :許可要求やアイドル時の通知内容変更

セキュリティに関する注意点

  • 自己責任 :任意コマンド自動実行のため、データ損失やシステム破壊リスクあり
  • 安全対策
    • 入力検証・サニタイズ
    • シェル変数は必ずダブルクォートで囲む
    • パストラバーサル防止(..のチェック)
    • 絶対パス指定
    • 機密ファイルの除外(.env, .git/, 鍵ファイル等)
  • 設定反映のタイミング
    • 起動時にhooksのスナップショット取得、セッション中は変更反映なし
    • 外部変更時は/hookメニューでレビュー必須

フック実行の詳細

  • タイムアウト :60秒
  • 並列実行 :一致する全フックを並列で実行
  • 実行環境 :カレントディレクトリ、Claude Codeの環境を継承
  • 入出力 :stdinでJSON受信、stdout/stderrで結果返却
  • 進捗表示 :transcriptモード(Ctrl-R)でフック進捗を表示

デバッグ方法

  • /hooksメニュー で設定確認
  • 設定ファイルのJSON構文チェック
  • コマンドを手動実行し挙動確認
  • exit codeやstdout/stderr出力形式の確認
  • シェルのクォートやエスケープミスの検証
  • transcriptモードで実行中フック、コマンド、出力・エラー内容を確認

Hackerたちの意見

これが実装されるのがめっちゃ楽しみ!フックは「コンテキストエンジニアリング」やエージェントのパフォーマンスのランタイム検証に重要になるね。企業のコンプライアンスやエージェントの行動監視にも関わってくるし。アンソロピックがこの機能のアイデアをGitHubのイシューからサポートしてくれたのはいいね! https://github.com/anthropics/claude-code/issues/712

その通りだよ。私はClaude Codeは使ってないけど、ClineっていうVS Codeの拡張(cline.bot)を使ってる。これはかなりすごい機能で、すぐにすべてのコーディングエージェントに搭載されると思う。

これをCursorで見られると嬉しいな。今のところ、いくつかのルールを使ってなんとかやってるけど、たまにしかうまくいかないんだよね。

元Cursorユーザーとして、まだ使ってる理由って何かあるの?本当に気になるんだけど。

Exit Code 2の挙動 PreToolUse - ツール呼び出しをブロックして、Claudeにエラーを表示する。これは素晴らしいね。CCが実行できるコマンドについて、複雑な具体的ルールを設定できるってことだから。CLAUDE.mdを使って無理にやるよりもずっといい。例えば、docker compose exec django python manage.py testは許可するけど、docker compose exec django python manage.py makemigrationsは防ぐことができる。

これ、すでに.CLAUDE/settings.jsonでできるよ。

これで大きな機能のギャップが埋まるね。あまり明らかでないかもしれないけど、Claude Codeがコミットを生成する方法のせいで、通常のGitフックは機能しないんだよね。(少なくとも、ほとんどの設定では。)CLAUDE.mdの指示を使ってClaudeにQltu CLIでコードを自動フォーマットさせてるけど、Claudeがそれに従うのはちょっとムラがある。ここでの決定論はいい感じ。最初はフックできるイベントがちょっと限られてるみたいだけど、Gitのコミットやプッシュをフックしやすくしてくれるといいな。

なんで普通のgitフックがclaude codeで動かないんだろう?

そうだね、私の限られた理解では、これはコンテキストを取らないもので、ツール使用ごとに設定できる自動的なものなんだよね。Claudeが「いつ」実行するかを決めるMCPとは違うの?

これに専念してる会社がたくさんあるのに、Claude Codeが先頭を走り続けてるのがすごいね。

ここで何かを否定するつもりはないけど、フックは他の似たような製品にもあるよね。例えば、これなんか - https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/com...

そうなの?Claude Codeは私にとって一番うまく機能しない製品なんだけど、主にやたらと色々やり始めるからなんだよね。LLMは、私がレビューして反復できるくらいの少ない行数のコードを生成する時が一番いいと思う。世界を発明しようとする時じゃなくて。その理由で、私は主にAiderとCursorを使ってる(後者は主に「5行ちょうだい」ってコメントモードで)。

余談だけど、AIがコーディングの仕事を奪うって言われてるけど、じゃあ誰がこれらのフックを設定するの?それとも、こんな機能を追加することを考えるの?こういうツールや関連の仕事は、AIが進化してそれを考えついて、他のAIに知らせて、ちゃんと実装するようになるまで残ると思う。

木工のメタファーを使うと、手工具から電動工具への移行を経験してる感じかな。ツールを使いこなすためには基本を理解してる人がまだ必要だけど、もう手で細かい家具を彫ってるわけじゃなくて、テーブルソーで大量の木を切ってるって感じ。生産性は上がるけど、気をつけないと指を失うリスクも高くなるよね。

プログラマーが10倍生産的になっても、需要が5倍しか増えなかったら、どうなるんだろう?

そうだよね、みんなコンバインハーベスターが農業の仕事を奪うって言うけど、じゃあ誰がそのコンバインハーベスターを操作するの?明らかに、全ての手作業の農業労働者がそのオペレーターに切り替わるわけじゃないし。もうこの無駄な議論はやめにしようよ。農業でもAIでも、自動化ツールの価値って、もし全ての労働者が[自動化ツール]のオペレーターになるだけなら、何があるの?

AIが進化して、これを考えるようになるまで。すべてのAI企業の一番の目標は、自分自身をプログラムして改善し、次のより強力なAIを作れるAIを作ることだよね。もちろん、こういう設定の仕事もできるだけ早くAIにアウトソースされるだろうね。

宇宙論者とおばあさんの話みたいに、「AIは何に立っているの?」って聞いてるようだけど、ここでの答えはもちろん「君はとても賢いね、若者、とても賢い。でも、AIはずっと続くんだ!」ってことだよ。もう多くの人がクラウドに自分のCLAUDE.mdを更新させてるから、危険な権限スキップをして自分のフックを編集させる理由がないとは思えない。そして、ジュラシック・パークのように、私たちがそれをするべきかどうかの問題は脇に置かれているようだね。

もうクラウドに自分の設定を変更させることができるよ。

一般的には「私たち」がまだ必要だと思うけど、逆に言うと、誰が美しくする必要があるの?人間がコードを読むことがないなら。

ロールバックに対応してほしいな。。

それ以前は、クラウドがリントやテストを実行するためのREADMEの指示に従うかどうかを信じる必要があった。せいぜい運次第だったけど、今は決定的だね。プレフックが悪いアクションをブロックして、ポストフックが結果を検証する。 > フックを使えば、複数のエージェントが安全に作業を引き継げるワークフローを構築できる。一人のエージェントがコードを書いて、別のエージェントがレビューし、また別のエージェントがデプロイする。それぞれのステップは検証フックでゲートされてる。

昨日、クラウドがそれをやるのを待つより、ライブリントする方法を探してたんだ。