フック リファレンス
このページでは、Claude Code でフックを実装するためのリファレンス ドキュメントを提供します。
例を含むクイックスタート ガイドについては、Claude Code フックの開始 を参照してください。
設定
Claude Code フックは、設定ファイル で設定されます:
~/.claude/settings.json
- ユーザー設定.claude/settings.json
- プロジェクト設定.claude/settings.local.json
- ローカル プロジェクト設定(コミットされない)- エンタープライズ管理ポリシー設定
構造
フックはマッチャーによって整理され、各マッチャーは複数のフックを持つことができます:
- matcher: ツール名にマッチするパターン、大文字小文字を区別(
PreToolUse
とPostToolUse
にのみ適用)- 単純な文字列は完全一致:
Write
は Write ツールのみにマッチ - 正規表現をサポート:
Edit|Write
またはNotebook.*
- すべてのツールにマッチするには
*
を使用。空文字列(""
)を使用するか、matcher
を空白のままにすることもできます。
- 単純な文字列は完全一致:
- hooks: パターンがマッチしたときに実行するコマンドの配列
type
: 現在は"command"
のみサポートcommand
: 実行する bash コマンド($CLAUDE_PROJECT_DIR
環境変数を使用可能)timeout
: (オプション)特定のコマンドをキャンセルするまでの実行時間(秒)
UserPromptSubmit
、Notification
、Stop
、SubagentStop
などのマッチャーを使用しないイベントでは、matcher フィールドを省略できます:
プロジェクト固有のフック スクリプト
環境変数 CLAUDE_PROJECT_DIR
(Claude Code がフック コマンドを起動するときのみ利用可能)を使用して、プロジェクトに保存されたスクリプトを参照できます。これにより、Claude の現在のディレクトリに関係なく動作することが保証されます:
フック イベント
PreToolUse
Claude がツール パラメーターを作成した後、ツール呼び出しを処理する前に実行されます。
一般的なマッチャー:
Task
- サブエージェント タスク(サブエージェント ドキュメント を参照)Bash
- シェル コマンドGlob
- ファイル パターン マッチングGrep
- コンテンツ検索Read
- ファイル読み取りEdit
、MultiEdit
- ファイル編集Write
- ファイル書き込みWebFetch
、WebSearch
- Web 操作
PostToolUse
ツールが正常に完了した直後に実行されます。
PreToolUse と同じマッチャー値を認識します。
Notification
Claude Code が通知を送信するときに実行されます。通知は以下の場合に送信されます:
- Claude がツールを使用する許可が必要な場合。例:「Claude needs your permission to use Bash」
- プロンプト入力が少なくとも 60 秒間アイドル状態の場合。「Claude is waiting for your input」
UserPromptSubmit
ユーザーがプロンプトを送信したとき、Claude が処理する前に実行されます。これにより、プロンプト/会話に基づいて追加のコンテキストを追加したり、プロンプトを検証したり、特定の種類のプロンプトをブロックしたりできます。
Stop
メインの Claude Code エージェントが応答を完了したときに実行されます。ユーザーの中断による停止の場合は実行されません。
SubagentStop
Claude Code サブエージェント(Task ツール呼び出し)が応答を完了したときに実行されます。
PreCompact
Claude Code がコンパクト操作を実行しようとする前に実行されます。
マッチャー:
manual
-/compact
から呼び出しauto
- 自動コンパクトから呼び出し(コンテキスト ウィンドウが満杯のため)
SessionStart
Claude Code が新しいセッションを開始するか、既存のセッションを再開するとき(現在は内部的に新しいセッションを開始)に実行されます。既存の問題やコードベースへの最近の変更などの開発コンテキストを読み込むのに便利です。
マッチャー:
startup
- 起動から呼び出しresume
---resume
、--continue
、または/resume
から呼び出しclear
-/clear
から呼び出しcompact
- 自動または手動コンパクトから呼び出し
SessionEnd
Claude Code セッションが終了するときに実行されます。クリーンアップ タスク、セッション統計のログ記録、またはセッション状態の保存に便利です。
フック入力の reason
フィールドは以下のいずれかになります:
clear
- /clear コマンドでセッションがクリアされたlogout
- ユーザーがログアウトしたprompt_input_exit
- プロンプト入力が表示されている間にユーザーが終了したother
- その他の終了理由
フック入力
フックは、セッション情報とイベント固有のデータを含む JSON データを stdin 経由で受信します:
PreToolUse 入力
tool_input
の正確なスキーマはツールによって異なります。
PostToolUse 入力
tool_input
と tool_response
の正確なスキーマはツールによって異なります。
Notification 入力
UserPromptSubmit 入力
Stop と SubagentStop 入力
stop_hook_active
は、Claude Code がストップ フックの結果として既に継続している場合に true になります。Claude Code が無限に実行されることを防ぐために、この値をチェックするか、トランスクリプトを処理してください。
PreCompact 入力
manual
の場合、custom_instructions
はユーザーが /compact
に渡すものから取得されます。auto
の場合、custom_instructions
は空です。
SessionStart 入力
SessionEnd 入力
フック出力
フックが Claude Code に出力を返す方法は 2 つあります。出力は、ブロックするかどうかと、Claude とユーザーに表示すべきフィードバックを伝達します。
シンプル:終了コード
フックは終了コード、stdout、stderr を通じてステータスを伝達します:
- 終了コード 0: 成功。
stdout
はトランスクリプト モード(CTRL-R)でユーザーに表示されますが、UserPromptSubmit
とSessionStart
では stdout がコンテキストに追加されます。 - 終了コード 2: ブロッキング エラー。
stderr
が Claude に自動的にフィードバックされ処理されます。以下のフック イベント別の動作を参照してください。 - その他の終了コード: 非ブロッキング エラー。
stderr
がユーザーに表示され、実行が継続されます。
注意:終了コードが 0 の場合、Claude Code は stdout を見ません。ただし、UserPromptSubmit
フックでは stdout がコンテキストとして注入されます。
終了コード 2 の動作
フック イベント | 動作 |
---|---|
PreToolUse | ツール呼び出しをブロックし、stderr を Claude に表示 |
PostToolUse | stderr を Claude に表示(ツールは既に実行済み) |
Notification | N/A、stderr をユーザーのみに表示 |
UserPromptSubmit | プロンプト処理をブロックし、プロンプトを消去し、stderr をユーザーのみに表示 |
Stop | 停止をブロックし、stderr を Claude に表示 |
SubagentStop | 停止をブロックし、stderr を Claude サブエージェントに表示 |
PreCompact | N/A、stderr をユーザーのみに表示 |
SessionStart | N/A、stderr をユーザーのみに表示 |
SessionEnd | N/A、stderr をユーザーのみに表示 |
高度:JSON 出力
フックは、より洗練された制御のために stdout
で構造化 JSON を返すことができます:
共通 JSON フィールド
すべてのフック タイプは、これらのオプション フィールドを含めることができます:
continue
が false の場合、Claude はフック実行後に処理を停止します。
PreToolUse
の場合、これは"permissionDecision": "deny"
とは異なり、特定のツール呼び出しのみをブロックし、Claude に自動フィードバックを提供します。PostToolUse
の場合、これは"decision": "block"
とは異なり、Claude に自動フィードバックを提供します。UserPromptSubmit
の場合、これはプロンプトが処理されることを防ぎます。Stop
とSubagentStop
の場合、これは任意の"decision": "block"
出力よりも優先されます。- すべての場合において、
"continue" = false
は任意の"decision": "block"
出力よりも優先されます。
stopReason
は continue
に伴い、ユーザーに表示される理由を提供しますが、Claude には表示されません。
PreToolUse
決定制御
PreToolUse
フックは、ツール呼び出しが進行するかどうかを制御できます。
"allow"
は許可システムをバイパスします。permissionDecisionReason
はユーザーに表示されますが、Claude には表示されません。"deny"
はツール呼び出しの実行を防ぎます。permissionDecisionReason
は Claude に表示されます。"ask"
はユーザーに UI でツール呼び出しを確認するよう求めます。permissionDecisionReason
はユーザーに表示されますが、Claude には表示されません。
PreToolUse フックの decision
と reason
フィールドは非推奨です。
代わりに hookSpecificOutput.permissionDecision
と
hookSpecificOutput.permissionDecisionReason
を使用してください。非推奨フィールド
"approve"
と "block"
はそれぞれ "allow"
と "deny"
にマップされます。
PostToolUse
決定制御
PostToolUse
フックは、ツール実行後に Claude にフィードバックを提供できます。
"block"
は自動的に Claude にreason
でプロンプトします。undefined
は何もしません。reason
は無視されます。"hookSpecificOutput.additionalContext"
は Claude が考慮するコンテキストを追加します。
UserPromptSubmit
決定制御
UserPromptSubmit
フックは、ユーザー プロンプトが処理されるかどうかを制御できます。
"block"
はプロンプトが処理されることを防ぎます。送信されたプロンプトはコンテキストから消去されます。"reason"
はユーザーに表示されますが、コンテキストには追加されません。undefined
はプロンプトが正常に進行することを許可します。"reason"
は無視されます。"hookSpecificOutput.additionalContext"
は、ブロックされていない場合に文字列をコンテキストに追加します。
Stop
/SubagentStop
決定制御
Stop
と SubagentStop
フックは、Claude が継続する必要があるかどうかを制御できます。
"block"
は Claude の停止を防ぎます。Claude がどのように進行すべきかを知るために、reason
を設定する必要があります。undefined
は Claude の停止を許可します。reason
は無視されます。
SessionStart
決定制御
SessionStart
フックは、セッション開始時にコンテキストを読み込むことができます。
"hookSpecificOutput.additionalContext"
は文字列をコンテキストに追加します。- 複数のフックの
additionalContext
値は連結されます。
SessionEnd
決定制御
SessionEnd
フックは、セッション終了時に実行されます。セッション終了をブロックすることはできませんが、クリーンアップ タスクを実行できます。
終了コード例:Bash コマンド検証
JSON 出力例:コン テキスト追加と検証のための UserPromptSubmit
UserPromptSubmit
フックの場合、どちらの方法でもコンテキストを注入できます:
- 終了コード 0 と stdout:Claude がコンテキストを見る(
UserPromptSubmit
の特別なケース) - JSON 出力:動作をより詳細に制御
JSON 出力例:承認付き PreToolUse
MCP ツールとの連携
Claude Code フックは Model Context Protocol (MCP) ツール とシームレスに連携します。MCP サーバーがツールを提供する場合、フックでマッチできる特別な命名パターンで表示されます。
MCP ツール命名
MCP ツールは mcp__<server>__<tool>
パターンに従います。例:
mcp__memory__create_entities
- Memory サーバーの create entities ツールmcp__filesystem__read_file
- Filesystem サーバーの read file ツールmcp__github__search_repositories
- GitHub サーバーの search ツール
MCP ツール用のフック設定
特定の MCP ツールまたは MCP サーバー全体をターゲットにできます:
例
コード フォーマット、通知、ファイル保護を含む実用的な例については、開始ガイドのその他の例 を参照してください。
セキュリティ上の考慮事項
免責事項
自己責任で使用してください:Claude Code フックは、システム上で任意のシェル コマンドを自動的に実行します。フックを使用することで、以下を認めることになります:
- 設定するコマンドについて単独で責任を負う
- フックは、ユーザー アカウントがアクセスできる任意のファイルを変更、削除、またはアクセスできる
- 悪意のあるまたは不適切に書かれたフックは、データ損失やシステム損傷を引き起こす可能性がある
- Anthropic は保証を提供せず、フック使用による損害について一切の責任を負わない
- 本番環境で使用する前に、安全な環境でフックを十分にテストする必要がある
設定に追加する前に、常にフック コマンドを確認し理解してください。
セキュリティ ベスト プラクティス
より安全なフックを書くための主要なプラクティス:
- 入力を検証・サニタイズ - 入力データを盲目的に信頼しない
- 常にシェル変数を引用符で囲む -
$VAR
ではなく"$VAR"
を使用 - パス トラバーサルをブロック - ファイル パスで
..
をチェック - 絶対パスを使用 - スクリプトの完全パスを指定(プロジェクト パスには
$CLAUDE_PROJECT_DIR
を使用) - 機密ファイルをスキップ -
.env
、.git/
、キーなどを避ける
設定の安全性
設定ファイルでのフックの直接編集は、すぐには有効になりません。Claude Code は:
- 起動時にフックのスナップショットを取得
- セッション全体でこのスナップショットを使用
- フックが外部で変更された場合に警告
- 変更を適用するために
/hooks
メニューでの確認が必要
これにより、悪意のあるフック変更が現在のセッションに影響することを防ぎます。
フック実行の詳細
- タイムアウト:デフォルトで 60 秒の実行制限、コマンドごとに設定可能。
- 個別のコマンドのタイムアウトは、他のコマンドに影響しません。
- 並列化:マッチするすべてのフックが並列実行
- 重複排除:同一のフック コマンドは自動的に重複排除
- 環境:Claude Code の環境で現在のディレクトリで実行
CLAUDE_PROJECT_DIR
環境変数が利用可能で、プロジェクト ルート ディレクトリ(Claude Code が開始された場所)への絶対パスが含まれます
- 入力:stdin 経由の JSON
- 出力:
- PreToolUse/PostToolUse/Stop/SubagentStop:トランスクリプト(Ctrl-R)で進行状況表示
- Notification/SessionEnd:デバッグのみにログ記録(
--debug
) - UserPromptSubmit/SessionStart:stdout が Claude のコンテキストとして追加
デバッグ
基本的なトラブルシューティング
フックが動作しない場合:
- 設定を確認 -
/hooks
を実行してフックが登録されているかを確認 - 構文を検証 - JSON 設定が有効であることを確認
- コマンドをテスト - 最初にフック コマンドを手動で実行
- 権限を確認 - スクリプトが実行可能であることを確認
- ログを確認 -
claude --debug
を使用してフック実行の詳細を確認
一般的な問題:
- 引用符がエスケープされていない - JSON 文字列内で
\"
を使用 - 間違ったマッチャー - ツール名が正確にマッチすることを確認(大文字小文字を区別)
- コマンドが見つからない - スクリプトの完全パスを使用
高度なデバッグ
複雑なフック問題の場合:
- フック実行を検査 -
claude --debug
を使用して詳細なフック実行を確認 - JSON スキーマを検証 - 外部ツールでフック入力/出力をテスト
- 環境変数を確認 - Claude Code の環境が正しいことを確認
- エッジ ケースをテスト - 異常なファイル パスや入力でフックを試す
- システム リソースを監視 - フック実行中のリソース枯渇をチェック
- 構造化ログを使用 - フック スクリプトでログを実装
デバッグ出力例
claude --debug
を使用してフック実行の詳細を確認:
進行状況メッセージは、トランスクリプト モード(Ctrl-R)で以下を表示します:
- 実行中のフック
- 実行されるコマンド
- 成功/失敗ステータス
- 出力またはエラー メッセージ