Codex app serverとは?できること・起動方法・MCPとの違いを解説
この記事でわかること
- app serverが何で、誰が使うものか(ふつうの利用者は意識しなくてよい点)
- 会話(スレッド)・依頼(ターン)・項目(アイテム)という3つの単位
- codex app-serverの起動方法と、最初の通信の流れ
- 別のマシンのCodexにCLIをつなぐ方法と、認証の注意
- 承認・サンドボックス・認証方式と、安全に使うための注意点
- codex mcp-serverが削除された経緯と、SDKとの使い分け
目次
「codex app-serverというコマンドを見かけたが、何のことか分からない」「Codexのドキュメントに、MCPサーバーの代わりにapp serverを使うと書いてあった」と戸惑っている方は多いのではないでしょうか。
Codex app serverは、Codexを自分で作ったアプリや社内ツールの中から操作するための接続口です。公式ドキュメントでは、Codexが自社のリッチなクライアント(たとえばVS Code拡張機能)を動かすために使っているインターフェースで、認証、会話履歴、承認、エージェントの動きのリアルタイム配信を扱えると説明されています。
この記事では、app serverの仕組み、できること、起動方法と最初の通信の流れ、別のマシンからの接続、認証と承認の注意点、MCPサーバーやSDKとの違いまでを順に解説します。内容は2026年10月時点のOpenAI公式ドキュメントにもとづいています。app serverは実験的な機能で、仕様が変わることがあるので、実際に組み込む前には公式ページもあわせて確認してください。
Codex app serverとは

app server(codex app-server)は、Codexを裏側で動かすための「受け口」となるプログラムです。自作のアプリがこの受け口にメッセージを送ると、Codexが作業を進め、その経過と結果が順次返ってきます。やりとりには、MCPと同じくJSON-RPC 2.0という形式のメッセージが使われます。
実装はオープンソースで、GitHubのCodexのリポジトリ(openai/codexのcodex-rs/app-server)で公開されています。
3つの基本単位
app serverでは、やりとりを次の3つの単位で扱います。この3つが分かれば、ドキュメントの大半が読めるようになります。
| 用語 | 意味 | たとえ |
|---|---|---|
| スレッド(Thread) | ユーザーとCodexの会話ひとまとまり。複数のターンを含む | チャットの1つのやりとり全体 |
| ターン(Turn) | ユーザーからの1回の依頼と、それに続くCodexの作業 | 「このテストを直して」と頼んで、終わるまで |
| アイテム(Item) | 入力や出力の1つの単位。メッセージ、コマンドの実行、ファイルの変更、ツールの呼び出しなど | 作業の記録の1行 |
アプリ側は、スレッドを作り、ターンを開始し、流れてくるアイテムの通知を読んで画面に表示する、という流れで使います。
誰が使うものか
結論から言うと、Codexを使うだけの人は、app serverを意識する必要はありません。CLIやアプリ、IDE拡張機能からふつうに使っていれば、裏側の仕組みとして動いているだけです。
| あなたの立場 | app serverは |
|---|---|
| Codexを使って仕事を進めたい | 知らなくてよい。使い方は「Codex CLI」や「Codexアプリ」の記事へ |
| Codexを自社のアプリや社内ツールに組み込みたい | 対象。認証・会話履歴・承認・進行状況の配信を自前の画面で扱いたいときに使う |
| CIや定期ジョブでCodexを自動実行したい | 公式はSDKの利用を案内している |
| 別のマシンで動くCodexにCLIをつなぎたい | 対象。--listenと--remoteを使う |
「組み込む人のための仕組み」と考える
公式の説明は、自分のプロダクトの中に深い連携を作りたい開発者向けです。非エンジニアの方は、社内ツールを作る担当者や外注先から「app serverを使います」と言われたときに、Codexを自社の画面に組み込むための部品のことだ、と分かれば十分です。
できること

