Claude Codeで作業しながら、Codexにも下書きやレビューを頼みたい。そんなときは、Pythonからcodex exec(=画面を開かずにCodexを動かすコマンド)を実行できます。今使える主な呼び方は、公式plugin(=Claude Codeに機能を足す追加パック)とPythonから直接呼ぶ方法です。
この記事で分かることは次のとおりです。
- Claude CodeからCodexを呼ぶ方法の全体像
- JSON(=項目名つきの決まった形のデータ)で返事を受け取るコード
- APIキーが要る場面とChatGPTサインインを使える範囲
- 処理が止まったときに確認する場所
ZEN AI LABでは、掲載するコードを2026-09-19にWindows 11で実行しました。12.9秒で指定した形の返事を受け取れています。読み終えたら、自分のPCからCodexを一度呼び出せます。
Claude CodeからCodexを呼ぶ方法は、いまは2つです
今使える主な入口は、公式pluginとPythonから直接呼ぶ方法です。以前よく紹介されていたMCP(=AIツール同士をつなぐ共通の接続方式)の手順(codex mcp-server)は、公式が削除しました。

| 方法 | 公式情報で確認できたこと | この記事での扱い |
|---|---|---|
| 公式plugin | Claude Codeに専用コマンドを追加する | 全体像と導入手順を紹介 |
| 以前のMCP手順 | codex mcp-serverを起動する機能は公式が削除 | 現在の状態を紹介 |
| Pythonから直接 | Pythonからcodex execを起動する | コードと実行結果を紹介 |
公式pluginの導入手順は、公式README(2026-09-19確認)にあります。/plugin installなどのコマンドを使い、レビューや作業依頼のためのコマンドを追加します。ZEN AI LABでは、このpluginを試していません。
OpenAIのCodex MCP server removal(2026-09-19確認)によると、codex mcp-serverコマンドは削除されました。単体のcodex-mcp-serverも削除されています。代わりに案内されているapp server(=Codexを外から操作するための仕組み)はMCPサーバーではなく、実験的な機能です。本番用途はサポートされていません。
以前のMCP手順で登録済みの場合は、Codexを更新する前に移行が必要です。
ZEN AI LABのcodex-cli 0.154.0-alpha.6.2でも、codex --helpにmcp-serverはありませんでした。mcpは、Codexから利用する外部のMCPサーバーを管理するコマンドでした。
pluginを入れる手順(公式READMEより)
公式READMEには、Claude Code内で次の順に実行する手順が載っています。
/plugin marketplace add openai/codex-plugin-cc/plugin install codex@openai-codex/reload-plugins/codex:setup
必要なものは、ChatGPTのサブスクリプションまたはOpenAIのAPIキーと、Node.js 18.18以降です。導入すると、読み取り専用でレビューする/codex:reviewや、作業を任せる/codex:rescueなどが追加されます。
Pythonのコードと設定ファイルでCodexを呼び出せます
このコードはWindows用です。次の順に準備します。
- Codex CLIを入れ、
codex loginを実行します。ブラウザの画面でサインインし、codex login statusで現在の認証方法を確認します。 ask_codex.pyとschema.jsonを同じフォルダへ保存します。- コマンドプロンプトまたはClaude Codeから
python ask_codex.pyを実行します。
ask_codex.pyには次のコードを入れます。
import glob, json, os, shutil, subprocess
def find_codex():
base = os.path.join(os.environ["LOCALAPPDATA"], "OpenAI", "Codex", "bin")
cands = glob.glob(os.path.join(base, "*", "codex.exe"))
if cands:
return max(cands, key=os.path.getmtime) # 一番新しいもの
return os.environ.get("CODEX_CLI_PATH") or shutil.which("codex")
def ask_codex(prompt, workdir, schema_path, out_path, timeout=900):
codex = find_codex()
if not codex:
return None, "codex.exe が見つからない"
if os.path.exists(out_path):
os.remove(out_path) # 前回の返答を読まないように消す
cmd = [codex, "exec", "--skip-git-repo-check", "--ephemeral",
"-s", "read-only", "-C", workdir,
"--output-schema", schema_path, "-o", out_path, "-"]
try:
cp = subprocess.run(cmd, input=prompt.encode("utf-8"),
capture_output=True, timeout=timeout)
except subprocess.TimeoutExpired:
return None, f"TIMEOUT {timeout}s"
if cp.returncode != 0 or not os.path.isfile(out_path):
return None, cp.stderr.decode("utf-8", "replace")[-500:]
with open(out_path, encoding="utf-8") as f:
return json.load(f), None
schema.jsonには次の内容を入れます。
{
"type": "object",
"properties": {
"answer": {"type": "string"},
"confidence": {"type": "string", "enum": ["high", "medium", "low"]}
},
"required": ["answer", "confidence"],
"additionalProperties": false
}
次の呼び出し部分をask_codex.pyの末尾へ加えます。
if __name__ == "__main__":
here = os.path.dirname(os.path.abspath(__file__))
data, err = ask_codex("「読み取り専用で動かす利点」を日本語1文で答えてください。",
here, os.path.join(here, "schema.json"), os.path.join(here, "out.json"))
print(data if data else err)
画面にはanswerとconfidenceを持つ結果が表示され、同じ内容がJSONとしてout.jsonに残ります。
ZEN AI LABでは、このコードを2026-09-19にWindows 11で1回動かしました。12.9秒でschemaどおりの返事が返り、confidenceはhighでした。
このコードは、本番用の処理から秘密情報の検査と記録処理を除いたものです。返答ファイルのJSONが壊れていた場合の例外は処理しません。
Windowsでcodex.exeが見つからないとき
ZEN AI LABの環境では、codex.exeは%LOCALAPPDATA%\OpenAI\Codex\binの下にあるハッシュ名のフォルダへ入っていました。コードは、その中から更新日時が最も新しいファイルを選びます。
見つからない場合は、環境変数CODEX_CLI_PATH、続いてPATH上のcodexを確認します。この保存場所はZEN AI LABの環境で確認したもので、公式に示された場所ではありません。
自動探索で見つかると、コードはCODEX_CLI_PATHを確認しません。別のcodex.exeを優先する場合は、探索の順番を調整する必要があります。LOCALAPPDATAはWindowsの環境変数なので、Windows以外ではそのまま動きません。
読み取り専用で動かし、JSONで返事を受け取るコードです
OpenAIのNon-interactive modeによると、codex execは保存済みのCLI認証を既定で使います。また、既定のsandbox(=操作できる範囲)は読み取り専用です。

