できること
ループに処理を差し込む
エージェントループの途中で、スクリプトや MCP ツールを実行できます。MCP ツールのフックでは、ライフサイクルイベントから接続済みの MCP サーバーのツールを呼び出せます。
プロンプトや操作を止める
UserPromptSubmit フックはプロンプトを止められます。PreToolUse フックは Bash、apply_patch によるファイル編集、MCP ツールの呼び出しなどに割り込み、ツール呼び出しを書き換えることもできます。
終了・中断時の処理
SessionEnd フックでセッション終了時にコマンドを実行できます。Interrupt フックは、メインスレッドで実行中のターンを中断したときに実行され、中断の記録や、フックが始めた作業の片付けに使えます。
機能解説
概要
たとえば、チームのプロンプトを走査して API キーの誤った貼り付けを止める使い方があります。フックは既定で有効です。
Hooks は Codex の拡張の仕組みで、エージェントループの途中でスクリプトや MCP ツールを実行します。
- Codex は、有効な設定レイヤーの隣にある
hooks.jsonファイル、またはconfig.toml内のインラインの[hooks]テーブルからフックを見つけます。読み込み元が複数あるときは、条件に合うフックをすべて読み込みます。 - プラグインが有効なときは、ユーザー・プロジェクト・管理のフックと並べて、そのプラグインのライフサイクルフックも読み込めます。
- ハンドラーの種類は
commandとmcp_toolに対応しています。promptとagentのハンドラーは解析されますが、実行はされません。 matcherフィールドは正規表現の文字列で、フックが発火する条件を絞り込みます。- 同じイベントに一致する複数のコマンドフックは同時に起動するため、あるフックが別の一致するフックの起動を妨げることはありません。
イベントごとの動き
UserPromptSubmit:decision: "block"と理由を返すと、プロンプトを止めます。PreToolUse: Bash、apply_patchによるファイル編集、MCP ツールの呼び出し、その他のローカル関数ツールに割り込めます。permissionDecision: "allow"とupdatedInputを返すと、止めずに対応ツールの呼び出しを書き換えます。PermissionRequest: Codex が承認を求める直前に実行され、許可・拒否のほか、判断せずに通常の承認プロンプトへ進めることもできます。PostToolUse: 対応ツールが出力を返した後に実行されます。すでに実行されたツールの副作用は取り消せません。PreModelRequest/PostModelRequest: 同じターン内の再試行も含めて、モデルへのリクエストを記録できます。出力は診断用で、モデルのコンテキストを変えたりリクエストを止めたりはできません。Stop:decision: "block"を返すと、Codex は処理を続け、フックの理由を本文とする継続プロンプトを新しいユーザープロンプトとして自動で作ります。SessionEnd: セッション終了時にコマンドを実行します。最終メモの保存やファイルの片付けに使えます。サブエージェントでは実行されません。Interrupt: メインスレッドで実行中のターンを中断したときに実行されます。中断の記録や、フックが始めた作業の片付けに使えます。出力で中断を防いだり、ターンを再開したりはできません。
なお、WebSearch などのホスト型ツールはローカルの関数ツールのフック経路を通らないため、PreToolUse と PostToolUse は適用されません。
バックグラウンド実行と出力の扱い
既定では、Codex はコマンドフックの完了を待ってから、きっかけとなった操作を続けます。async を true にすると、Codex は処理を続けながらコマンドフックをバックグラウンドで実行します。hooks.json ではコマンドハンドラーに "async": true を、config.toml のインラインのフックでは async = true を設定します。バックグラウンドのフックは、きっかけとなった操作を止める・承認する・書き換えるなどの制御はできません。
モデルに見えるフック出力は、既定で 1 メッセージあたりおよそ 2,500 トークンまでです。これを超えると、全文を <temp_dir>/hook_outputs/<session_id>/<uuid>.txt に保存し、モデルには先頭と末尾のプレビューと保存先のパスを渡します。
MCP ツールのフックは既存の MCP 接続を使い、サーバーの起動や再接続は行いません。
管理者・導入時に確認したい点
- フックは既定で有効です。無効にするには、
config.tomlで次のように設定します。
[features]
hooks = false
allow_managed_hooks_only = trueを設定すると、ユーザー・プロジェクト・セッション・プラグインのフックを無視し、管理者が管理するフックだけを許可します。- 読み込めない必須の管理フックがあるセッションは拒否されます。
- プロジェクト内のフックは、プロジェクトの
.codex/レイヤーが信頼されている場合だけ読み込まれます。 - Codex はフックの現在のハッシュに対して信頼を記録します。新規または変更されたフックはレビュー対象になり、信頼されるまで実行されません。
- Codex の外でフックの出どころを確認済みの単発の自動化では、
--dangerously-bypass-hook-trustを渡すと、その実行に限り保存済みの信頼なしで有効なフックを実行します。 - ツールのフックは有用なガードレールであり、完全な強制の境界としては扱わない位置付けです。
使い方
以下は、フックを定義して信頼するまでの基本の流れです。
- フックを
hooks.jsonファイル、またはconfig.tomlに定義します。置き場所としては~/.codex/や<repo>/.codex/が使いやすい場所です。 - CLI で
/hooksを使い、フックの読み込み元の確認、新規・変更されたフックのレビュー、フックの信頼、管理対象でない個別フックの無効化を行います。 - プラグインに同梱されたフックは、CLI では
/hooks、デスクトップアプリでは composer の Review hooks (フックをレビュー) を選ぶか、Settings (設定) > Hooks (フック) を開いてレビューし、信頼します。
利用シーン
チームのプロンプトを確認し、API キーの誤った貼り付けを止める場面に向いています。
Codex が承認を求める前に、決めたルールで許可・拒否を判断する場面に使えます。
セッション終了時に最終メモを保存したり、作業用のファイルを片付けたりする場面に使えます。
モデルへのリクエストを、同じターン内の再試行も含めて記録する場面に使えます。
Claude・Anthropic の対応する機能
比較の単位となる業務: エージェント実行のライフサイクルイベントに応じたコマンド・MCPツールの自動実行
大きなフック出力の扱いは、Codex と Claude Code の Hooks のどちらにもあります。Codex はモデルに見えるフック出力を既定で 1 メッセージあたりおよそ 2,500 トークンまでとし、超えた分はファイルに保存して先頭と末尾のプレビューを渡します。Claude Code では、5 万文字を超えるフック出力をコンテキストに直接入れず、ファイルパスとプレビュー付きでディスクに保存します。
管理フックだけを許可する設定も両方にあります。Codex では allow_managed_hooks_only = true で、ユーザー・プロジェクト・セッション・プラグインのフックを無視し、管理者が管理するフックを許可します。Claude Code では allowManagedHooksOnly が設定されているとき、管理設定で強制有効化されたプラグインのフックが実行されます。
PreToolUse フックの返し方にも違いがあります。Codex では permissionDecision: "allow" と updatedInput で、止めずにツール呼び出しを書き換えます。Claude Code では "defer" の許可判断があり、ヘッドレスセッションをツール呼び出しで一時停止し、-p --resume で再開してフックに再評価させます。
これまでの変更
実行中のトップレベルのターンが中断されたときにコマンドや MCP ハンドラーを実行する Interrupt フックと、許可リストに登録されたエグゼキュータープラグインの stop フックの実行が加わりました。
フックによるコマンドの非同期実行と MCP ツールの呼び出し、フック一覧での実行モードの表示、読み込めない必須の管理フックがあるセッションの拒否が加わりました。
権限フックによる厳格な自動レビューのリクエストの解決、実体化されたワークスペースプラグインのフックの信頼、スレッド終了時に実行される SessionEnd フック、フックのコンテキストのスピル上限の設定が加わりました。
Hooks が一般提供 (GA) になりました。
Codex アプリに、フックのアプリ内信頼レビューフローが追加されました。フックの設定が済む前でも Hooks 設定を開けます。
対象プランは公式のリリースノートには記載がありません。