Codex CLI に MCP サーバーを設定する:config.toml の書き方と接続確認

Codex 公開:

Codex CLI で MCP サーバーを使うための設定方法を解説します。config.toml の [mcp_servers] セクションの書き方、環境変数の渡し方、codex mcp コマンドによる追加と一覧、接続できないときの確認手順を紹介します。

検証日 2026年9月7日 仕様変更が早い分野です。最新の公式ドキュメントも併せてご確認ください。 記事の作り方と検証手順
目次
  1. config.toml に書く
  2. codex mcp コマンドで追加する
  3. 接続を確認する
  4. 使い方の例
  5. Claude Code・Gemini CLI との設定の違い
  6. まとめ

MCP(Model Context Protocol)サーバーを Codex CLI に接続すると、ブラウザ操作、ドキュメント検索、Issue 管理などを Codex が自分で判断して実行できるようになります。Codex の MCP 設定は config.toml に集約されており、Claude Code や Gemini CLI とは書き方が異なります。

この記事では、config.toml への書き方、コマンドによる追加、接続確認とトラブル時の切り分けをまとめます。

KEY POINT

この記事で分かること

  • [mcp_servers.名前] セクションの書き方(stdio 方式)
  • 環境変数・トークンの安全な渡し方
  • 接続確認と、動かないときの切り分け手順

config.toml に書く

~/.codex/config.toml に、サーバーごとにセクションを追加します。

[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]

[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]

[mcp_servers.github]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
env = { GITHUB_PERSONAL_ACCESS_TOKEN = "${GITHUB_TOKEN}" }
キー意味
commandサーバーを起動するコマンド
argsコマンドの引数(配列)
envサーバープロセスに渡す環境変数

env に書いた値は、サーバーの起動時に渡されます。トークンは直接書かず、シェルの環境変数から読ませるのが原則です。

トークンを config.toml に直接書かない

config.toml はバックアップや dotfiles の共有で外部に出やすいファイルです。env にはトークンそのものではなく、${GITHUB_TOKEN} のように環境変数の参照を書き、実体はシェルの環境変数に置いてください。環境変数の展開に対応していないバージョンの場合は、ラッパースクリプトを command に指定して、スクリプト内で環境変数を読む方法があります。

codex mcp コマンドで追加する

手で TOML を書く代わりに、コマンドで追加することもできます。

codex mcp add playwright -- npx @playwright/mcp@latest
codex mcp list
codex mcp remove playwright

追加した内容は config.toml に書き込まれるため、後から手で編集して構いません。サブコマンドの対応状況はバージョンで異なるので、codex mcp --help で確認してください。

接続を確認する

Codex を起動し、対話中に /mcp を実行すると、登録されたサーバーと提供ツールの一覧が表示されます。一覧に出ない、または接続エラーになる場合は次の順で切り分けます。

  1. サーバーを単体で起動する: npx @playwright/mcp@latest をターミナルで直接実行し、エラーが出ないか確認します。npm のダウンロード失敗や Node.js のバージョン不足はここで分かります。
  2. 環境変数を確認する: echo $GITHUB_TOKEN で値が入っているか確認します。Codex を起動したシェルに環境変数がなければ、サーバーにも渡りません。
  3. TOML の構文を確認する: 配列のカンマ漏れ、クォートの閉じ忘れが多い原因です。/status で設定が読み込まれているか確認します。
  4. サンドボックスのネットワーク制限: MCP サーバー自体は Codex のサンドボックス外で動きますが、Codex が実行するコマンドがネットワークを使う場合は network_access の設定が影響します(approval mode と sandbox 設定の違い)。

用語解説

stdio 方式: Codex がサーバーをサブプロセスとして起動し、標準入出力で通信する方式です。ローカルで動く MCP サーバーの多くがこの方式です。リモートサーバー(HTTP)への対応状況は公式ドキュメントで確認してください。

使い方の例

MCP サーバーが接続されていれば、指示の中で自然に使われます。

  • Playwright: 「開発サーバーを起動して、ログイン画面のスクリーンショットを撮って確認して」
  • Context7: 「Prisma の最新ドキュメントを参照して、複合ユニーク制約の書き方を確認してから実装して」
  • GitHub: 「Issue #42 の内容を読んで、修正方針を提案して」

ツールの実行には承認ポリシーが適用されます。Codex が MCP ツールを使おうとして確認が出た場合、内容を見て許可します。

Claude Code・Gemini CLI との設定の違い

ツール設定ファイル形式
Codex~/.codex/config.tomlTOML の [mcp_servers.名前]
Claude Code.mcp.json / ~/.claude.jsonJSON の mcpServers
Gemini CLI~/.gemini/settings.json / .gemini/settings.jsonJSON の mcpServers

指定する内容(command / args / env)は共通なので、1 つのツールで動いた設定は他のツールにも書き換えるだけで使えます。Claude Code の設定は Claude Code に MCP サーバーを追加する方法、Gemini CLI は Gemini CLI に MCP サーバーを追加する を参照してください。最初に入れるサーバーの候補は コーディング AI で最初に入れるべき MCP サーバー にまとめています。

まとめ

  • ~/.codex/config.toml の [mcp_servers.名前] に command / args / env を書く
  • トークンは環境変数から読ませ、config.toml に直接書かない
  • /mcp で接続状態を確認し、動かないときはサーバー単体起動 → 環境変数 → TOML 構文の順で切り分ける
  • command / args / env の内容は Claude Code や Gemini CLI と共通なので流用できる

