本記事の位置づけ
本記事は2026年8月時点の公式ドキュメント(learn.chatgpt.com)と、当社の実運用にもとづく整理です。Hooksはイベント名や設定項目の追加が続いている領域のため、最新の一覧は公式ドキュメントでご確認ください。「必ず走らせたい処理はAIの判断の外に置く」という考え方自体は、仕様が変わっても変わりません。
Hooksとは — 実行ループの決まった場所に処理を差し込む
Hooksとは、Codexのエージェント実行ループの特定タイミングに、自分のスクリプトを差し込む仕組みです。コマンドを実行する前後、ツールを使うとき、タスクが完了したときなど、あらかじめ決められた地点で自動処理を走らせられます。
たとえばこんなことができます。危ないコマンドが実行されそうになったら止める。作業が終わるたびにログを1行残す。応答が完了したら通知を鳴らす。いずれも「毎回やってほしいが、毎回頼むのは現実的でない」たぐいの処理です。
AGENTS.md・Skills・Subagentsとの関係
Codexの仕組み化は、ルールを書くAGENTS.md、手順を束ねるSkills、役割を分けるSubagents、そして処理を差し込むHooksの4層で考えると整理できます。前の3つは「AIに読ませて、AIが判断して使うもの」。Hooksだけが「AIの判断を通らず、システム側で必ず実行されるもの」です。全体像は関連記事のCodexの応用機能まとめを参照してください。
差し込めるタイミングは3種類
フックを差し込めるタイミングを起動イベントと呼びます。イベント名は設定ファイルにそのまま書く項目なので、英語のまま覚えてしまうのが早いです。大きく分けると次の3種類になります。
表は横にスクロールできます →
| タイミング | 使えるイベント |
|---|---|
| ターンの実行中(依頼を処理している間) | PreToolUse(ツール利用の前)/PermissionRequest(承認を求めるとき)/PostToolUse(ツール利用の後)/PreCompact(会話履歴の圧縮前)/PostCompact(会話履歴の圧縮後)/UserPromptSubmit(依頼文の送信時)/SubagentStop(サブエージェントの完了時)/Stop(応答の完了時) |
| セッション・サブエージェントの開始時 | SessionStart(セッションの開始時)/SubagentStart(サブエージェントの開始時) |
| メインのセッションの終了時 | SessionEnd(サブエージェントでは実行されない) |
実務でよく使うのは、この中の3つに絞られます。危ない操作を止めたいなら PreToolUse、作業の記録を残したいなら PostToolUse か Stop、セッションの立ち上げ時に決まった準備をしたいなら SessionStart です。まずはこの3つだけ頭に入れておけば十分です。
SessionEnd に注意点が1つあります。これはメインのセッションが終わるときだけ動き、サブエージェントの終了では実行されません。サブエージェント側の終了を捉えたいときは SubagentStop を使います。
書き先はhooks.json — 自分専用とプロジェクトの2か所
フックの書き先は、hooks.json という専用ファイルです。config.toml の [hooks] 欄に書く方法もありますが、同じ場所に両方書くと起動時に警告が出ます。hooks.json に統一するのがおすすめです。
置き場所は、サブエージェントと同じ2か所です。どの案件でも動かしたいフックは自分専用の場所へ、その案件だけのフックはプロジェクト側へ置きます。
~/.codex/hooks.json ← 自分専用:どのプロジェクトでも動く
my-project/
└── .codex/hooks.json ← プロジェクト専用:この案件の作業で動くAGENTS.mdと違い、上書きはされません
AGENTS.mdは下の階層の指示が上の階層を上書きしましたが、Hooksは違います。両方の場所にフックがある場合、片方が優先されるのではなく、該当するフックが全部動きます。自分専用に作業ログのフックを、プロジェクト側にその案件用のフックを置けば、両方が走るということです。「上書きされるつもりで書いたのに二重に実行された」が起きやすいポイントなので、ここだけは覚えておいてください。
設定は自分で書かない — 「いつ」と「何を」を伝えるだけ
ここが本記事でいちばんお伝えしたいところです。フックの設定ファイルは、自分で書く必要がありません。「いつ」と「何を走らせるか」の2つを日本語で伝えれば、Codexが設定ファイルとスクリプトの両方を作ってくれます。
フックを設定したいです。
いつ:Bashコマンドを実行する直前
何を:実行しようとしているコマンドをスクリプトで確認して、危ないものは止める
~/.codex/hooks.json と、必要なスクリプトを作ってください。
どのイベントを使ったかと、動作の確かめ方も教えてください。こう伝えると、次のような hooks.json が出力されます。これが「Bashコマンドの実行直前に、自分のチェックスクリプトを走らせる」という設定の完成形です。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 ~/.codex/hooks/check_bash.py",
"statusMessage": "コマンドの安全を確認中",
"timeout": 30
}
]
}
]
}
}中身を丸暗記する必要はありませんが、どこが何を表しているかを知っておくと、あとから自分で直せます。上の例に出てくる項目は5つだけです。
表は横にスクロールできます →
| 項目 | 何を指定するか |
|---|---|
| イベント名(PreToolUse など) | いつ走らせるか。前掲の起動イベントの一覧から選んで、その名前をそのまま書く |
| matcher | そのイベントのうち、どれを対象にするかの絞り込み。すべてにかけるなら * にするか、行ごと省く |
| command | 走らせるコマンド。自分のスクリプトのファイルパスを指定する |
| statusMessage | 実行中にCodexの画面に出す文言(任意) |
| timeout | 何秒で打ち切るか(任意)。省略すると大半のイベントで600秒 |
この5つが分かれば、イベント名を差し替えれば別のタイミングに、command を差し替えれば別の処理に変えられます。ゼロから書くのではなく、作ってもらったものを土台に必要なところだけ直していく——これがいちばん早い進め方です。
Skills・Subagentsとの決定的な違い — AIの判断が入らない
フックには、呼び出す操作がありません。一度設定してしまえば、そのイベントが起きたときに必ずスクリプトが走ります。頼む必要もなく、逆に「今回はやらないで」と頼んでも止まりません。
ここがSkills・Subagentsとの決定的な違いです。スキルやサブエージェントは「使うかどうか」をAIが判断するため、使われないことがあります。フックにはその判断が入りません。
表は横にスクロールできます →
| 仕組み | いつ動くか |
|---|---|
| Agent Skills | description を見て、AIが「今使う」と判断したときだけ |
| Subagents | こちらが頼んだときか、メインが必要と判断したとき |
| Hooks | 該当するイベントが起きたら、例外なく毎回 |
だからこそ、Hooksに入れるべきなのは「やってほしい」ことではなく「忘れては困る」ことです。作業ログの記録、作ったファイルの体裁を揃える処理、終了時の通知——このあたりが向いています。逆に「状況によっては不要」な処理を入れると、毎回走って邪魔になります。
「ついでに何かする」だけでなく「進めていいか判定する」側にも使える
もう一つ知っておきたいのが、スクリプトの結果で作業そのものを止められることです。たとえば PreToolUse で危ういコマンドを検知したときに、その実行をブロックできます。
これは統制の観点で大きな意味を持ちます。「このコマンドは実行しないでください」とAGENTS.mdに書くのは、あくまでAIへのお願いです。守られる確率は高くても、100%ではありません。一方でHooksによるブロックは、AIの判断を通らないシステム側の関門です。社内ルールのうち、破られたら困るものだけをHooksに移す——この切り分けが実務では効いてきます。
権限設計との併用が前提です
Hooksは万能の安全装置ではありません。あくまでCodexが用意したイベント地点でしか動かないため、サンドボックス(どこまでの操作を許すかの枠)の設定とセットで考える必要があります。触らせる範囲をフォルダで区切ったうえで、その中でも特に危ない操作をHooksで止める、という二段構えが基本です。サンドボックスの考え方は関連記事のCodexのセキュリティを参照してください。
最初の1本は「記録」から始める
いきなりブロック系のフックから入ると、正常な作業まで止まってしまい、原因の切り分けに時間を取られます。当社が導入支援でおすすめしているのは、まず何も止めない「記録」のフックを1本作ることです。
- 1まず記録だけのフックを作る — 応答が完了したタイミング(
Stop)で、日時と作業内容を1行ファイルに追記するだけのフックを入れる - 21日使って、意図どおり走っているか確認する — ログが増えていれば、イベント名と設定は正しい
- 3そのうえで、止めたい操作を1つだけブロック対象にする — 記録で仕組みが動くと確認できてから、判定を足す
順番を逆にしないことがポイントです。「設定が間違っている」のか「判定ロジックが厳しすぎる」のかを切り分けられる状態を先に作っておけば、あとの調整がずっと楽になります。
組織でHooksを使うなら — 「守らせたいこと」の棚卸しから
組織で使う場合、技術的な設定より先に決めるべきことがあります。それは社内ルールのうち、どれをAIの判断に委ねず強制するかです。ここを決めずにフックを増やすと、現場では「なぜか止まる」「なぜか毎回何かが走る」という状態になり、かえって使われなくなります。
実務では、次の順で棚卸しすると整理しやすくなります。(1)破られたら事故になるルール(顧客情報を含むファイルを外部へ出さない、本番環境に触らない、など)はHooksへ。(2)守ってほしいが例外もあるルール(表記の統一、報告の形式など)はAGENTS.mdへ。(3)特定の業務でだけ守るルールはSkillsへ。この3層に振り分けるだけで、どこに何を書くかで迷わなくなります。
当社のCodex研修・導入伴走支援では、貴社の実業務を題材に、この振り分け自体をワークとして一緒に行っています。ツールの設定方法を教えて終わりではなく、「何を強制し、何を任せるか」という運用設計まで含めて伴走するのが当社のスタイルです。
Codexを組織に定着させたい企業様へ。AI Orchestraの法人研修・導入支援をご覧ください。





