メインコンテンツへスキップ
例を含むクイックスタート ガイドについては、ワークフローをフックで自動化するを参照してください。
フックは、Claude Code のライフサイクル内の特定のポイントで自動的に実行されるユーザー定義のシェル コマンド、HTTP エンドポイント、または LLM プロンプトです。このリファレンスを使用して、イベント スキーマ、設定オプション、JSON 入出力形式、非同期フック、HTTP フック、MCP ツール フックなどの高度な機能を検索してください。初めてフックを設定する場合は、代わりにガイドから始めてください。

フック ライフサイクル

フックは Claude Code セッション中の特定のポイントで発火します。イベントが発火してマッチャーがマッチすると、Claude Code はイベントに関する JSON コンテキストをフック ハンドラーに渡します。コマンド フックの場合、入力は stdin に到着します。HTTP フックの場合、POST リクエスト本体として到着します。ハンドラーは入力を検査し、アクションを実行し、オプションで決定を返すことができます。イベントは 3 つのケイデンスに分類されます。セッションごとに 1 回(SessionStartSessionEnd)、ターンごとに 1 回(UserPromptSubmitStopStopFailure)、agentic ループ内のすべてのツール呼び出しで(PreToolUsePostToolUse)です。
オプションの Setup から SessionStart に流れ込み、その後、UserPromptSubmit、スラッシュ コマンド用の UserPromptExpansion、ネストされた agentic ループ(PreToolUse、PermissionRequest、PostToolUse、PostToolUseFailure、PostToolBatch、SubagentStart/Stop、TaskCreated、TaskCompleted)、Stop または StopFailure を含むターンごとのループ、その後 TeammateIdle、PreCompact、PostCompact、SessionEnd が続き、Elicitation と ElicitationResult は MCP ツール実行内にネストされ、PermissionDenied は PermissionRequest からの副分岐として自動モード拒否のため、WorktreeCreate、WorktreeRemove、Notification、ConfigChange、InstructionsLoaded、CwdChanged、FileChanged はスタンドアロン非同期イベントとして表示されるフック ライフサイクル図
以下の表は、各イベントがいつ発火するかをまとめています。フック イベントセクションでは、各イベントの完全な入力スキーマと決定制御オプションについて説明しています。
EventWhen it fires
SessionStartWhen a session begins or resumes
SetupWhen you start Claude Code with --init-only, or with --init or --maintenance in -p mode. For one-time preparation in CI or scripts
UserPromptSubmitWhen you submit a prompt, before Claude processes it
UserPromptExpansionWhen a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion
PreToolUseBefore a tool call executes. Can block it
PermissionRequestWhen a permission dialog appears
PermissionDeniedWhen a tool call is denied by the auto mode classifier. Return {retry: true} to tell the model it may retry the denied tool call
PostToolUseAfter a tool call succeeds
PostToolUseFailureAfter a tool call fails
PostToolBatchAfter a full batch of parallel tool calls resolves, before the next model call
NotificationWhen Claude Code sends a notification
MessageDisplayWhile assistant message text is displayed
SubagentStartWhen a subagent is spawned
SubagentStopWhen a subagent finishes
TaskCreatedWhen a task is being created via TaskCreate
TaskCompletedWhen a task is being marked as completed
StopWhen Claude finishes responding
StopFailureWhen the turn ends due to an API error. Output and exit code are ignored
TeammateIdleWhen an agent team teammate is about to go idle
InstructionsLoadedWhen a CLAUDE.md or .claude/rules/*.md file is loaded into context. Fires at session start and when files are lazily loaded during a session
ConfigChangeWhen a configuration file changes during a session
CwdChangedWhen the working directory changes, for example when Claude executes a cd command. Useful for reactive environment management with tools like direnv
FileChangedWhen a watched file changes on disk. The matcher field specifies which filenames to watch
WorktreeCreateWhen a worktree is being created via --worktree or isolation: "worktree". Replaces default git behavior
WorktreeRemoveWhen a worktree is being removed, either at session exit or when a subagent finishes
PreCompactBefore context compaction
PostCompactAfter context compaction completes
ElicitationWhen an MCP server requests user input during a tool call
ElicitationResultAfter a user responds to an MCP elicitation, before the response is sent back to the server
SessionEndWhen a session terminates

フックがどのように解決されるか

これらの部分がどのように組み合わさるかを理解するために、破壊的なシェル コマンドをブロックする PreToolUse フックを考えてみましょう。matcher は Bash ツール呼び出しに絞り込み、if 条件は rm * にマッチするコマンドにさらに絞り込むため、block-rm.sh は両方のフィルターがマッチするときのみ生成されます。
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "if": "Bash(rm *)",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh",
            "args": []
          }
        ]
      }
    ]
  }
}
スクリプトは stdin から JSON 入力を読み取り、コマンドを抽出し、rm -rf が含まれている場合は permissionDecision として "deny" を返します。
#!/bin/bash
# .claude/hooks/block-rm.sh
COMMAND=$(jq -r '.tool_input.command')

if echo "$COMMAND" | grep -q 'rm -rf'; then
  jq -n '{
    hookSpecificOutput: {
      hookEventName: "PreToolUse",
      permissionDecision: "deny",
      permissionDecisionReason: "Destructive command blocked by hook"
    }
  }'
else
  exit 0  # no decision; normal permission flow applies
fi
ここで Claude Code が Bash "rm -rf /tmp/build" を実行することにしたとします。以下が起こります。
フック解決フロー:PreToolUse イベントが発火し、マッチャーが Bash マッチをチェックし、if 条件が Bash(rm *) マッチをチェックし、フック ハンドラーが実行され、結果が Claude Code に返される
1

イベントが発火

PreToolUse イベントが発火します。Claude Code はツール入力を JSON として stdin のフックに送信します。
{ "tool_name": "Bash", "tool_input": { "command": "rm -rf /tmp/build" }, ... }
2

マッチャーがチェック

マッチャー "Bash" がツール名にマッチするため、このフック グループがアクティブになります。マッチャーを省略するか "*" を使用すると、グループはイベントのすべての出現でアクティブになります。
3

If 条件がチェック

if 条件 "Bash(rm *)"rm -rf /tmp/buildrm * にマッチするサブコマンドであるためマッチするため、このハンドラーが生成されます。コマンドが npm test だった場合、if チェックは失敗し、block-rm.sh は実行されず、プロセス生成のオーバーヘッドを回避します。if フィールドはオプションです。なければ、マッチしたグループ内のすべてのハンドラーが実行されます。
4

フック ハンドラーが実行

スクリプトは完全なコマンドを検査し、rm -rf を見つけるため、stdout に決定を出力します。
{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "Destructive command blocked by hook"
  }
}
コマンドが安全な rm バリアント(rm file.txt など)だった場合、スクリプトは代わりに exit 0 に到達します。出力なしの終了コード 0 は、フックが報告する決定がないことを意味するため、ツール呼び出しは通常の権限フローを通じて続行されます。フックは呼び出しを拒否できますが、沈黙を保つことは承認を意味しません。
5

Claude Code が結果に基づいて行動

Claude Code は JSON 決定を読み取り、ツール呼び出しをブロックし、Claude に理由を表示します。
以下の設定セクションでは完全なスキーマについて説明し、各フック イベントセクションでは、コマンドが受け取る入力と返すことができる出力について説明しています。

設定

フックは JSON 設定ファイルで定義されます。設定には 3 つのネストレベルがあります。
  1. 応答するフック イベントを選択します(PreToolUseStop など)
  2. 発火するタイミングをフィルタリングするマッチャー グループを追加します(‘Bash ツールのみ’など)
  3. マッチしたときに実行する 1 つ以上のフック ハンドラーを定義します
完全なウォークスルーと注釈付きの例については、上記のフックがどのように解決されるかを参照してください。
このページでは各レベルに特定の用語を使用しています。フック イベントはライフサイクル ポイント、マッチャー グループはフィルター、フック ハンドラーはシェル コマンド、HTTP エンドポイント、MCP ツール、プロンプト、または実行されるエージェントです。‘フック’単独は一般的な機能を指します。

フック位置

フックを定義する場所によって、そのスコープが決まります。
位置スコープ共有可能
~/.claude/settings.jsonすべてのプロジェクトいいえ、マシンにローカル
.claude/settings.json単一プロジェクトはい、リポジトリにコミット可能
.claude/settings.local.json単一プロジェクトいいえ、gitignored
管理ポリシー設定組織全体はい、管理者が制御
プラグイン hooks/hooks.jsonプラグインが有効な場合はい、プラグインにバンドル
スキルまたはエージェントフロントマターコンポーネントがアクティブな場合はい、コンポーネント ファイルで定義
設定ファイル解決の詳細については、設定を参照してください。エンタープライズ管理者は allowManagedHooksOnly を使用して、ユーザー、プロジェクト、プラグイン フックをブロックできます。管理設定で force-enabled されたプラグインからのフックは除外されるため、管理者は組織マーケットプレイスを通じて検証済みのフックを配布できます。フック設定を参照してください。

マッチャー パターン

matcher フィールドは、フックが発火するタイミングをフィルタリングします。マッチャーの評価方法は、含まれている文字に依存します。
マッチャー値評価方法
"*"""、または省略すべてにマッチイベントのすべての出現で発火
文字、数字、_| のみ完全一致、または | で区切られた完全一致のリストBash は Bash ツールのみにマッチ。Edit|Write はいずれかのツールに完全にマッチ
その他の文字を含むJavaScript 正規表現^Notebook は Notebook で始まるツールにマッチ。mcp__memory__.*memory サーバーのすべてのツールにマッチ
FileChanged イベントは監視リストを構築するときにこれらのルールに従いません。FileChangedを参照してください。 各イベント タイプは異なるフィールドでマッチします。
イベントマッチャーがフィルタリングするものマッチャー値の例
PreToolUsePostToolUsePostToolUseFailurePermissionRequestPermissionDeniedツール名BashEdit|Writemcp__.*
SessionStartセッションの開始方法startupresumeclearcompact
Setupセットアップをトリガーした CLI フラグinitmaintenance
SessionEndセッションが終了した理由clearresumelogoutprompt_input_exitbypass_permissions_disabledother
Notification通知タイプpermission_promptidle_promptauth_successelicitation_dialogelicitation_completeelicitation_response
SubagentStartエージェント タイプgeneral-purposeExplorePlan、またはカスタム エージェント名
PreCompactPostCompactコンパクションをトリガーしたものmanualauto
SubagentStopエージェント タイプSubagentStart と同じ値
ConfigChange設定ソースuser_settingsproject_settingslocal_settingspolicy_settingsskills
CwdChangedマッチャー サポートなしすべてのディレクトリ変更で常に発火
FileChanged監視するリテラル ファイル名(FileChangedを参照).envrc|.env
StopFailureエラー タイプrate_limitoverloadedauthentication_failedoauth_org_not_allowedbilling_errorinvalid_requestmodel_not_foundserver_errormax_output_tokensunknown
InstructionsLoadedロード理由session_startnested_traversalpath_glob_matchincludecompact
UserPromptExpansionコマンド名スキルまたはコマンド名
ElicitationMCP サーバー名設定された MCP サーバー名
ElicitationResultMCP サーバー名Elicitation と同じ値
UserPromptSubmitPostToolBatchStopTeammateIdleTaskCreatedTaskCompletedWorktreeCreateWorktreeRemoveMessageDisplayマッチャー サポートなしすべての出現で常に発火
マッチャーは、Claude Code がフックに stdin で送信するJSON 入力からのフィールドに対して実行されます。ツール イベントの場合、そのフィールドは tool_name です。各フック イベントセクションでは、マッチャー値の完全なセットとそのイベントの入力スキーマをリストしています。 この例は、Claude がファイルを書き込むまたは編集するときにのみ linting スクリプトを実行します。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/lint-check.sh"
          }
        ]
      }
    ]
  }
}
UserPromptSubmitPostToolBatchStopTeammateIdleTaskCreatedTaskCompletedWorktreeCreateWorktreeRemoveCwdChanged はマッチャーをサポートせず、すべての出現で常に発火します。これらのイベントに matcher フィールドを追加すると、サイレントに無視されます。 ツール イベントの場合、個別のフック ハンドラーで if フィールドを設定することで、より狭くフィルタリングできます。if権限ルール構文を使用してツール名と引数を一緒にマッチするため、"Bash(git *)"git * に一致する Bash 入力のサブコマンドのいずれかに対して実行され、"Edit(*.ts)" は TypeScript ファイルのみに対して実行されます。

MCP ツールをマッチ

MCP サーバー ツールはツール イベント(PreToolUsePostToolUsePostToolUseFailurePermissionRequestPermissionDenied)で通常のツールとして表示されるため、他のツール名と同じ方法でマッチできます。 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__memory のようなマッチャーは文字とアンダースコアのみを含むため、完全一致として比較され、ツールにマッチしません。
  • mcp__memory__.*memory サーバーのすべてのツールにマッチ
  • mcp__.*__write.* は任意のサーバーから「write」で始まるツールにマッチ
この例は、すべてのメモリ サーバー操作をログし、任意の MCP サーバーからの書き込み操作を検証します。
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__memory__.*",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"
          }
        ]
      },
      {
        "matcher": "mcp__.*__write.*",
        "hooks": [
          {
            "type": "command",
            "command": "/home/user/scripts/validate-mcp-write.py"
          }
        ]
      }
    ]
  }
}

フック ハンドラー フィールド

内側の hooks 配列の各オブジェクトはフック ハンドラーです。マッチャーがマッチしたときに実行されるシェル コマンド、HTTP エンドポイント、MCP ツール、LLM プロンプト、またはエージェントです。5 つのタイプがあります。
  • コマンド フックtype: "command"): シェル コマンドを実行します。スクリプトはイベントのJSON 入力を stdin で受け取り、終了コードと stdout を通じて結果を通信します。
  • HTTP フックtype: "http"): イベントの JSON 入力を HTTP POST リクエストとして URL に送信します。エンドポイントは、コマンド フックと同じJSON 出力形式を使用して、レスポンス本体を通じて結果を通信します。
  • MCP ツール フックtype: "mcp_tool"): 既に接続されているMCP サーバー上のツールを呼び出します。ツールのテキスト出力はコマンド フック stdout のように扱われます。
  • プロンプト フックtype: "prompt"): Claude モデルにプロンプトを送信して、単一ターンの評価を行います。モデルは yes/no 決定を JSON として返します。プロンプト ベースのフックを参照してください。
  • エージェント フックtype: "agent"): Read、Grep、Glob などのツールを使用して条件を検証してから決定を返すことができるサブエージェントを生成します。エージェント フックは実験的であり、変更される可能性があります。エージェント ベースのフックを参照してください。

共通フィールド

これらのフィールドはすべてのフック タイプに適用されます。
フィールド必須説明
typeはい"command""http""mcp_tool""prompt"、または "agent"
ifいいえ"Bash(git *)" または "Edit(*.ts)" などの権限ルール構文を使用してこのフックが実行されるタイミングをフィルタリングします。ツール呼び出しがパターンにマッチする場合のみ、フックが生成されます。または Bash コマンドが解析するには複雑すぎる場合。ツール イベントでのみ評価されます。PreToolUsePostToolUsePostToolUseFailurePermissionRequestPermissionDenied。他のイベントでは、if が設定されたフックは実行されません。権限ルールと同じ構文を使用します
timeoutいいえキャンセルまでの秒数。デフォルト: commandhttpmcp_tool は 600、prompt は 30、agent は 60。UserPromptSubmitcommandhttpmcp_tool のデフォルトを 30 に低下させ、MessageDisplay はそれを 10 に低下させます
statusMessageいいえフックの実行中に表示されるカスタム スピナー メッセージ
onceいいえtrue の場合、セッションごとに 1 回だけ実行してから削除されます。スキル フロントマターでのみ尊重されます。設定ファイルとエージェント フロントマターでは無視されます
if フィールドは正確に 1 つの権限ルールを保持します。ルールを組み合わせるための &&||、またはリスト構文はありません。複数の条件を適用するには、各条件に対して個別のフック ハンドラーを定義します。Bash の場合、ルールは先頭の VAR=value 割り当てが削除された後のツール入力の各サブコマンドに対してマッチされるため、if: "Bash(git push *)"FOO=bar git pushnpm test && git push の両方にマッチします。コマンドが解析するには複雑すぎる場合、いずれかのサブコマンドがマッチすると、またはいつでもフックが実行されます。

コマンド フック フィールド

共通フィールドに加えて、コマンド フックはこれらのフィールドを受け入れます。
フィールド必須説明
commandはい実行するシェル コマンド。args を使用する場合、直接生成する実行可能ファイル。Exec フォームとシェル フォームを参照してください
argsいいえ引数リスト。存在する場合、command は実行可能ファイルとして解決され、args を引数ベクトルとして直接生成されます。シェルは関与しません。Exec フォームとシェル フォームを参照してください
asyncいいえtrue の場合、ブロックせずにバックグラウンドで実行されます。バックグラウンドでフックを実行を参照してください
asyncRewakeいいえtrue の場合、バックグラウンドで実行され、終了コード 2 で Claude を起動します。async を暗黙的に指定します。フックの stderr、または stderr が空の場合は stdout が、Claude がシステム リマインダーとして長時間実行されるバックグラウンド失敗に反応できるように表示されます
shellいいえこのフックに使用するシェル。"bash"(デフォルト)または "powershell" を受け入れます。"powershell" を設定すると、Windows 上で PowerShell 経由でコマンドが実行されます。CLAUDE_CODE_USE_POWERSHELL_TOOL は不要です。フックは PowerShell を直接生成するため。args が設定されている場合は無視されます
Exec フォームとシェル フォーム
コマンド フックは args が設定されている場合は exec フォームで実行され、args が省略されている場合はシェル フォームで実行されます。フックがパス プレースホルダーを参照する場合は常に args を設定してください。各要素は引用符なしで 1 つの引数として渡されるためです。パイプや && などのシェル機能が必要な場合、または両方の懸念が適用されない場合は args を省略してください。 Exec フォームargs が存在する場合に実行されます。Claude Code は commandPATH 上の実行可能ファイルとして解決し、args を引数ベクトルとして直接生成します。シェルがないため、各 args 要素は記述されたとおりに正確に 1 つの引数であり、${CLAUDE_PLUGIN_ROOT} などのパス プレースホルダーは command と各 args 要素にプレーン文字列として置換されます。アポストロフィ、$、バッククォートなどの特殊文字は、シェルが解釈しないため、そのまま渡されます。プラットフォーム上でシェル トークン化は発生しません。 シェル フォームargs が存在しない場合に実行されます。command 文字列はシェルに渡されます。macOS と Linux では sh -c、Windows では Git Bash、または Git Bash がインストールされていない場合は PowerShell。shell フィールドを設定して明示的に選択します。シェルは文字列をトークン化し、変数を展開し、パイプ、&&、リダイレクト、グロブを解釈します。
Windows では、exec フォームは command.exe などの実際の実行可能ファイルに解決されることが必要です。npm、npx、eslint、およびその他のツールが node_modules/.bin にインストールする .cmd.bat シムは実行可能ファイルではなく、シェルなしで生成することはできません。exec フォームでそれらを実行するには、基になるスクリプトを node で直接呼び出します。例えば "command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/node_modules/eslint/bin/eslint.js"]node プラス スクリプト パス パターンは、node.exe が実際のバイナリであるため、すべてのプラットフォームで機能します。.cmd または .bat シムを名前で実行するには、シェル フォームを使用します。
この例は、プラグインにバンドルされた Node スクリプトを実行します。Exec フォームは解決されたスクリプト パスを引用符なしで 1 つの引数として渡します。
{
  "type": "command",
  "command": "node",
  "args": ["${CLAUDE_PLUGIN_ROOT}/scripts/format.js", "--fix"]
}
同等のシェル フォームは、スペースまたは特殊文字を含むパスを処理するために引用符が必要です。
{
  "type": "command",
  "command": "node \"${CLAUDE_PLUGIN_ROOT}\"/scripts/format.js --fix"
}
両方のフォームは同じパス プレースホルダーをサポートし、両方とも生成されたプロセスで環境変数 CLAUDE_PROJECT_DIRCLAUDE_PLUGIN_ROOTCLAUDE_PLUGIN_DATA としてエクスポートするため、スクリプトは起動方法に関係なく process.env.CLAUDE_PLUGIN_ROOT を読み取ることができます。プラグイン フックは追加で ${user_config.*} 値を置換します。ユーザー設定を参照してください。
Exec フォームでは、command は実行可能ファイル名またはパスのみです。command が空白を含むパス区切りなしの名前であり、args と一緒に空白を含む場合、Claude Code は警告をログします。生成が失敗するためです。node script.js という名前の実行可能ファイルはありません。余分なトークンを args に移動します。C:\Program Files\nodejs\node.exe などのスペースを含む絶対パスは、単一の有効な実行可能ファイルであり、警告をトリガーしません。

HTTP フック フィールド

共通フィールドに加えて、HTTP フックはこれらのフィールドを受け入れます。
フィールド必須説明
urlはいPOST リクエストを送信する URL
headersいいえキー値ペアとしての追加 HTTP ヘッダー。値は $VAR_NAME または ${VAR_NAME} 構文を使用した環境変数補間をサポートします。allowedEnvVars にリストされている変数のみが解決されます
allowedEnvVarsいいえヘッダー値に補間される可能性のある環境変数名のリスト。リストされていない変数への参照は空の文字列に置き換えられます。環境変数補間が機能するために必須
Claude Code はフックのJSON 入力Content-Type: application/json の POST リクエスト本体として送信します。レスポンス本体はコマンド フックと同じJSON 出力形式を使用します。 エラー処理はコマンド フックと異なります。2xx 以外のレスポンス、接続失敗、タイムアウトはすべて、実行を続行できる非ブロッキング エラーを生成します。ツール呼び出しをブロックまたは権限を拒否するには、decision: "block" または hookSpecificOutput を含む permissionDecision: "deny" を含む JSON 本体を持つ 2xx レスポンスを返します。 この例は PreToolUse イベントをローカル検証サービスに送信し、MY_TOKEN 環境変数からのトークンで認証します。
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "http",
            "url": "http://localhost:8080/hooks/pre-tool-use",
            "timeout": 30,
            "headers": {
              "Authorization": "Bearer $MY_TOKEN"
            },
            "allowedEnvVars": ["MY_TOKEN"]
          }
        ]
      }
    ]
  }
}

MCP ツール フック フィールド

共通フィールドに加えて、MCP ツール フックはこれらのフィールドを受け入れます。
フィールド必須説明
serverはい設定された MCP サーバーの名前。サーバーは既に接続されている必要があります。フックは OAuth または接続フローをトリガーしません
toolはいそのサーバー上で呼び出すツールの名前
inputいいえツールに渡される引数。文字列値は、フックのJSON 入力から ${path} 置換をサポートします(例:"${tool_input.file_path}"
ツールのテキスト コンテンツはコマンド フック stdout のように扱われます。有効なJSON 出力として解析される場合、決定として処理されます。そうでない場合は、プレーン テキストとして表示されます。指定されたサーバーが接続されていない場合、またはツールが isError: true を返す場合、フックは非ブロッキング エラーを生成し、実行は続行されます。 MCP ツール フックは、Claude Code が MCP サーバーに接続した後、すべてのフック イベントで利用可能です。SessionStartSetup は通常、サーバーが接続を完了する前に発火するため、これらのイベント上のフックは最初の実行時に「接続されていない」エラーを予期する必要があります。 この例は、各 Write または Edit の後、my_server MCP サーバー上の security_scan ツールを呼び出し、編集されたファイルのパスを渡します。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "mcp_tool",
            "server": "my_server",
            "tool": "security_scan",
            "input": { "file_path": "${tool_input.file_path}" }
          }
        ]
      }
    ]
  }
}

プロンプト フックとエージェント フック フィールド

共通フィールドに加えて、プロンプト フックとエージェント フックはこれらのフィールドを受け入れます。
フィールド必須説明
promptはいモデルに送信するプロンプト テキスト。フック入力 JSON のプレースホルダーとして $ARGUMENTS を使用します
modelいいえ評価に使用するモデル。デフォルトは高速モデル
すべてのマッチング フックは並列で実行され、同一のハンドラーは自動的に重複排除されます。コマンド フックはコマンド文字列と args で重複排除され、HTTP フックは URL で重複排除されます。ハンドラーは Claude Code の環境を持つ現在のディレクトリで実行されます。$CLAUDE_CODE_REMOTE 環境変数はリモート Web 環境で "true" に設定され、ローカル CLI では設定されません。

パスでフック スクリプトを参照

フックが実行されるときの作業ディレクトリに関係なく、プロジェクトまたはプラグイン ルートを基準にしてフック スクリプトを参照するには、これらのプレースホルダーを使用します。
  • ${CLAUDE_PROJECT_DIR}: プロジェクト ルート。Claude Code はこの変数をstdio MCP サーバーとプラグイン LSP サーバーの環境にも設定します。
  • ${CLAUDE_PLUGIN_ROOT}: プラグインのインストール ディレクトリ、プラグインにバンドルされたスクリプト用。プラグイン更新時に変更されます。
  • ${CLAUDE_PLUGIN_DATA}: プラグインの永続データ ディレクトリ、プラグイン更新を通じて存続すべき依存関係と状態用。
パス プレースホルダーを参照するフックにはexec フォームを優先してください。Exec フォームは各 args 要素を引用符なしで 1 つの引数として渡すため、スペースまたは特殊文字を含むパスは引用符が不要です。シェル フォームでは、各プレースホルダーをダブル クォートで囲みます。
この例は ${CLAUDE_PROJECT_DIR} を使用して、Write または Edit ツール呼び出しの後、プロジェクトの .claude/hooks/ ディレクトリからスタイル チェッカーを実行します。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh",
            "args": []
          }
        ]
      }
    ]
  }
}

スキルとエージェントのフック

設定ファイルとプラグインに加えて、フックはスキルサブエージェントでフロントマターを使用して直接定義できます。これらのフックはコンポーネントのライフサイクルにスコープされ、そのコンポーネントがアクティブな場合にのみ実行されます。 すべてのフック イベントがサポートされています。サブエージェントの場合、Stop フックは自動的に SubagentStop に変換されます。これはサブエージェントが完了したときに発火するイベントです。 フックは設定ベースのフックと同じ設定形式を使用しますが、コンポーネントのライフタイムにスコープされ、完了時にクリーンアップされます。 このスキルは、各 Bash コマンドの前にセキュリティ検証スクリプトを実行する PreToolUse フックを定義します。
---
name: secure-operations
description: Perform operations with security checks
hooks:
  PreToolUse:
    - matcher: "Bash"
      hooks:
        - type: command
          command: "./scripts/security-check.sh"
---
エージェントは YAML フロントマターで同じ形式を使用します。

/hooks メニュー

Claude Code で /hooks と入力して、設定されたフックの読み取り専用ブラウザーを開きます。メニューはすべてのフック イベントを表示し、設定されたフックの数を示し、マッチャーにドリルダウンでき、各フック ハンドラーの完全な詳細を表示します。これを使用して設定を検証し、フックがどの設定ファイルから定義されたかを確認するか、フックのコマンド、プロンプト、または URL を検査します。 メニューは 5 つのフック タイプをすべて表示します。commandpromptagenthttpmcp_tool。各フックには、そのソースを示す [type] プレフィックスとソース ラベルが付けられています。
  • User: ~/.claude/settings.json から
  • Project: .claude/settings.json から
  • Local: .claude/settings.local.json から
  • Plugin: プラグインの hooks/hooks.json から
  • Session: 現在のセッション用にメモリに登録
  • Built-in: Claude Code によって内部的に登録
フックを選択すると、詳細ビューが開き、そのイベント、マッチャー、タイプ、ソース ファイル、および完全なコマンド、プロンプト、または URL が表示されます。メニューは読み取り専用です。フックを追加、変更、または削除するには、設定 JSON を直接編集するか、Claude にその変更を依頼してください。

フックを無効化または削除

フックを削除するには、設定 JSON ファイルからそのエントリを削除します。 すべてのフックを削除せずに一時的に無効化するには、設定ファイルで "disableAllHooks": true を設定します。個別のフックを設定に保持したまま無効化する方法はありません。 disableAllHooks 設定は管理設定階層を尊重します。管理者が管理ポリシー設定を通じてフックを設定している場合、ユーザー、プロジェクト、またはローカル設定で設定された disableAllHooks は、それらの管理フックを無効化できません。管理設定レベルで設定された disableAllHooks のみが管理フックを無効化できます。 設定ファイルのフックへの直接編集は通常、ファイル ウォッチャーによって自動的に取得されます。

フック入出力

コマンド フックは stdin 経由で JSON データを受け取り、終了コード、stdout、stderr を通じて結果を通信します。HTTP フックは同じ JSON をリクエスト本体として受け取り、HTTP レスポンス本体を通じて結果を通信します。このセクションでは、すべてのイベントに共通するフィールドと動作について説明します。フック イベントの各セクションには、その特定の入力スキーマと決定制御オプションが含まれています。 macOS と Linux では、コマンド フックは v2.1.139 以降、制御端末のない独自のセッションで実行されます。フック プロセスと子プロセスは /dev/tty を開くことも、エスケープ シーケンスを Claude Code インターフェイスに直接送信することもできません。Windows には /dev/tty がありません。任意のプラットフォームでユーザーにメッセージを表示するには、JSON 出力でsystemMessageを返します。デスクトップ通知をトリガーしたり、ウィンドウ タイトルを設定したり、ベルを鳴らしたりするには、代わりにterminalSequenceを返します。

共通入力フィールド

フック イベントは、各フック イベントセクションで説明されているイベント固有のフィールドに加えて、これらのフィールドを JSON として受け取ります。コマンド フックの場合、この JSON は stdin 経由で到着します。HTTP フックの場合、POST リクエスト本体として到着します。
フィールド説明
session_id現在のセッション識別子
transcript_path会話 JSON へのパス
cwdフックが呼び出されるときの現在の作業ディレクトリ
permission_mode現在の権限モード: "default""plan""acceptEdits""auto""dontAsk"、または "bypassPermissions"。すべてのイベントがこのフィールドを受け取るわけではありません。各イベントの JSON 例を確認してください
effortアクティブな努力レベルを保持する level フィールドを持つオブジェクト。ターンの場合: "low""medium""high""xhigh"、または "max"。リクエストされたモデル努力が現在のモデルがサポートしているものを超える場合、これはモデルが実際に使用したダウングレードされたレベルです。Ultracode は異なるレベルではなく、"xhigh" として報告されます。オブジェクトはステータス ラインeffort フィールドと一致します。PreToolUsePostToolUseStopSubagentStop などのツール使用コンテキスト内で発火するイベント、および現在のモデルが努力パラメータをサポートする場合に存在します。レベルは、フック コマンドと Bash ツールに $CLAUDE_EFFORT 環境変数として利用可能です。
hook_event_name発火したイベントの名前
--agent で実行するか、サブエージェント内で実行する場合、2 つの追加フィールドが含まれます。
フィールド説明
agent_idサブエージェントの一意の識別子。フックがサブエージェント呼び出し内で発火する場合にのみ存在します。これを使用して、サブエージェント フック呼び出しをメイン スレッド呼び出しから区別します。
agent_typeエージェント名(例えば、"Explore" または "security-reviewer")。セッションが --agent を使用するか、フックがサブエージェント内で発火する場合に存在します。サブエージェントの場合、サブエージェントのタイプがセッションの --agent 値よりも優先されます。カスタム サブエージェントの場合、これはエージェントのフロントマターの name フィールドであり、ファイル名ではありません。
SessionStart フックのみが model フィールドを受け取ります。$CLAUDE_MODEL 環境変数はありません。フック プロセスは親環境を継承するため、シェルで $ANTHROPIC_MODEL を設定した場合はそれを読み取ることができますが、セッション中に /model でモデルを切り替えるときにその値は変わりません。 例えば、Bash コマンドの PreToolUse フックは stdin で以下を受け取ります。
{
  "session_id": "abc123",
  "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",
  "cwd": "/home/user/my-project",
  "permission_mode": "default",
  "hook_event_name": "PreToolUse",
  "tool_name": "Bash",
  "tool_input": {
    "command": "npm test"
  }
}
tool_nametool_input フィールドはイベント固有です。各フック イベントセクションでは、そのイベントの追加フィールドについて説明しています。

終了コード出力

フック コマンドからの終了コードは、Claude Code にアクションが進行すべきか、ブロックされるべきか、無視されるべきかを伝えます。 終了 0 は成功を意味します。Claude Code は stdout をJSON 出力フィールドで解析します。JSON 出力は終了 0 でのみ処理されます。ほとんどのイベントでは、stdout はデバッグ ログに書き込まれますが、トランスクリプトには表示されません。例外は UserPromptSubmitUserPromptExpansion、および SessionStart で、stdout は Claude が見て行動できるコンテキストとして追加されます。 終了 2 はブロッキング エラーを意味します。Claude Code は stdout とそれ内の JSON を無視します。代わりに、stderr テキストがエラー メッセージとして Claude にフィードバックされます。効果はイベントに依存します。PreToolUse はツール呼び出しをブロックし、UserPromptSubmit はプロンプトを拒否します。完全なリストについては、終了コード 2 動作を参照してください。 その他の終了コード はほとんどのフック イベントの非ブロッキング エラーです。トランスクリプトは <hook name> hook error 通知を表示し、その後に stderr の最初の行が続くため、--debug なしで原因を特定できます。実行は続行され、完全な stderr はデバッグ ログに書き込まれます。 例えば、危険な Bash コマンドをブロックするフック コマンド スクリプト。
#!/bin/bash
# stdin から JSON 入力を読み取り、コマンドをチェック
command=$(jq -r '.tool_input.command' < /dev/stdin)

if [[ "$command" == rm* ]]; then
  echo "Blocked: rm commands are not allowed" >&2
  exit 2  # ブロッキング エラー: ツール呼び出しが防止される
fi

exit 0  # 決定なし: 通常の権限フローが適用される
ほとんどのフック イベントでは、終了コード 2 のみがアクションをブロックします。Claude Code は終了コード 1 を非ブロッキング エラーとして扱い、1 が従来の Unix 失敗コードであっても、アクションを進行させます。フックがポリシーを実施することを目的としている場合は、exit 2 を使用してください。例外は WorktreeCreate で、0 以外の終了コードはワークツリー作成を中止します。

イベントごとの終了コード 2 動作

終了コード 2 は、フックが「停止、これをしないでください」と通知する方法です。効果はイベントに依存します。一部のイベントはブロック可能なアクション(まだ発生していないツール呼び出しなど)を表し、他のイベントはすでに発生したか防止できないことを表すためです。
フック イベントブロック可能?終了 2 で何が起こるか
PreToolUseはいツール呼び出しをブロック
PermissionRequestはい権限を拒否
UserPromptSubmitはいプロンプト処理をブロックしてプロンプトを消去
UserPromptExpansionはい拡張をブロック
StopはいClaude が停止するのを防ぎ、会話を続行
SubagentStopはいサブエージェントが停止するのを防止
TeammateIdleはいチームメイトがアイドル状態になるのを防止(チームメイトが作業を続行)
TaskCreatedはいタスク作成をロールバック
TaskCompletedはいタスクが完了としてマークされるのを防止
ConfigChangeはい設定変更が有効になるのをブロック(policy_settings を除く)
StopFailureいいえ出力と終了コードは無視
PostToolUseいいえClaude に stderr を表示(ツールはすでに実行)
PostToolUseFailureいいえClaude に stderr を表示(ツールはすでに失敗)
PostToolBatchはい次のモデル呼び出しの前に agentic ループを停止
PermissionDeniedいいえ終了コードと stderr は無視(拒否はすでに発生)。JSON hookSpecificOutput.retry: true を使用してモデルが再試行できることを伝える
Notificationいいえユーザーのみに stderr を表示
SubagentStartいいえユーザーのみに stderr を表示
SessionStartいいえユーザーのみに stderr を表示
Setupいいえユーザーのみに stderr を表示
SessionEndいいえユーザーのみに stderr を表示
CwdChangedいいえユーザーのみに stderr を表示
FileChangedいいえユーザーのみに stderr を表示
PreCompactはいコンパクションをブロック
PostCompactいいえユーザーのみに stderr を表示
Elicitationはいelicitation を拒否
ElicitationResultはいレスポンスをブロック(アクションが decline になる)
WorktreeCreateはい0 以外の終了コードでワークツリー作成が失敗
WorktreeRemoveいいえ失敗はデバッグ モードでのみログ
InstructionsLoadedいいえ終了コードは無視
MessageDisplayいいえ元のテキストが表示される

HTTP レスポンス処理

HTTP フックは終了コードと stdout の代わりに HTTP ステータス コードとレスポンス本体を使用します。
  • 2xx で空の本体: 成功、終了コード 0 で出力なしと同等
  • 2xx でプレーン テキスト本体: 成功、テキストがコンテキストとして追加
  • 2xx で JSON 本体: 成功、コマンド フックと同じJSON 出力スキーマを使用して解析
  • 2xx 以外のステータス: 非ブロッキング エラー、実行は続行
  • 接続失敗またはタイムアウト: 非ブロッキング エラー、実行は続行
コマンド フックとは異なり、HTTP フックはステータス コードのみでブロッキング エラーを通知できません。ツール呼び出しをブロックまたは権限を拒否するには、適切な決定フィールドを含む JSON 本体を持つ 2xx レスポンスを返します。

JSON 出力

終了コードで許可またはブロックできますが、JSON 出力はより細かい制御を提供します。終了コード 2 でブロックする代わりに、終了 0 して stdout に JSON オブジェクトを出力します。Claude Code はその JSON から特定のフィールドを読み取り、ブロック、許可、またはユーザーへのエスカレーションを含む決定制御を通じた動作を制御します。
フックごとに 1 つのアプローチを選択する必要があります。両方ではありません。終了コードのみでシグナリングするか、終了 0 して構造化制御のために JSON を出力するかのいずれかです。Claude Code は終了 0 でのみ JSON を処理します。終了 2 の場合、JSON は無視されます。
フックの stdout には JSON オブジェクトのみが含まれている必要があります。シェル プロファイルがスタートアップ時にテキストを出力する場合、JSON 解析に干渉する可能性があります。トラブルシューティング ガイドのJSON 検証に失敗を参照してください。 フック出力文字列(additionalContextsystemMessage、およびプレーン stdout を含む)は 10,000 文字でキャップされます。この制限を超える出力はファイルに保存され、プレビューとファイル パスに置き換えられます。大きなツール結果と同じ方法で処理されます。 JSON オブジェクトは 3 種類のフィールドをサポートしています。
  • continue などのユニバーサル フィールドはすべてのイベント全体で機能します。これらは以下の表にリストされています。
  • トップレベルの decisionreason は一部のイベントで使用され、ブロックまたはフィードバックを提供します。
  • hookSpecificOutput はより豊かな制御が必要なイベント用のネストされたオブジェクトです。イベント名に設定された hookEventName フィールドが必要です。
フィールドデフォルト説明
continuetruefalse の場合、フックが実行された後、Claude は完全に処理を停止します。イベント固有の決定フィールドよりも優先されます
stopReasonなしcontinuefalse のときにユーザーに表示されるメッセージ。Claude には表示されません
suppressOutputfalsetrue の場合、デバッグ ログから stdout を非表示にします
systemMessageなしユーザーに表示される警告メッセージ
terminalSequenceなしClaude Code が代わりに発行するターミナル エスケープ シーケンス(デスクトップ通知、ウィンドウ タイトル、ベルなど)。OSC 0/1/2/9/99/777 と BEL に制限されます。値に許可リスト外のものが含まれている場合、フィールドは無視されます。/dev/tty が利用できないフックの代わりにこれを使用してください
Claude を完全に停止するには、イベント タイプに関係なく。
{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }

ターミナル通知を発行

terminalSequence フィールドには Claude Code v2.1.141 以降が必要です。 フックは制御端末なしで実行されるため、エスケープ シーケンスを /dev/tty に直接書き込むことは失敗します。代わりに、エスケープ シーケンスを terminalSequence フィールドで返し、Claude Code は独自のターミナル書き込みパスを通じてそれを発行します。これはレース フリーで、tmux と GNU screen 内で機能し、/dev/tty がない Windows で機能します。 フィールドは 1 つ以上の許可リストに登録されたエスケープ シーケンスの文字列を受け入れます。
  • OSC 012: ウィンドウとアイコン タイトル
  • OSC 9: iTerm2、ConEmu、Windows Terminal、WezTerm 通知(9;4 タスクバー進捗を含む)
  • OSC 99: Kitty 通知
  • OSC 777: urxvt、Ghostty、Warp 通知
  • 裸の BEL
シーケンスは BEL または ST で終了する場合があります。許可リスト外のもの(CSI カーソルと色シーケンス、OSC パレット シーケンス、OSC 8 ハイパーリンク、OSC 52 クリップボード書き込み、OSC 1337 を含む)は拒否され、フィールドは無視されます。 以下の例は Notification フックからデスクトップ通知を発火します。エスケープ シーケンスは printf 8 進数エスケープで構築されるため、制御バイトはシェル コマンド ラインに表示されず、jq -n --arg は JSON 出力を構築するため、通知メッセージの引用符、バックスラッシュ、改行は正しくエスケープされます。
#!/bin/bash
# Notification フック: Claude Code が注意を必要とするときにデスクトップに ping を送信します。
input=$(cat)
title="Claude Code'
body=$(jq -r '.message // 'Needs your attention'' <<<"$input")
seq=$(printf '\033]777;notify;%s;%s\007' "$title" "$body")
jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
{ "terminalSequence": "..." } の形状は、任意のシェルまたは言語から同じです。Windows では、PowerShell またはスクリプトでエスケープ文字列を構築し、同じ JSON オブジェクトを発行します。
terminalSequence は、以前に /dev/tty にエスケープ シーケンスを直接書き込んでいたフックの対応する置き換えです。許可リストはカーソルを移動したり色を変更したりできないシーケンスに制限されているため、フックはオンスクリーン プロンプトを破損することはできません。

Claude 用にコンテキストを追加

additionalContext フィールドは、フックから Claude のコンテキスト ウィンドウに文字列を渡します。Claude Code は文字列をシステム リマインダーでラップし、フックが発火した時点で会話に挿入します。Claude は次のモデル リクエストでリマインダーを読み取りますが、インターフェイスではチャット メッセージとして表示されません。 hookSpecificOutput 内でイベント名と一緒に additionalContext を返します。
{
  "hookSpecificOutput": {
    "hookEventName": "PostToolUse",
    "additionalContext": "This file is generated. Edit src/schema.ts and run `bun generate` instead."
  }
}
リマインダーが表示される場所はイベントに依存します。 複数のフックが同じイベントに対して additionalContext を返す場合、Claude はすべての値を受け取ります。値が 10,000 文字を超える場合、Claude Code はセッション ディレクトリ内のファイルに完全なテキストを書き込み、短いプレビューとファイル パスを Claude に渡します。 Claude が現在の環境の状態または実行されたばかりの操作について知っておくべき情報に additionalContext を使用します。
  • 環境状態: 現在のブランチ、デプロイ ターゲット、またはアクティブな機能フラグ
  • 条件付きプロジェクト ルール: 編集されたばかりのファイルに適用されるテスト コマンド、このワークツリーで読み取り専用のディレクトリ
  • 外部データ: 割り当てられたオープン イシュー、最近の CI 結果、内部サービスから取得されたコンテンツ
変わらない指示については、CLAUDE.mdを優先します。スクリプトを実行せずに読み込まれ、静的なプロジェクト規約の標準的な場所です。 テキストを命令型システム指示ではなく、事実的なステートメントとして記述します。「デプロイ ターゲットは本番環境です」または「このリポジトリは bun test を使用します」などのフレーズはプロジェクト情報として読み取られます。帯域外システム コマンドとしてフレーム化されたテキストは Claude のプロンプト インジェクション防御をトリガーする可能性があり、Claude がテキストをコンテキストとして扱う代わりに表示します。 注入されたテキストはセッション トランスクリプトに保存されます。PostToolUse または UserPromptSubmit などの中盤イベントの場合、--continue または --resume で再開すると、フックを再実行する代わりに保存されたテキストが再生されるため、タイムスタンプやコミット SHA などの値は再開時に古くなります。SessionStart フックは source"resume" に設定して再開時に再度実行されるため、コンテキストをリフレッシュできます。

決定制御

すべてのイベントが JSON を通じたブロッキングまたは動作制御をサポートしているわけではありません。サポートするイベントは、その決定を表現するために異なるフィールド セットを使用します。フックを書く前に、このテーブルをクイック リファレンスとして使用してください。
イベント決定パターンキー フィールド
UserPromptSubmit、UserPromptExpansion、PostToolUse、PostToolUseFailure、PostToolBatch、Stop、SubagentStop、ConfigChange、PreCompactトップレベル decisiondecision: "block"reason
TeammateIdle、TaskCreated、TaskCompleted終了コードまたは continue: false終了コード 2 はアクションをブロックし、stderr フィードバックを使用します。JSON {"continue": false, "stopReason": "..."} はチームメイト全体を停止し、Stop フック動作と一致します
PreToolUsehookSpecificOutputpermissionDecision(allow/deny/ask/defer)、permissionDecisionReason
PermissionRequesthookSpecificOutputdecision.behavior(allow/deny)
PermissionDeniedhookSpecificOutputretry: true はモデルが拒否されたツール呼び出しを再試行できることを伝える
WorktreeCreateパス戻り値コマンド フックは stdout にパスを出力します。HTTP フックは hookSpecificOutput.worktreePath 経由で返します。フック失敗またはパス欠落で作成が失敗
ElicitationhookSpecificOutputaction(accept/decline/cancel)、content(accept の場合のフォーム フィールド値)
ElicitationResulthookSpecificOutputaction(accept/decline/cancel)、content(フォーム フィールド値をオーバーライド)
MessageDisplayhookSpecificOutputdisplayContent は画面に表示されるテキストを置き換えます。表示のみ: トランスクリプトと Claude が見るものは元のままです
SessionStart、Setup、SubagentStartコンテキストのみhookSpecificOutput.additionalContext は Claude 用にコンテキストを追加します。SessionStart は initialUserMessagewatchPathssessionTitle、および reloadSkillsも受け入れます。ブロッキングまたは決定制御なし
WorktreeRemove、Notification、SessionEnd、PostCompact、InstructionsLoaded、StopFailure、CwdChanged、FileChangedなし決定制御なし。ログやクリーンアップなどの副作用に使用
各パターンの実行例を以下に示します。
UserPromptSubmitUserPromptExpansionPostToolUsePostToolUseFailurePostToolBatchStopSubagentStopConfigChangePreCompact で使用されます。唯一の値は "block" です。アクションを進行させるには、JSON から decision を省略するか、JSON なしで終了 0 で終了します。
{
  "decision": "block",
  "reason": "Test suite must pass before proceeding"
}
Bash コマンド検証、プロンプト フィルタリング、自動承認スクリプトを含む拡張例については、ガイドの自動化できることBash コマンド バリデーター リファレンス実装を参照してください。

フック イベント

各イベントは Claude Code のライフサイクル内のポイントに対応し、フックが実行できます。以下のセクションはライフサイクルに一致する順序で配置されています。セッション セットアップから agentic ループを経由してセッション終了まで。各セクションでは、イベントがいつ発火するか、サポートするマッチャー、受け取る JSON 入力、出力を通じた動作制御方法について説明しています。

SessionStart

Claude Code が新しいセッションを開始するか、既存のセッションを再開するときに実行されます。既存の問題や最近のコードベース変更など、開発コンテキストをロードしたり、環境変数をセットアップしたりするのに便利です。静的コンテキストでスクリプトが不要な場合は、代わりにCLAUDE.mdを使用してください。 SessionStart はすべてのセッションで実行されるため、これらのフックを高速に保ちます。type: "command"type: "mcp_tool" フックのみがサポートされています。 マッチャー値はセッションがどのように開始されたかに対応しています。
マッチャーいつ発火するか
startup新しいセッション
resume--resume--continue、または /resume
clear/clear
compact自動またはマニュアル コンパクション

SessionStart 入力

共通入力フィールドに加えて、SessionStart フックは sourcemodel、およびオプションで agent_typesession_title を受け取ります。source フィールドはセッションがどのように開始されたかを示します。新しいセッションの場合は "startup"、再開されたセッションの場合は "resume"/clear の後は "clear"、コンパクション後は "compact"model フィールドはモデル識別子を含みます。claude --agent <name> で Claude Code を開始する場合、agent_type フィールドはエージェント名を含みます。session_title フィールドは、例えば --name または /rename 経由で既に設定されている場合、現在のセッション タイトルを含みます。sessionTitle を発行するフックは、ユーザーが明示的に設定したタイトルを上書きしないように、最初に session_title をチェックできます。
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
  "cwd": "/Users/...",
  "hook_event_name": "SessionStart",
  "source": "startup",
  "model": "claude-sonnet-4-6"
}

SessionStart 決定制御

フック スクリプトが stdout に出力するテキストは Claude のコンテキストとして追加されます。すべてのフックで利用可能なJSON 出力フィールドに加えて、これらのイベント固有のフィールドを返すことができます。
フィールド説明
additionalContextClaude のコンテキストの開始時に追加される文字列。最初のプロンプトの前。Claude のコンテキストを追加を参照して、テキストがどのように配信されるか、何を含めるかを確認してください
initialUserMessageセッションの最初のユーザー メッセージとして使用される文字列。非対話型モード-p)で適用され、プロンプトが提供されない場合でも最初のターンになります。プロンプトが提供される場合、次のターンとして続きます。additionalContext とは異なり、既存のターンに付加されるのではなく、このターンを作成します
sessionTitleセッション タイトルを設定します。/rename と同じ効果があります。起動フォルダ、git ブランチ、またはワークツリー名からセッションを自動的に名前付けするのに使用します。source"startup" または "resume" の場合のみ適用されます。"clear""compact" では無視されます
watchPathsこのセッション中にFileChangedイベントを監視する絶対パスの配列
reloadSkillsブール値。true の場合、Claude Code は SessionStart フックが完了した後にスキルとコマンド ディレクトリを再スキャンするため、フックがインストールしたスキルは同じセッションで利用可能になり、最初のプロンプトから開始されます
{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "additionalContext": "Current branch: feat/auth-refactor\nUncommitted changes: src/auth.ts, src/login.tsx\nActive issue: #4211 Migrate to OAuth2",
    "sessionTitle": "auth-refactor"
  }
}
このイベントではプレーン stdout が既に Claude に到達するため、コンテキストのみをロードするフックは JSON を構築せずに stdout に直接出力できます。suppressOutputsessionTitle などの他のフィールドとコンテキストを組み合わせる必要がある場合は JSON 形式を使用します。 SessionStart フックがスキルをインストールまたは更新する場合は reloadSkills を使用します。スキル検出は通常 SessionStart フックが完了する前に実行されるため、フックが ~/.claude/skills/ または .claude/skills/ に書き込むファイルは、それ以外の場合は次のセッションにのみ表示されます。この例は共有スキル リポジトリを同期し、再スキャンをリクエストします。
#!/bin/bash

git -C ~/.claude/skills/team-skills pull --quiet 2>/dev/null || \
  git clone --quiet https://git.example.com/your-org/team-skills.git ~/.claude/skills/team-skills

echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'

環境変数を永続化

SessionStart フックは CLAUDE_ENV_FILE 環境変数にアクセスでき、後続の Bash コマンド用に環境変数を永続化できるファイル パスを提供します。 個別の環境変数を設定するには、export ステートメントを CLAUDE_ENV_FILE に書き込みます。他のフックで設定された変数を保持するには、追加(>>)を使用します。
#!/bin/bash

if [ -n "$CLAUDE_ENV_FILE" ]; then
  echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"
  echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"
  echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"
fi

exit 0
環境からのすべての変更をキャプチャするには、セットアップ コマンドの前後でエクスポートされた変数を比較します。
#!/bin/bash

ENV_BEFORE=$(export -p | sort)

# 環境を変更するセットアップ コマンドを実行
source ~/.nvm/nvm.sh
nvm use 20

if [ -n "$CLAUDE_ENV_FILE" ]; then
  ENV_AFTER=$(export -p | sort)
  comm -13 <(echo "$ENV_BEFORE") <(echo "$ENV_AFTER") >> "$CLAUDE_ENV_FILE"
fi

exit 0
このファイルに書き込まれた変数は、セッション中に Claude Code が実行するすべての後続の Bash コマンドで利用可能になります。
CLAUDE_ENV_FILE は SessionStart、SetupCwdChangedFileChangedフックで利用可能です。他のフック タイプはこの変数にアクセスできません。

Setup

--init-only で Claude Code を起動するか、プリント モード(-p)で --init または --maintenance で起動するときのみ発火します。通常のスタートアップでは発火しません。CI またはスクリプトから明示的にトリガーする 1 回限りの依存関係インストールまたはスケジュール済みクリーンアップに使用します。通常のセッション スタートアップとは別です。セッションごとの初期化の場合は、代わりにSessionStartを使用してください。 マッチャー値はフックをトリガーした CLI フラグに対応しています。
マッチャーいつ発火するか
initclaude --init-only または claude -p --init
maintenanceclaude -p --maintenance
--init-only は Setup フックと startup マッチャーを持つ SessionStart フックを実行してから、会話を開始せずに終了します。--init--maintenance-p(プリント モード)と組み合わせた場合のみ Setup フックを発火させます。対話型セッションでは、これら 2 つのフラグは現在 Setup フックを発火させません。 Setup はすべての起動で発火しないため、依存関係がインストールされている必要があるプラグインは Setup のみに依存できません。実用的なパターンは、最初の使用時に依存関係をチェックし、欠落している場合はインストールすることです。例えば、${CLAUDE_PLUGIN_DATA}/node_modules をテストし、欠落している場合は npm install を実行するフックまたはスキル。永続データ ディレクトリについては、永続データ ディレクトリを参照して、インストールされた依存関係を保存する場所を確認してください。

Setup 入力

共通入力フィールドに加えて、Setup フックは trigger フィールドを受け取ります。これは "init" または "maintenance" に設定されます。
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
  "cwd": "/Users/...",
  "hook_event_name": "Setup",
  "trigger": "init"
}

Setup 決定制御

Setup フックはブロックできません。終了コード 2 では、stderr がユーザーに表示されます。その他の非ゼロ終了コードでは、stderr は --verbose で起動した場合のみ表示されます。どちらの場合も実行は続行されます。Claude のコンテキストに情報を渡すには、JSON 出力で additionalContext を返します。プレーン stdout はデバッグ ログにのみ書き込まれます。すべてのフックで利用可能なJSON 出力フィールドに加えて、これらのイベント固有のフィールドを返すことができます。
フィールド説明
additionalContextClaude のコンテキストに追加される文字列。複数のフックの値は連結されます
{
  "hookSpecificOutput": {
    "hookEventName": "Setup",
    "additionalContext": "Dependencies installed: node_modules, .venv"
  }
}
Setup フックは CLAUDE_ENV_FILE にアクセスできます。そのファイルに書き込まれた変数は、SessionStart フックと同じように、セッション中の後続の Bash コマンドに永続化されます。type: "command"type: "mcp_tool" フックのみがサポートされています。

InstructionsLoaded

CLAUDE.md または .claude/rules/*.md ファイルがコンテキストにロードされるときに発火します。このイベントはセッション開始時に熱心にロードされたファイルに対して発火し、後で Claude がネストされた CLAUDE.md を含むサブディレクトリにアクセスするときなど、遅延ロードされたファイルに対して再度発火します。または paths: フロントマターを持つ条件付きルールがマッチするとき。フックはブロッキングまたは決定制御をサポートしません。観測可能性の目的で非同期に実行されます。 マッチャーは load_reason に対して実行されます。例えば、"matcher": "session_start" を使用してセッション開始時にロードされたファイルのみに対して発火するか、"matcher": "path_glob_match|nested_traversal" を使用して遅延ロードのみに対して発火します。

InstructionsLoaded 入力

共通入力フィールドに加えて、InstructionsLoaded フックはこれらのフィールドを受け取ります。
フィールド説明
file_pathロードされた命令ファイルへの絶対パス
memory_typeファイルのスコープ: "User""Project""Local"、または "Managed"
load_reasonファイルがロードされた理由: "session_start""nested_traversal""path_glob_match""include"、または "compact""compact" 値はコンパクション イベント後に命令ファイルが再ロードされるときに発火します
globsファイルの paths: フロントマターからのパス グロブ パターン(存在する場合)。path_glob_match ロードの場合のみ存在
trigger_file_path遅延ロードの場合、このロードをトリガーしたファイルへのパス
parent_file_pathinclude ロードの場合、このファイルを含む親命令ファイルへのパス
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
  "cwd": "/Users/my-project",
  "hook_event_name": "InstructionsLoaded",
  "file_path": "/Users/my-project/CLAUDE.md",
  "memory_type": "Project",
  "load_reason": "session_start"
}

InstructionsLoaded 決定制御

InstructionsLoaded フックは決定制御がありません。命令ロードをブロックまたは変更できません。このイベントを監査ログ、コンプライアンス追跡、または観測可能性に使用します。

UserPromptSubmit

ユーザーがプロンプトを送信するときに実行されます。Claude がそれを処理する前に。これにより、プロンプト/会話に基づいて追加コンテキストを追加したり、プロンプトを検証したり、特定のタイプのプロンプトをブロックしたりできます。 UserPromptSubmit フックは commandhttpmcp_tool タイプのデフォルト タイムアウトが 30 秒で、他のイベントでのこれらのタイプの 600 秒のデフォルトより短くなっています。このフックはすべてのプロンプトの前に実行され、モデル処理がそれが完了するまでブロックされるため、スタックしたフックはセッションを停止させます。フックにより多くの時間が必要な場合は、フック エントリで timeout フィールドを設定します。

UserPromptSubmit 入力

共通入力フィールドに加えて、UserPromptSubmit フックはユーザーが送信したテキストを含む prompt フィールドを受け取ります。
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
  "cwd": "/Users/...",
  "permission_mode": "default",
  "hook_event_name": "UserPromptSubmit",
  "prompt": "Write a function to calculate the factorial of a number"
}

UserPromptSubmit 決定制御

UserPromptSubmit フックは、ユーザー プロンプトが処理されるかどうかを制御し、コンテキストを追加できます。すべてのJSON 出力フィールドが利用可能です。 終了コード 0 で会話にコンテキストを追加する 2 つの方法があります。
  • プレーン テキスト stdout: stdout に書き込まれた JSON 以外のテキストはコンテキストとして追加されます
  • additionalContext を含む JSON: より多くの制御のために以下の JSON 形式を使用します。additionalContext フィールドはコンテキストとして追加されます
プレーン stdout はトランスクリプトのフック出力として表示されます。additionalContext フィールドはより慎重に追加されます。 プロンプトをブロックするには、decision"block" に設定した JSON オブジェクトを返します。
フィールド説明
decision"block" はプロンプトが処理されるのを防ぎ、コンテキストから消去します。許可するには省略
reasondecision"block" のときにユーザーに表示されます。コンテキストに追加されません
additionalContextClaude のコンテキストに追加される文字列。Claude のコンテキストを追加を参照してください
sessionTitleセッション タイトルを設定します。プロンプト コンテンツに基づいてセッションを自動的に名前付けするのに使用
suppressOriginalPromptdecision"block" のときに true の場合、ユーザーに表示されるブロック メッセージから元のプロンプト テキストを省略
{
  "decision": "block",
  "reason": "Explanation for decision",
  "hookSpecificOutput": {
    "hookEventName": "UserPromptSubmit",
    "additionalContext": "My additional context here",
    "sessionTitle": "My session title"
  }
}
JSON 形式は単純なユースケースには必須ではありません。コンテキストを追加するには、終了コード 0 で stdout にプレーン テキストを出力できます。プロンプトをブロックしたい場合、またはより構造化された制御が必要な場合は JSON を使用します。

UserPromptExpansion

ユーザーが入力したスラッシュ コマンドが Claude に到達する前にプロンプトに展開されるときに実行されます。特定のコマンドを直接呼び出しからブロックしたり、特定のスキルのコンテキストを注入したり、ユーザーが呼び出すコマンドをログしたりするのに使用します。例えば、deploy にマッチするフックは、承認ファイルが存在しない限り /deploy をブロックできます。または、レビュー スキルにマッチするフックはチームのレビュー チェックリストを additionalContext として追加できます。 このイベントは PreToolUse がカバーしないパスをカバーします。PreToolUse フックが Skill ツールにマッチするのは Claude がツールを呼び出すときのみですが、/skillname を直接入力すると PreToolUse をバイパスします。UserPromptExpansion はその直接パスで発火します。 command_name でマッチします。マッチャーを空のままにして、すべてのプロンプト タイプのスラッシュ コマンドで発火します。

UserPromptExpansion 入力

共通入力フィールドに加えて、UserPromptExpansion フックは expansion_typecommand_namecommand_argscommand_source、および元の prompt 文字列を受け取ります。expansion_type フィールドはスキルとカスタム コマンドの場合は slash_command、MCP サーバー プロンプトの場合は mcp_prompt です。
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../00893aaf.jsonl",
  "cwd": "/Users/...",
  "permission_mode": "default",
  "hook_event_name": "UserPromptExpansion",
  "expansion_type": "slash_command",
  "command_name": "example-skill",
  "command_args": "arg1 arg2",
  "command_source": "plugin",
  "prompt": "/example-skill arg1 arg2"
}

UserPromptExpansion 決定制御

UserPromptExpansion フックは展開をブロックするか、コンテキストを追加できます。すべてのJSON 出力フィールドが利用可能です。
フィールド説明
decision"block" はスラッシュ コマンドが展開されるのを防止。許可するには省略
reasondecision"block" のときにユーザーに表示されます
additionalContext展開されたプロンプトと一緒に Claude のコンテキストに追加される文字列。Claude のコンテキストを追加を参照してください
{
  "decision": "block",
  "reason": "This slash command is not available",
  "hookSpecificOutput": {
    "hookEventName": "UserPromptExpansion",
    "additionalContext": "Additional context for this expansion"
  }
}

MessageDisplay

アシスタント メッセージが画面にストリーミングされている間に実行されます。Claude Code はメッセージを増分で表示します。新しく完了した行のバッチがレンダリング準備ができるたびに、フックはそれらの行で 1 回実行され、Claude Code はフックの置換テキストをその場所にレンダリングします。長いメッセージは複数の呼び出しを生成します。短いメッセージは 1 つだけ生成する可能性があります。 MessageDisplay を使用して Claude の応答を画面に表示されるときに再フォーマット、編集、または圧縮します。 Claude Code は各バッチをフックが返されるまで保持するため、フックを高速に保ちます。フックが失敗またはタイムアウトした場合、Claude Code は元のテキストを表示します。このイベントのデフォルト タイムアウトは 10 秒です。フックにより多くの時間が必要な場合は、フック エントリで timeout フィールドを設定します。 MessageDisplay は表示のみです。置換テキストは画面にレンダリングされるものだけを変更します。トランスクリプトと Claude が見るものは元のテキストを保持するため、Claude は置換を見ず、詳細モードは元のテキストを表示します。フックはアシスタント メッセージ テキストのみを受け取るため、ツール結果とユーザーが入力したテキストは変更されずにレンダリングされます。 MessageDisplay はマッチャーをサポートせず、テキストをストリーミングするすべてのアシスタント メッセージに対して発火します。テキストなしのメッセージ(ツール呼び出しのみの応答など)はそれをトリガーしません。 非対話型実行(Agent SDK クエリと claude -p を含む)では、MessageDisplay はメッセージごとに行のバッチごとに 1 回ではなく 1 回実行されます。単一の呼び出しはメッセージが完了した後に到着し、完全なメッセージ テキストを含みます。index0finaltruedelta は全体メッセージを保持します。各メッセージの delta テキストを収集するフックは、両方のモードで同じ合計テキストを受け取ります。

MessageDisplay 入力

共通入力フィールドに加えて、MessageDisplay フックはターンとメッセージの識別子、この呼び出しのメッセージ内での位置、および delta の新しいテキストを受け取ります。バッチ境界はテキストがどのようにストリーミングされるかに依存するため、行が特定の方法でグループ化されることを期待するのではなく、indexfinal を使用してメッセージを通じた進行状況を追跡します。
フィールド説明
turn_id現在のターンの UUID
message_id表示されるアシスタント メッセージの UUID。メッセージの同じバッチ全体で安定しています。これは API msg_… id ではないため、トランスクリプト メッセージ id と相関させることはできません
indexメッセージ内のこのバッチのゼロベースのインデックス
finalメッセージの最後のバッチで true。各メッセージは正確に 1 つの最終バッチを持ちます
delta前のバッチ以降の新しく完了した行。終了改行を含みます。常に完全な行です。ただし、最終バッチは行の途中で終わる可能性があります。対話型実行では、メッセージが改行で終わるときの最終バッチの delta は空なので、final ではなく、メッセージの終了信号として final を処理します。Agent SDK と claude -p 実行では、単一の呼び出しが全体メッセージを含みます
{
  "session_id": "abc123",
  "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
  "cwd": "/Users/my-project",
  "hook_event_name": "MessageDisplay",
  "turn_id": "0c9e6a2f-7d41-4f4e-9a15-3f4f7c2b8d10",
  "message_id": "5b2a9c8e-1f63-4d8a-b7c4-9e0d2a6f1c3b",
  "index": 0,
  "final": false,
  "delta": "Here is the plan:\n"
}

MessageDisplay 出力

すべてのフックで利用可能なJSON 出力フィールドに加えて、MessageDisplay フックは displayContent を返して画面上の delta を置き換えることができます。
フィールド説明
displayContentdelta の代わりに表示されるテキスト。元のテキストを表示するには省略
MessageDisplay フックは決定制御がありません。メッセージをブロックしたり、トランスクリプトに保存されたもの、または Claude に送信されたものを変更することはできません。 この例は Claude の応答からマークダウン フォーマットを削除して、プレーン テキスト表示を行います。スクリプトは stdin から各バッチを読み取り、delta から太字マーカーとインライン コード バッククォートを削除し、結果を displayContent として返します。
設定ファイルでイベントのコマンド フックを登録します。
{
  "hooks": {
    "MessageDisplay": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/plain-display.sh",
            "args": []
          }
        ]
      }
    ]
  }
}
このスクリプトをプロジェクトの .claude/hooks/plain-display.sh に保存し、chmod +x で実行可能にします。
#!/bin/bash
jq '{hookSpecificOutput: {hookEventName: "MessageDisplay", displayContent: (.delta | gsub("\\*\\*"; "") | gsub("`"; ""))}}'
スクリプトは PATHjq が必要です。
マークダウンなしのバッチは変更されずに通過します。スクリプトが失敗した場合(例えば、jq が欠落している場合)、Claude Code は元のテキストを表示し、セッションではなくデバッグ出力でのみ失敗を記録します。

PreToolUse

Claude がツール パラメーターを作成した後、ツール呼び出しを処理する前に実行されます。ツール名でマッチします。BashEditWriteReadGlobGrepAgentWebFetchWebSearchAskUserQuestionExitPlanMode、および任意のMCP ツール名 PreToolUse 決定制御を使用して、ツール呼び出しを許可、拒否、質問、または遅延します。

PreToolUse 入力

共通入力フィールドに加えて、PreToolUse フックは tool_nametool_inputtool_use_id を受け取ります。tool_input フィールドはツールに依存します。
Bash
シェル コマンドを実行します。
フィールドタイプ説明
command文字列"npm test"実行するシェル コマンド
description文字列"Run test suite"コマンドが何をするかのオプション説明
timeout数値120000ミリ秒単位のオプション タイムアウト
run_in_backgroundブール値falseコマンドをバックグラウンドで実行するかどうか
Write
ファイルを作成または上書きします。
フィールドタイプ説明
file_path文字列"/path/to/file.txt"書き込むファイルへの絶対パス
content文字列"file content"ファイルに書き込むコンテンツ
Edit
既存ファイル内の文字列を置換します。
フィールドタイプ説明
file_path文字列"/path/to/file.txt"編集するファイルへの絶対パス
old_string文字列"original text"検索して置換するテキスト
new_string文字列"replacement text"置換テキスト
replace_allブール値falseすべての出現を置換するかどうか
Read
ファイル コンテンツを読み取ります。
フィールドタイプ説明
file_path文字列"/path/to/file.txt"読み取るファイルへの絶対パス
offset数値10読み取りを開始する行番号のオプション
limit数値50読み取る行数のオプション
Glob
グロブ パターンにマッチするファイルを検索します。
フィールドタイプ説明
pattern文字列"**/*.ts"ファイルにマッチするグロブ パターン
path文字列"/path/to/dir"検索するオプション ディレクトリ。デフォルトは現在の作業ディレクトリ
Grep
正規表現でファイル コンテンツを検索します。
フィールドタイプ説明
pattern文字列"TODO.*fix"検索する正規表現パターン
path文字列"/path/to/dir"検索するオプション ファイルまたはディレクトリ
glob文字列"*.ts"ファイルをフィルタリングするオプション グロブ パターン
output_mode文字列"content""content""files_with_matches"、または "count"。デフォルトは "files_with_matches"
-iブール値true大文字小文字を区別しない検索
multilineブール値false複数行マッチングを有効化
WebFetch
Web コンテンツを取得して処理します。
フィールドタイプ説明
url文字列"https://example.com/api"コンテンツを取得する URL
prompt文字列"Extract the API endpoints"取得したコンテンツで実行するプロンプト
WebSearch
Web を検索します。
フィールドタイプ説明
query文字列"react hooks best practices"検索クエリ
allowed_domains配列["docs.example.com"]オプション: これらのドメインからのみ結果を含める
blocked_domains配列["spam.example.com"]オプション: これらのドメインからの結果を除外
Agent
サブエージェントを生成します。
フィールドタイプ説明
prompt文字列"Find all API endpoints"エージェントが実行するタスク
description文字列"Find API endpoints"タスクの短い説明
subagent_type文字列"Explore"使用する特殊エージェントのタイプ
model文字列"sonnet"デフォルトをオーバーライドするオプション モデル エイリアス
PostToolUse では、完了した Agent 呼び出しの tool_response はサブエージェントの最終テキストと使用テレメトリを含みます。フックからサブエージェント単位のコストを記録するためにこれらのフィールドを読み取ります。
フィールドタイプ説明
status文字列"completed"同期呼び出しの場合は "completed"run_in_background: true の場合は "async_launched"
agentId文字列"a4d2c8f1e0b3a297"サブエージェント実行の識別子
content配列[{"type": "text", "text": "Found 12 endpoints..."}]サブエージェントの最終テキスト ブロック
totalTokens数値12450サブエージェントのターン全体で請求されたトークン合計
totalDurationMs数値48211サブエージェント実行の実時間
totalToolUseCount数値7サブエージェントが行ったツール呼び出しの数
usageオブジェクト{"input_tokens": 8320, ...}タイプ別トークン分解: input_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokens
run_in_background: true 呼び出しの場合、ツールはサブエージェント起動後すぐに返されるため、tool_response は使用フィールドを含みません。status: "async_launched"agentIddescriptionpromptoutputFile を含みます。
AskUserQuestion
ユーザーに 1 つから 4 つの複数選択肢の質問をします。
フィールドタイプ説明
questions配列[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]提示する質問。各質問には question 文字列、短い headeroptions 配列、およびオプションの multiSelect フラグがあります
answersオブジェクト{"Which framework?": "React"}オプション。質問テキストを選択されたオプション ラベルにマップします。複数選択の回答はラベルをコンマで結合します。Claude はこのフィールドを設定しません。updatedInput 経由で提供して、プログラムで回答します
ExitPlanMode
Claude がプラン モードを離れる前にプランを提示し、ユーザーに承認を求めます。Claude はツールを呼び出す前にプランをディスク上のファイルに書き込むため、モデルからのリテラル tool_inputallowedPrompts のみを含みます。Claude Code はプラン コンテンツとファイル パスをフックに渡す前に注入します。
フィールドタイプ説明
plan文字列"## Refactor auth\n1. Extract..."Markdown のプラン コンテンツ。ディスク上のプラン ファイルから注入
planFilePath文字列"/Users/.../plans/refactor-auth.md"プラン ファイルへのパス。注入
allowedPrompts配列[{"tool": "Bash", "prompt": "run tests"}]オプション。Claude がプランを実装するために要求しているプロンプト ベースの権限。各エントリは tool 名とアクションのカテゴリを説明する prompt を含みます
PostToolUse では、tool_responseplanfilePath フィールドを含むオブジェクトで、承認されたプランと内部ステータス フラグを保持します。ディスクからファイルを再度読み取るのではなく、tool_response.plan でプラン コンテンツを読み取ります。