進み具合はstderr(=経過やエラーを出す場所)に送られ、最後の返事だけがstdout(=通常の結果を出す場所)に送られます。今回のコードは-oも使い、最後の返事をファイルに保存します。
| オプション | 意味 | ZEN AI LABが付けている理由 |
|---|---|---|
exec | 対話画面を開かずにCodexを実行する | Pythonから呼び出す |
--skip-git-repo-check | Gitリポジトリかどうかの確認を省く | 専用フォルダでも実行する |
--ephemeral | セッションの記録ファイルを残さない | 今回の返事だけを受け取る |
-s read-only | 読み取り専用のsandboxを選ぶ | 原稿用ファイルを変更させない |
-C | 作業フォルダを指定する | 読み取り対象を決める |
-c model_reasoning_effort | 推論量の設定を実行時に上書きする | 本番用スクリプトだけで使う |
--output-schema | JSON Schemaを渡す | 返事の項目を決める |
-o | 最後の返事をファイルへ書く | 後の処理で読み取る |
最後の- | 標準入力から依頼文を読む | UTF-8の依頼文をPythonから渡す |
Codexは既定でGitリポジトリ内での実行を求めます。公式は、安全な環境だと確信できる場合に--skip-git-repo-checkを使うよう案内しています。--ephemeralを付けると、セッションの記録ファイルをディスクに残しません。
--output-schemaへJSON Schema(=返事の項目や型を決める設計図)を渡すと、最終の返答をその形に沿わせられます。公式の例はrequiredとadditionalProperties: falseを含みます。
ZEN AI LABの本番用schemaでは、最上位の11項目をすべてrequiredにしています。additionalPropertiesはfalseで、入れ子も同じ形です。
本番用スクリプトは、表のオプションに-c model_reasoning_effortを加えています。依頼文はUTF-8で標準入力へ渡し、送信前にAPIキー、トークン、秘密鍵らしい文字列がないか検査します。
APIキーが要るかは使う場所で変わります
自分のPCでの作業なら、Codex CLIはChatGPTサインインでもAPIキーでも動きます。ただし公式は、プログラムで動かす自動化の既定をAPIキーとしています。
自分のPCでPythonから定常的に呼ぶ使い方が、公式文書のlocal workとautomationのどちらに当たるかは明記されていません。ZEN AI LABは自分の判断で、自分の端末から自分が起動する範囲に限り、ChatGPTサインインを使っています。