公式ドキュメントのAPI一覧から、業務に置き換えて分かりやすいものを抜き出すと、次のようになります。メソッド名は代表的なものだけを載せています。
| やりたいこと | 主なメソッド | 内容 |
|---|---|---|
| 会話を始める・再開する | thread/start thread/resume thread/fork | 新しい会話を作る、過去の会話の続きに戻る、途中から枝分かれさせる |
| 会話の履歴を見る・整理する | thread/list thread/read thread/archive thread/delete | 一覧の取得、保存済みの内容の読み取り、アーカイブ、完全な削除 |
| 依頼を出す | turn/start | テキストや画像を渡して作業を開始する。モデルや作業フォルダ、サンドボックスの設定も指定できる |
| 作業中に指示を足す・止める | turn/steer turn/interrupt | 進行中のターンに指示を追加する、作業を中断する |
| 変更内容をレビューする | review/start | 未コミットの変更、ブランチとの差分、特定のコミットなどを対象にレビューさせる |
| コマンドを実行する | command/exec | 会話を作らずに、サーバーのサンドボックスの下で1つのコマンドを実行する |
| 使えるモデルを調べる | model/list | アカウントで使えるモデルと、思考の深さの選択肢を取得する |
| ログインの状態を扱う | account/read account/login/start | 認証状態の確認、APIキーまたはChatGPTでのログイン |
ほかにも、スキルの呼び出し、アプリ(コネクタ)の一覧、ファイルの変更監視、ChatGPTの利用上限の取得などが用意されています。メソッドの全一覧は、公式ドキュメントの「API overview」にあります。
通信の方式
app serverには、クライアントとの接続方式がいくつかあります。--listenオプションで切り替えます。
| 方式 | 指定 | 特徴 |
|---|---|---|
| 標準入出力(stdio) | --listen stdio://(初期値) | 1行1メッセージのJSONL形式。アプリがCodexを子プロセスとして起動して直接やりとりする |
| WebSocket | --listen ws://IP:PORT | ネットワーク越しに接続できる。公式は「実験的で、サポート対象外」としている |
| Unixソケット | --listen unix:// | 既定のソケット、または指定したパスで接続を受け付ける |
| 待ち受けなし | --listen off | ローカルでの待ち受けを行わない |
実験的な機能です
公式ドキュメントには、app-serverコマンドとWebSocket通信は実験的で、本番のワークロードにはサポートされないと書かれています。コマンドの説明でも「おもに開発とデバッグ向けで、予告なく変わることがある」とされています。社内の業務システムの中核に据える前に、変更への対応を前提にしてください。
起動して動かす

ここでは、手元のマシンでapp serverを起動して、最初の依頼を送るまでの流れを説明します。CLIが入っていることが前提です。入れ方は「Codex CLIのインストール」の記事で解説しています。
- app serverを起動するターミナルで
codex app-serverを実行します。何も指定しなければ標準入出力で待ち受けます。ネットワーク越しにつなぐなら--listen ws://127.0.0.1:4500のように指定します。 - 初期化する接続したら、最初に
initializeリクエストを送り、続けてinitialized通知を送ります。clientInfoに自分のアプリの名前とバージョンを入れます。この手順より前に送ったリクエストはNot initializedエラーになります。 - スレッドを作る
thread/startで新しい会話を作ります。返ってくるthread.idを、以降のリクエストで使います。 - ターンを開始する
turn/startにスレッドIDと入力(テキストなど)を渡します。依頼ごとに、作業フォルダや承認ポリシー、サンドボックスの設定を上書きできます。 - 通知を読み続ける作業の経過は
item/started、item/agentMessage/delta、item/completedなどの通知として流れてきます。turn/completedが来たら、そのターンは終了です。
公式ドキュメントにある、メッセージの形の例を紹介します。リクエストにはmethod、params、idがあり、通知にはidがありません。
{ "method": "initialize", "id": 0, "params": { "clientInfo": { "name": "my_product", "title": "My Product", "version": "0.1.0" } } }
{ "method": "initialized", "params": {} }
{ "method": "thread/start", "id": 1, "params": {} }
{ "method": "turn/start", "id": 2, "params": { "threadId": "thr_123", "input": [ { "type": "text", "text": "Summarize this repo." } ] } }
上の例は、公式の例をもとに、モデル名の指定を省いたものです。公式の例にはモデル名の指定がありますが、使えるモデルはアカウントやワークスペースによって異なるため、model/listで確認するよう案内されています。省略した場合は、設定済みの既定のモデルが使われます。
型定義を生成する
自分のアプリをTypeScriptなどで書く場合は、使っているCodexのバージョンに合った型定義を、CLIから生成できます。
codex app-server generate-ts --out ./schemas
codex app-server generate-json-schema --out ./schemas
出力はCodexのバージョンごとに固有なので、アップデートしたら作り直します。実験的なメソッドも含めたい場合は--experimentalを付けます。
実験的なAPIは明示的に有効にする
一部のメソッドや項目は、initializeのときにcapabilities.experimentalApiをtrueにしないと使えません。有効にせずに使うと、「requires experimentalApi capability」というエラーで拒否されます。安定したAPIだけで作りたい場合は、この指定を入れないままにします。
別のマシンから接続する