PreToolUse 決定制御

PreToolUse フックはツール呼び出しが進行するかどうかを制御できます。トップレベル decision フィールドを使用する他のフックとは異なり、PreToolUse は hookSpecificOutput オブジェクト内に決定を返します。これにより、より豊かな制御が可能になります。4 つの結果(許可、拒否、質問、遅延)と、実行前にツール入力を変更する機能。
フィールド説明
permissionDecision"allow" はツール呼び出しをスキップします。"deny" はツール呼び出しを防止します。"ask" はユーザーに確認を促します。"defer" は優雅に終了して、ツールを後で再開できるようにします。拒否と質問ルールは、フックが返す内容に関係なく引き続き評価されます
permissionDecisionReason"allow""ask" の場合、ユーザーに表示されますが Claude には表示されません。"deny" の場合、Claude に表示されます。"defer" の場合、無視されます
updatedInput実行前にツールの入力パラメーターを変更します。入力オブジェクト全体を置き換えるため、変更されていないフィールドを変更されたフィールドと一緒に含めます。"allow" と組み合わせて自動承認するか、"ask" と組み合わせて変更された入力をユーザーに表示します。"defer" の場合、無視されます
additionalContextツール実行前に Claude のコンテキストに追加される文字列。"defer" の場合、無視されます。Claude のコンテキストを追加を参照してください
複数の PreToolUse フックが異なる決定を返す場合、優先順位は deny > defer > ask > allow です。 フックが "ask" を返すと、ユーザーに表示される権限プロンプトには、フックの出所を識別するラベルが含まれます。例えば、[User][Project][Plugin]、または [Local]。これにより、ユーザーはどの設定ソースが確認を要求しているかを理解できます。