Claude CodeからCodexを呼び出す方法|pluginなしでPythonから

Claude CodeからpluginなしでCodexを呼ぶ方法のアイキャッチ。作業画面からパイプを通って依頼が渡り、決まった形の返事が戻るイラスト

ZEN AI LAB のキャラクター ZEN

監修:ZEN AI LAB(ZEN)

人間1人とAI社員で動く会社です。記事の数値は自社の作業ログの実測、仕様や料金は公式の一次情報で確認しています。確認した日付は本文に書いています。

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)は、公式が削除しました。

Claude CodeからCodexを呼ぶ方法は、いまは公式pluginとPythonから直接の2つ。以前のMCP手順(codex mcp-server)は公式が削除
方法公式情報で確認できたことこの記事での扱い
公式pluginClaude 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内で次の順に実行する手順が載っています。

  1. /plugin marketplace add openai/codex-plugin-cc
  2. /plugin install codex@openai-codex
  3. /reload-plugins
  4. /codex:setup

必要なものは、ChatGPTのサブスクリプションまたはOpenAIのAPIキーと、Node.js 18.18以降です。導入すると、読み取り専用でレビューする/codex:reviewや、作業を任せる/codex:rescueなどが追加されます。

Pythonのコードと設定ファイルでCodexを呼び出せます

このコードはWindows用です。次の順に準備します。

  1. Codex CLIを入れ、codex loginを実行します。ブラウザの画面でサインインし、codex login statusで現在の認証方法を確認します。
  2. ask_codex.pyとschema.jsonを同じフォルダへ保存します。
  3. コマンドプロンプトまたは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(=操作できる範囲)は読み取り専用です。

Claude CodeからPythonのask_codex.pyを実行し、読み取り専用のcodex execがschemaどおりのJSONをout.jsonに返す流れ

進み具合はstderr(=経過やエラーを出す場所)に送られ、最後の返事だけがstdout(=通常の結果を出す場所)に送られます。今回のコードは-oも使い、最後の返事をファイルに保存します。

オプション意味ZEN AI LABが付けている理由
exec対話画面を開かずにCodexを実行するPythonから呼び出す
--skip-git-repo-checkGitリポジトリかどうかの確認を省く専用フォルダでも実行する
--ephemeralセッションの記録ファイルを残さない今回の返事だけを受け取る
-s read-only読み取り専用のsandboxを選ぶ原稿用ファイルを変更させない
-C作業フォルダを指定する読み取り対象を決める
-c model_reasoning_effort推論量の設定を実行時に上書きする本番用スクリプトだけで使う
--output-schemaJSON 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サインインを使っています。

APIキーが要るかは動かす場所で変わる。自分のPC、CI・GitHub Actions、共有サーバー、公開リポジトリごとの認証

OpenAIの認証ページ(2026-09-19確認)によると、ローカルの作業は両方の認証に対応します。ChatGPTサインインはプランに含まれる利用枠を使い、APIキーはAPIの標準の料金になります。

場面どちらの認証公式の根拠
自分のPCで自分が起動するスクリプト公式の推奨の既定はAPIキー。ローカルの作業は両方に対応。ZENは自分の判断でChatGPTサインインスクリプトがlocal workとautomationのどちらに当たるかは明記なし
CI・GitHub ActionsAPIキープログラムで動かすワークフローには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回は途中で打ち切られる長さです。

codex execの成功17回の所要時間の横棒グラフ。8回がClaude Codeの既定の待ち時間(2分)を超えた

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の実行をさらしません。

試す順番は次のとおりです。

  1. codex loginを実行し、codex login statusで認証方法を確認します。
  2. ask_codex.pyとschema.jsonを保存し、python ask_codex.pyを実行します。
  3. Claude Codeから呼ぶ場合は、PythonのtimeoutをBashの待ち時間より短くします。

Claude Codeを実際の作業で使った記録は、ZEN AI LABのClaude Code Hubにまとめています。エラー、利用上限、プラン、使用量の記録を続けて確認できます。