OpenAIの認証ページ(2026-09-19確認)によると、ローカルの作業は両方の認証に対応します。ChatGPTサインインはプランに含まれる利用枠を使い、APIキーはAPIの標準の料金になります。
| 場面 | どちらの認証 | 公式の根拠 |
|---|---|---|
| 自分のPCで自分が起動するスクリプト | 公式の推奨の既定はAPIキー。ローカルの作業は両方に対応。ZENは自分の判断でChatGPTサインイン | スクリプトがlocal workとautomationのどちらに当たるかは明記なし |
| CI・GitHub Actions | APIキー | プログラムで動かすワークフローにはAPIキーを使う |
| 共有サーバー | ChatGPTのauth.jsonを共有しない。自動化の推奨の既定はAPIキー | 同時に動くジョブや複数のマシンで同じファイルを共有しない |
| 公開リポジトリ | ChatGPTアカウントの認証を置かない。GitHub Actionsなら公式のCodex GitHub Action | 公開・オープンソースのリポジトリではChatGPT認証を使わない |
OpenAIのCI/CD認証ページ(2026-09-19確認)は、自動化の認証にAPIキーを使うよう案内しています。ChatGPTアカウントの認証をCI/CDで使う方法は、信頼できる非公開の自動化に向けた上級者向けの扱いです。
公式は、信頼できない環境や公開された環境でCodexの実行をさらさないよう案内しています。GitHub Actionsで動かす場合は、公式のCodex GitHub Actionを使い、APIキーで認証します。
公式によると、~/.codex/auth.jsonにはアクセストークンが入っています。パスワードと同じように扱い、同時に動くジョブや複数のマシンで共有しません。
ZEN AI LABは、auth.jsonの中身やトークンを記事とログへ載せていません。APIキーへ切り替える場合は、CODEX_API_KEYを必要なCodexの呼び出しだけに渡します。Pythonではsubprocess.runのenvで、その呼び出しだけに環境変数を渡せます。公式は、同じプロセス環境で信頼できないコードを動かさないよう案内しています。
ZEN AI LABはこの方法でAPIキーを使っていません。ChatGPTのプランの利用枠を使っており、APIの従量課金は発生していません。
OpenAIのヘルプセンター(2026-09-19確認)は、CodexをFreeやGoを含むすべてのChatGPTプランで使えると案内しています。利用上限はプランによって異なります。これはCodex全体の話で、料金ページのcodex execの行にはFreeとGoの列がありません。
料金ページのcodex execの行は、Plus・Pro・Business・Enterprise/Education・API Keyの列で利用可能です。Claude Code側の上限は別の仕組みで、Claude Codeの使用量制限にまとめています。
Claude Codeから動かすと2分で止まることがあります
Claude Codeがコマンドを待つ時間は、既定で120000ミリ秒(2分)です。BASH_DEFAULT_TIMEOUT_MSで変更できます。
Claudeが指定できる上限は既定で600000ミリ秒(10分)です。BASH_MAX_TIMEOUT_MSで変更でき、実際の上限は両方の設定のうち大きい方になります。Claude Codeの環境変数(2026-09-19確認)に記載されています。
自分の全プロジェクトへ反映する場合は、~/.claude/settings.jsonに設定します。公式例と同じ値は次のとおりです。
{
"env": {
"BASH_DEFAULT_TIMEOUT_MS": "300000"
}
}
.claude/settings.jsonはプロジェクトの全員に効き、.claude/settings.local.jsonは自分とそのプロジェクトだけに効きます。
成功17回のうち8回は120秒を超え、最長は221.5秒でした。既定の待ち時間のままなら、この8回は途中で打ち切られる長さです。

