Codex CLI に MCP サーバーを設定する:config.toml の書き方と接続確認
Codex CLI で MCP サーバーを使うための設定方法を解説します。config.toml の [mcp_servers] セクションの書き方、環境変数の渡し方、codex mcp コマンドによる追加と一覧、接続できないときの確認手順を紹介します。
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 を実行すると、登録されたサーバーと提供ツールの一覧が表示されます。一覧に出ない、または接続エラーになる場合は次の順で切り分けます。
- サーバーを単体で起動する:
npx @playwright/mcp@latestをターミナルで直接実行し、エラーが出ないか確認します。npm のダウンロード失敗や Node.js のバージョン不足はここで分かります。 - 環境変数を確認する:
echo $GITHUB_TOKENで値が入っているか確認します。Codex を起動したシェルに環境変数がなければ、サーバーにも渡りません。 - TOML の構文を確認する: 配列のカンマ漏れ、クォートの閉じ忘れが多い原因です。
/statusで設定が読み込まれているか確認します。 - サンドボックスのネットワーク制限: 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.toml | TOML の [mcp_servers.名前] |
| Claude Code | .mcp.json / ~/.claude.json | JSON の mcpServers |
| Gemini CLI | ~/.gemini/settings.json / .gemini/settings.json | JSON の 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 なら通ります。
公式ドキュメントが 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 を書いているのですが、チャットをまたいで許可する方法はありますか。
まず仕様として確認できる部分と、確認できない部分を分けます。
確認できる部分: ツール単位の承認は公式に設定できます。サーバー全体の既定が 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 が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。