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