app serverには、Codexのターミナル画面(TUI)を別のマシンのapp serverにつなぐ使い方もあります。たとえば、社内のサーバーでCodexを動かしておき、手元のPCから操作する、といった形です。
- 接続を受け付ける側で起動する
codex app-server --listen ws://127.0.0.1:4500を実行します。 - 操作する側で接続する別のターミナルで
codex --remote ws://127.0.0.1:4500を実行します。
--remoteには、ws://、wss://、unix://、unix://パスの指定ができます。
ネットワーク越しにつなぐときの認証
ローカル以外から接続を受け付ける場合は、WebSocketの認証を設定し、TLS(wss://)で暗号化された接続の内側に置くよう案内されています。使えるオプションは次のとおりです。
| オプション | 内容 |
|---|---|
--ws-auth capability-token --ws-token-file パス | トークンを書いたファイルを指定して認証する |
--ws-auth capability-token --ws-token-sha256 ハッシュ | トークンのSHA-256ハッシュだけをサーバーに渡す。クライアントは元のトークンを別に保管しておく |
--ws-auth signed-bearer-token --ws-shared-secret-file パス | 共有シークレットで署名されたトークンを検証する。--ws-issuer、--ws-audienceなども指定できる |
--remote-auth-token-env 環境変数名(接続する側) | トークンを入れた環境変数の名前を渡す |
公式は、トークンをコマンドラインに直接書くのではなく、ファイルや環境変数を使うことを勧めています。接続側の例は次のとおりです。
export CODEX_REMOTE_TOKEN="$(cat "$HOME/.codex/app-server-token")"
codex --remote wss://remote-host:4500 --remote-auth-token-env CODEX_REMOTE_TOKEN
認証なしで外に公開しない
公式には、ローカル以外のWebSocketの待ち受けは、現時点では認証なしの接続を既定で許可すると書かれています。外部から届く場所で待ち受ける前に、必ず認証を設定してください。平文のws://は、localhostかSSHのポート転送の接続だけに使うよう案内されています。
WebSocketで待ち受けているときは、同じポートで簡易の死活確認も使えます。GET /readyzは接続を受け付けられる状態になると200を返し、GET /healthzはOriginヘッダーのないリクエストに200を返します。Originヘッダー付きのリクエストは403で拒否されます。
なお、codex remote-controlというコマンドもありますが、公式ではこれは管理されたバックグラウンドのサーバーを使うリモート操作用で、自作のプロトコルクライアントを作るときのcodex app-server --listenの代わりにはならないと説明されています。
認証・承認・安全面

Codexはファイルを書き換え、コマンドを実行します。自作のアプリに組み込むときは、承認の確認を画面に出す責任がアプリ側にある点に注意が必要です。
承認の仕組み
Codexの設定によっては、コマンドの実行やファイルの変更に承認が必要になります。そのときapp serverは、クライアントに向けて承認を求めるリクエストを送ります。クライアントは、次のような判断を返します。
| 対象 | 返せる判断 |
|---|---|
| コマンドの実行 | accept(許可)、acceptForSession(このセッション中は許可)、decline(拒否)、cancel(中止)。実行ポリシーの追加を伴う許可もある |
| ファイルの変更 | accept、acceptForSession、decline、cancel |
承認の要求には、どのコマンドをどのフォルダで実行しようとしているかの情報が付いてきます。アプリ側では、これを利用者に分かる形で表示し、判断を受け付ける画面を用意することになります。ネットワークへのアクセスを求める承認では、接続先のホストとプロトコルが示されます。
そのほか、MCPサーバーが利用者に入力を求める「エリシテーション」や、追加の権限を求めるリクエストも、同じようにクライアントが応答します。副作用のあるアプリ(コネクタ)のツール呼び出しでも承認が求められることがあり、破壊的な操作を示すツールには、常に承認が求められると公式に書かれています。
サンドボックスと、注意が必要な操作
依頼(turn/start)ごとに、approvalPolicy(承認のポリシー)とsandboxPolicy(サンドボックスの設定)を指定できます。たとえばworkspaceWriteは、指定した作業フォルダの中への書き込みを許す設定です。
一方で、次のような操作はサンドボックスの外で動くと公式に書かれています。組み込むアプリで公開する範囲は慎重に決めてください。
| 操作 | 公式の説明 |
|---|---|
thread/shellCommand | 利用者が指示したシェルコマンドを、サンドボックスの外で、フルアクセスで実行する。スレッドのサンドボックス設定は引き継がない |
process/*(実験的) | 明示的なプロセス制御のAPI。Codexのサンドボックスの外で動く。実験的APIの有効化が必要 |
thread/delete | 保存されたスレッドと、そこから生まれたスレッドを完全に削除する |
認証の方式
app serverが扱う認証の方式は、次のとおりです。account/readで、いまの方式とアカウントの情報を確認できます。
| 方式 | 内容 |
|---|---|
| APIキー | 呼び出し側がOpenAIのAPIキーを渡し、Codexが保存してAPIリクエストに使う |
| ChatGPT(管理型) | CodexがChatGPTのログイン(ブラウザ、またはデバイスコード)を行い、トークンの保存と更新も担う |
| ChatGPTの外部トークン(実験的) | すでにChatGPTの認証を管理しているホストのアプリが、トークンを直接渡す。更新も呼び出し側が行う |
| Amazon Bedrock | Bedrockのアカウントとして報告される。Codexが管理するキーか、AWSの認証情報を使う |
商用・ホスト型のサービスには使えません
公式ドキュメントには、app serverの認証は、商用サービスやホスト型のサービスには許可されたことがないと明記されています。個人や社内の用途を超えて、顧客向けのサービスで利用者のChatGPTアカウントを使いたい場合は、公式が案内している「Sign in with ChatGPT」を検討するよう書かれています。
また、企業で使う新しい連携を作る場合は、initializeのclientInfo.nameで自分のクライアントを識別します。OpenAIのコンプライアンスログで使われる名前で、企業向けに作る場合はOpenAIに連絡して既知のクライアントとして登録してもらうよう案内されています。
管理者が設定した要件は、configRequirements/readで確認できます。requirements.tomlやMDM(端末管理)から読み込まれた、実際に有効な制限が返ってきます。
mcp-server・SDKとの違い

app serverに近い名前や役割のものがいくつかあるので、違いを整理します。
codex mcp-serverは削除された
以前は、Codex自体をMCPサーバーとして動かすcodex mcp-serverというコマンドがありました。現在は、このコマンドとスタンドアロンのcodex-mcp-serverは削除されています。これらを起動する連携を作っている場合は、Codexをアップデートする前に移行する必要があります。
移行先がapp serverですが、公式は、app serverはMCPサーバーではなく、MCPクライアントの置き換えとしてそのまま使えるものでもないと説明しています。独自のJSON-RPCプロトコルを使うため、MCPのツール呼び出しではなく、app serverのプロトコルを使うように連携を作り直す必要があります。
混同しやすい点
削除されたのは、Codexを「MCPサーバーとして公開する」機能です。Codexが外部のMCPサーバーにつなぐ機能(codex mcp)は、引き続きサポートされています。
どれを選ぶか
| やりたいこと | 選ぶもの | 理由 |
|---|---|---|
| ターミナルで自分の作業を進める | Codex CLI | app serverを意識せず、そのまま使える |
| CIやジョブでCodexを自動実行する | Codex SDK(TypeScript・Python) | 公式が、CIでの自動化にはSDKを使うよう案内している |
| 認証・会話履歴・承認・進行状況の配信を、自作の画面で扱う | app server | 公式が、深い連携にはこちらを案内している |
| Codexから外部のツールやデータにつなぐ | MCP(codex mcp) | Codexが外部サーバーを使う側。app serverとは向きが逆 |
| 別のマシンのCodexにTUIをつなぐ | codex --remote | app serverの--listenで待ち受けているサーバーに接続する |
SDKとapp serverの関係についても補足します。公式によると、Python SDKはローカルのCodex app-serverをJSON-RPCで制御する仕組みで、公開されているSDKにはバージョンを固定したCodex CLIが同梱されます。つまり、Pythonから使う場合は、SDKがapp serverの起動と通信を代わりに行ってくれます。自分でプロトコルを組み立てる必要がなければ、SDKの方が手間は少なくて済みます。
うまくいかないとき

公式ドキュメントに載っているエラーを、症状ごとに整理しました。
| 症状 | 原因と対処 |
|---|---|
Not initialized | 接続後にinitializeとinitializedを送る前にリクエストした。最初に初期化の手順を送る |
Already initialized | 同じ接続でinitializeを2回送った。接続ごとに1回だけにする |
requires experimentalApi capability | 実験的なメソッドや項目を、有効化せずに使った。必要ならcapabilities.experimentalApiをtrueにする |
エラーコード-32001「Server overloaded; retry later.」 | WebSocketのリクエスト待ち行列がいっぱいで拒否された。間隔を空け、ランダムな揺らぎを加えながら再試行する |
/healthzが403を返す | リクエストにOriginヘッダーが付いている。ヘッダーなしで確認する |
ターンがfailedで終わる(UsageLimitExceeded) | 使用量の上限に達した。ChatGPTでログインしている場合は、account/rateLimits/readで上限の状況を確認できる |
ターンがfailedで終わる(ContextWindowExceeded) | 会話が長くなり、処理できる量を超えた。thread/compact/start(履歴の圧縮)を使うか、新しいスレッドで始め直す |
接続が切れる(ResponseStreamDisconnectedなど) | 応答のストリームが切れた。ネットワークを確認して再試行する |
MCPサーバーの起動に失敗する(reauthenticationRequired) | 保存していたOAuthの認証情報の期限が切れ、更新もできなかった。クライアントで再接続を促す |
プロトコルの動きを手元で確かめたいときは、codex debug app-server send-message-v2というデバッグ用のコマンドが使えます。内蔵のテスト用クライアントで、スレッドの作成からターンの送信、通知の受信までを実行して表示します。
よくある質問
Codexを使うだけなら、app serverを理解する必要はありますか?
ありません。CLIやアプリ、IDE拡張機能から使う場合、app serverは裏側の仕組みとして動いています。自分のアプリにCodexを組み込む人や、別のマシンのCodexにつなぎたい人が対象です。
app serverとMCPは何が違いますか?
MCPは、AIが外部のツールやデータにつながるための共通の規格です。app serverは、アプリの側からCodexを操作するための接続口です。向きが逆であり、公式もapp serverはMCPサーバーではないと説明しています。
codex mcp-serverはまだ使えますか?
使えません。codex mcp-serverとcodex-mcp-serverは削除されています。この機能を使っていた連携は、app serverのプロトコルを使うように作り直す必要があります。
本番の業務システムで使ってもよいですか?
公式は、app-serverコマンドとWebSocket通信を実験的で、本番のワークロードにはサポートされないとしています。使う場合は、仕様が変わる可能性を前提に、影響範囲を限って試すのが現実的です。
自社のお客様向けサービスに組み込めますか?
app serverの認証は、商用サービスやホスト型のサービスには許可されたことがないと公式に書かれています。顧客向けにChatGPTのログインを使いたい場合は、公式が案内している「Sign in with ChatGPT」を確認してください。
料金や、使えるプランはどうなっていますか?
app serverのドキュメントには、対応するプランや料金についての記載がありません。使用量は、ログインに使うChatGPTのプランやAPIキーの扱いに従います。料金は「Codexの料金」の記事も参考にしてください。
SDKとapp serverはどちらを使えばいいですか?
CIなどでCodexを自動実行したいだけなら、公式はSDKを案内しています。認証、会話履歴、承認、進行状況の配信まで自分で扱う画面を作る場合に、app serverを使います。
ソースコードは公開されていますか?
公開されています。GitHubのopenai/codexリポジトリのcodex-rs/app-serverにあります。公式の「Open Source」のページに、公開されているCodexの構成要素の一覧があります。
使えるモデルはどうやって調べますか?
model/listで、アカウントで使えるモデルと、選べる思考の深さを取得できます。公式の例に出てくるモデル名は例であり、自分のアカウントで使えるとは限りません。
まとめ
この記事のまとめ
- Codex app serverは、Codexを自作のアプリや社内ツールから操作するための接続口で、Codexを使うだけの人は意識しなくてよい
- 会話(スレッド)、依頼(ターン)、項目(アイテム)の3つの単位で、JSON-RPCのメッセージをやりとりする
codex app-serverで起動し、初期化、スレッドの作成、ターンの開始、通知の読み取りの順に進める- 別のマシンには
--listenと--remoteでつなげるが、外部に公開するときは認証とTLSが必須 - 承認の確認画面を出す責任はアプリ側にある。サンドボックスの外で動く操作には特に注意する
codex mcp-serverは削除済み。app serverは実験的な機能で、商用・ホスト型のサービスの認証には使えない
app serverは、Codexを自社の画面や業務の流れに組み込むための部品です。ただし実験的な機能で、承認や認証の設計を誤ると、意図しない操作や情報の持ち出しにつながります。SDKで足りるのか、app serverまで必要なのかは、作りたいものによって変わります。
INTERCREATE JAPANでは、Claude CodeやCodexの導入から、社内ツールづくり、運用のルール決めまでをお手伝いしています。社内の業務にCodexを組み込む前に、どの方法が合うかを整理したい場合はご相談ください。
参考・出典
INTERCREATE JAPAN