2026-09-19の1つのセッションでClaude Codeが呼んだ8回は、失敗1回を含みます。上の8回とは別の集計です。すべて呼び出しごとに待ち時間を指定し、うち7回は600000ミリ秒=10分でした。221.5秒の処理も、この指定の中で最後まで終わりました。
Python側のコードは、待ち時間を既定で900秒にしています。Claude Codeから動かすときは、ask_codexのtimeoutをBashの待ち時間より短く渡します。たとえば待ち時間が10分なら、timeout=540のようにPython側が先に終わる値にします(540は計算上の例です)。必要な処理時間が上限を超えるなら、BASH_MAX_TIMEOUT_MSを上げます。
終了コードと返答ファイルで失敗を見つける
終了コードは、処理の成否をプログラムへ伝える番号です。最小コードは、終了コードが0以外か返答ファイルがない場合に、stderrの末尾を返します。Python側で900秒を超えるとTIMEOUTを返します。
ZEN AI LABの本番用スクリプトは、次のどれかに当たるとGPT_UNAVAILABLEを記録します。
codex.exeが見つからない- 終了コードが0以外
- 返答ファイルがない
- JSONを読めない
その後、終了コード4で止まります。900秒を超えた場合も同じ扱いです。
2026-09-19には、codex execが3.7秒で終了コード1になりました。stderrにはERROR: Selected model is at capacity. Please try a different model.と出ています。同じ内容を1回再実行すると、221.5秒で成功しました。
ZEN AI LABのスクリプトには自動再試行の仕組みはありません。この再実行ではログが上書きされ、最初の失敗ログがファイルに残りませんでした。再実行時のログを別名で残す必要があると分かった事例です。
JSON Schemaで返事の形を決めても、中身の検査は別に必要です。ZEN AI LABでは、事実の一覧にない数字、使わない言葉、文字数を受け取り後に検査しています。
2026-09-18の9回の受け取りでは、2回が差し戻しになりました。内訳は、Xの別案がなかったものと、使わない言葉を含み140字を超えたものです。
17回の記録では1回15.9〜221.5秒かかりました
ZEN AI LABでは、Claude CodeからPythonのスクリプトを動かし、その中でcodex execを呼んでいます。返ってきた原稿は、同じスクリプトの別処理で機械検査します。
2026-09-18〜19に成功した記録は17回です。2026-09-18に9回、2026-09-19に8回でした。
実行条件は次のとおりです。
codex-cli 0.154.0-alpha.6.2- モデル
gpt-5.6-sol - approval
never - sandbox
read-only - reasoning
medium - すべて終了コード0
1回あたりの時間は、最短15.9秒・中央値117.4秒・平均113.5秒・最長221.5秒、合計1,929.2秒でした。CLIに表示されたトークンは、最少8,089・中央値30,659・平均33,937・最多58,941、合計576,936でした。入力と出力の内訳は表示されないため分かりません。
| 種類 | 回数 | 時間 | トークン |
|---|---|---|---|
| Xの投稿 | 7回 | 15.9〜135.2秒 | 15,865〜32,149トークン |
| noteの記事 | 2回 | 89.7秒と105.4秒 | 30,659と36,404トークン |
| 動画の台本 | 4回 | 117.4〜160.0秒 | 50,804〜58,941トークン |
| WordPressの記事 | 4回 | 159.8〜221.5秒 | 8,089〜42,346トークン |
これは2日分・17回・reasoning medium・日本語の原稿という条件の記録です。ほかの条件の所要時間には当てはめられません。Claude側の使用量は、Claude Codeの使用量を46日分実測した記事で分けて記録しています。
この記事で確かめていないこと
- ZEN AI LABのCLIは
codex-cli 0.154.0-alpha.6.2です。2026-09-19時点の最新の安定版0.155.1とは異なります。 - ZEN AI LABはpluginを試していません。ほかの呼び方との速さや安定性も測っていません。
- 自分のPCからChatGPTサインインで定常的に呼ぶ使い方が、
local workとautomationのどちらに当たるかは明記されていません。 - 個人のPCでの定常的なスクリプト実行と利用規約の関係は、確認した公式ページに明記がありません。ZEN AI LABでは判断していません。
- 成功17回のすべてで、Skillの説明を短くしたという警告が出ました。ユーザー設定が読まれたことが原因かは確かめていません。
- 最長221.5秒と最少8,089トークンは同じ実行でした。その理由は確かめていません。
- 成功17回のうち8回は120秒を超えましたが、Claude Codeによる打ち切りが実際に起きた記録はありません。
まとめ
今使える主な呼び方は、公式pluginとPythonからcodex execを実行する方法です。以前のcodex mcp-serverを使う手順は公式が削除しています。
Pythonから呼ぶ場合は、掲載したask_codex.pyとschema.jsonで返事を受け取れます。認証は使う場所で分けます。CIやGitHub ActionsではAPIキーを使い、公開された環境ではCodexの実行をさらしません。
試す順番は次のとおりです。
codex loginを実行し、codex login statusで認証方法を確認します。ask_codex.pyとschema.jsonを保存し、python ask_codex.pyを実行します。- Claude Codeから呼ぶ場合は、Pythonの
timeoutをBashの待ち時間より短くします。
Claude Codeを実際の作業で使った記録は、ZEN AI LABのClaude Code Hubにまとめています。エラー、利用上限、プラン、使用量の記録を続けて確認できます。