よくある質問

Codex の MCP 設定はどこに書きますか?
~/.codex/config.toml の [mcp_servers.名前] セクションです。codex mcp add コマンドで追加すると自動的に書き込まれます。
Claude Code の .mcp.json をそのまま使えますか?
形式が異なるため、そのままでは使えません。command / args / env の内容を TOML に書き直す必要があります。
MCP サーバーのツールは承認なしで実行されますか?
承認ポリシーに従います。on-request では Codex が必要と判断したときに確認が入ります。

読者からの質問と回答

Q. 事前登録した OAuth クライアントを使う MCP サーバーで、デスクトップアプリの Authenticate ボタンを押してもトークンが保存されません。codex mcp login なら通ります。

編集部の回答質問の出典: GitHub openai/codex Issue #56002

公式ドキュメントが OAuth ログインの手順として挙げているのは CLI のコマンドです。「For a server that supports OAuth, run codex mcp login <server-name>」と書かれています。デスクトップアプリのボタンについての記載はありません。CLI で通るなら、まずそちらを正規の手順として扱ってください。

設定は 3 つのクライアント(ChatGPT デスクトップアプリ、Codex CLI、IDE 拡張)で共有されます。既定の保存先は ~/.codex/config.toml です。つまり CLI でログインした結果は、同じ設定を読む他のクライアントからも使えます。

事前登録済みのクライアントを使う場合、クライアント ID はサーバーの追加時に渡します。

codex mcp add example --url https://mcp.example.com --oauth-client-id my-client

機密クライアントなら、シークレットも渡します。環境変数から読む形にしてください。

codex mcp add example --url https://mcp.example.com \
  --oauth-client-id my-client --oauth-client-secret "$MCP_CLIENT_SECRET"

シークレットは config.toml に平文で保存される

公式ドキュメントは「Codex saves the secret as mcp_servers.example.oauth.client_secret in config.toml. Keep that file private and out of version control」と明記しています。このファイルをリポジトリに入れないでください。

クライアント ID とコールバックは、次の形で config.toml に保存されます。

[mcp_servers.example]
url = "https://mcp.example.com"

[mcp_servers.example.oauth]
client_id = "my-client"
callback_url = "http://127.0.0.1/callback"

コールバックの既定は http://127.0.0.1/callback です。ポートや URL を変える必要があれば、mcp_oauth_callback_port と mcp_oauth_callback_url で上書きできます。登録方式を 1 回のログインだけ指定したい場合は codex mcp login <server-name> --oauth-client-registration cimd(または dcr)を使います。既定は auto で、この指定は config.toml には保存されません。

設定済みのサーバーの一覧は codex mcp list、対話中の状態は /mcp で確認できます。サーバーの追加方法は Codex CLI に MCP サーバーを追加する config.toml の書き方 にまとめてあります。

Q. Codex のデスクトップアプリで MCP ツールの「Always allow」を選んでも、新しいチャットを始めると同じ承認プロンプトが出ます。config.toml にツール単位の approval_mode を書いているのですが、チャットをまたいで許可する方法はありますか。

編集部の回答質問の出典: GitHub openai/codex Issue #52963

まず仕様として確認できる部分と、確認できない部分を分けます。

確認できる部分: ツール単位の承認は公式に設定できます。サーバー全体の既定が default_tools_approval_mode、個別のツールの上書きが tools.<tool>.approval_mode です。公式ドキュメントの記述は「Default approval behavior for tools from this server. Supported values are auto, prompt, writes, and approve」と「Per-tool approval behavior override」です。

[mcp_servers.google-ads]
command = "..."
default_tools_approval_mode = "prompt"

[mcp_servers.google-ads.tools.list_accounts]
approval_mode = "approve"

確認できない部分: 4 つの値のうち、公式ドキュメントが意味を説明しているのは writes だけです(「The writes mode prompts for tools that aren't marked read-only」)。auto、prompt、approve が具体的に何をするかは、設定リファレンスにも MCP のページにも書かれていません。

ただし公式の設定例は、サーバーの既定を prompt にしたうえで、特定のツールだけ approval_mode = "approve" にする形になっています。この並びからは approve の方が緩い(プロンプトを出さない)側として使われていると読めますが、ドキュメントがそう明言しているわけではありません。

「Always allow」の持続範囲: UI で選ぶ「Always allow」がチャットをまたいで残るかどうかは、公式ドキュメントでは確認できませんでした。Codex のドキュメントで「Always allow」の持続について書かれているのは Browser Use と Windows の Computer Use の項目で、MCP ツールについての記述はありません。

注意

したがって現状の確実な対処は、UI の「Always allow」に頼らず config.toml 側に書くことです。approval_mode を "approve" にしても毎回プロンプトが出る場合は、設定が読まれていない可能性があるため、[mcp_servers.<サーバー名>.tools.<ツール名>] のテーブル名がサーバー ID とツール名に正確に一致しているかを確認してください。デスクトップアプリの経路でこのキーが有効かどうかは、ドキュメントに明記がありません。

承認を出さずに済ませる別の手として、enabled_tools(公開するツールの許可リスト)と disabled_tools(その後に適用される拒否リスト)があります。ただしこれはツールを出すかどうかの制御で、承認の挙動を変えるものではありません。

MCP サーバーの設定の全体像は Codex に MCP サーバーを追加する にまとめてあります。

参考にした一次情報

この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。