本記事の位置づけ

本記事は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、作業の記録を残したいなら PostToolUseStop、セッションの立ち上げ時に決まった準備をしたいなら SessionStart です。まずはこの3つだけ頭に入れておけば十分です。

SessionEnd に注意点が1つあります。これはメインのセッションが終わるときだけ動き、サブエージェントの終了では実行されません。サブエージェント側の終了を捉えたいときは SubagentStop を使います。

書き先はhooks.json — 自分専用とプロジェクトの2か所

フックの書き先は、hooks.json という専用ファイルです。config.toml[hooks] 欄に書く方法もありますが、同じ場所に両方書くと起動時に警告が出ます。hooks.json に統一するのがおすすめです。

置き場所は、サブエージェントと同じ2か所です。どの案件でも動かしたいフックは自分専用の場所へ、その案件だけのフックはプロジェクト側へ置きます。

hooks.jsonの置き場所
~/.codex/hooks.json              ← 自分専用:どのプロジェクトでも動く

my-project/
└── .codex/hooks.json            ← プロジェクト専用:この案件の作業で動く

AGENTS.mdと違い、上書きはされません

AGENTS.mdは下の階層の指示が上の階層を上書きしましたが、Hooksは違います。両方の場所にフックがある場合、片方が優先されるのではなく、該当するフックが全部動きます。自分専用に作業ログのフックを、プロジェクト側にその案件用のフックを置けば、両方が走るということです。「上書きされるつもりで書いたのに二重に実行された」が起きやすいポイントなので、ここだけは覚えておいてください。

設定は自分で書かない — 「いつ」と「何を」を伝えるだけ

ここが本記事でいちばんお伝えしたいところです。フックの設定ファイルは、自分で書く必要がありません。「いつ」と「何を走らせるか」の2つを日本語で伝えれば、Codexが設定ファイルとスクリプトの両方を作ってくれます。

Codexへの頼み方(この程度の粒度で通ります)
フックを設定したいです。

いつ:Bashコマンドを実行する直前
何を:実行しようとしているコマンドをスクリプトで確認して、危ないものは止める

~/.codex/hooks.json と、必要なスクリプトを作ってください。
どのイベントを使ったかと、動作の確かめ方も教えてください。

こう伝えると、次のような hooks.json が出力されます。これが「Bashコマンドの実行直前に、自分のチェックスクリプトを走らせる」という設定の完成形です。

出力されるhooks.jsonの例
{
  "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 Skillsdescription を見て、AIが「今使う」と判断したときだけ
Subagentsこちらが頼んだときか、メインが必要と判断したとき
Hooks該当するイベントが起きたら、例外なく毎回

だからこそ、Hooksに入れるべきなのは「やってほしい」ことではなく「忘れては困る」ことです。作業ログの記録、作ったファイルの体裁を揃える処理、終了時の通知——このあたりが向いています。逆に「状況によっては不要」な処理を入れると、毎回走って邪魔になります。

「ついでに何かする」だけでなく「進めていいか判定する」側にも使える

もう一つ知っておきたいのが、スクリプトの結果で作業そのものを止められることです。たとえば PreToolUse で危ういコマンドを検知したときに、その実行をブロックできます。

これは統制の観点で大きな意味を持ちます。「このコマンドは実行しないでください」とAGENTS.mdに書くのは、あくまでAIへのお願いです。守られる確率は高くても、100%ではありません。一方でHooksによるブロックは、AIの判断を通らないシステム側の関門です。社内ルールのうち、破られたら困るものだけをHooksに移す——この切り分けが実務では効いてきます。

権限設計との併用が前提です

Hooksは万能の安全装置ではありません。あくまでCodexが用意したイベント地点でしか動かないため、サンドボックス(どこまでの操作を許すかの枠)の設定とセットで考える必要があります。触らせる範囲をフォルダで区切ったうえで、その中でも特に危ない操作をHooksで止める、という二段構えが基本です。サンドボックスの考え方は関連記事のCodexのセキュリティを参照してください。

最初の1本は「記録」から始める

いきなりブロック系のフックから入ると、正常な作業まで止まってしまい、原因の切り分けに時間を取られます。当社が導入支援でおすすめしているのは、まず何も止めない「記録」のフックを1本作ることです。

  1. 1まず記録だけのフックを作る — 応答が完了したタイミング(Stop)で、日時と作業内容を1行ファイルに追記するだけのフックを入れる
  2. 21日使って、意図どおり走っているか確認する — ログが増えていれば、イベント名と設定は正しい
  3. 3そのうえで、止めたい操作を1つだけブロック対象にする — 記録で仕組みが動くと確認できてから、判定を足す

順番を逆にしないことがポイントです。「設定が間違っている」のか「判定ロジックが厳しすぎる」のかを切り分けられる状態を先に作っておけば、あとの調整がずっと楽になります。

組織でHooksを使うなら — 「守らせたいこと」の棚卸しから

組織で使う場合、技術的な設定より先に決めるべきことがあります。それは社内ルールのうち、どれをAIの判断に委ねず強制するかです。ここを決めずにフックを増やすと、現場では「なぜか止まる」「なぜか毎回何かが走る」という状態になり、かえって使われなくなります。

実務では、次の順で棚卸しすると整理しやすくなります。(1)破られたら事故になるルール(顧客情報を含むファイルを外部へ出さない、本番環境に触らない、など)はHooksへ。(2)守ってほしいが例外もあるルール(表記の統一、報告の形式など)はAGENTS.mdへ。(3)特定の業務でだけ守るルールはSkillsへ。この3層に振り分けるだけで、どこに何を書くかで迷わなくなります。

当社のCodex研修・導入伴走支援では、貴社の実業務を題材に、この振り分け自体をワークとして一緒に行っています。ツールの設定方法を教えて終わりではなく、「何を強制し、何を任せるか」という運用設計まで含めて伴走するのが当社のスタイルです。

Codexを組織に定着させたい企業様へ。AI Orchestraの法人研修・導入支援をご覧ください。