openai/codex でのプロジェクト固有MCPを設定する
gpt-5-codex を試すのに codex を調べています。
注意。2 つの手段を見つけましたが、過渡期っぽい無理矢理な方法です。
動機
claude code はプロジェクトごとに mcp 設定を独立させることができましたが、 現状の codex はグローバルに MCP を設定する方法しかありません。
例えばコード解析ツールの lsmcp や serena は常に起動したいわけではなく、プロジェクト固有の MCP プロセスとしたいです。
ドキュメントにもないので、直接 codex 本体のコードを読んで設定する方法を探しました。
(一応、lsmcp/serena どちらもカレントディレクトリを基準にコードを解析するので、常に起動するだけで動くには動きます)
手段 1 CODEX_HOME=$PWD/.codex
CODEX_HOME=
の環境変数の指定で、読み込みディレクトリを変更できます。
直接指定することで、プロジェクト固有の MCP 設定をロードできます。
.codex/config.toml
を次のように設定します。
model = "gpt-5-codex"
[mcp_servers.playwright]
command = "npx"
args = ["-y", "@playwright/mcp"]
この状態で起動
CODEX_HOME=$PWD/.codex codex
難点として、.codex/
は認証情報等も書き込まれるので、これをコミットするわけにはいきません。
$ ls ~/.codex/
auth.json history.jsonl log version.json
config.toml internal_storage.json sessions
.gitignore
に !/.codex/config.toml
を書いてもここに何を書くかは openai の気分次第なので、いずれ事故りそうです。
なので、これはあくまで内部のデバッグ手段として、普段遣いには次の方法が安全そうです。
手段 2 --config='...'
実装を見る限り、 codex には --config='key=val'
で直接 TOML をロードする方法が備わっています。
これを使って mcp_servers=
だけ上書きすればいいと考えました。
# codex mcp list で確認
$ codex -c 'mcp_servers={"playwright"={"command"="npx",args=["-y", "@playwright/mcp@latest"]}}' mcp list
Name Command Args Env
playwright npx -y @playwright/mcp@latest -
# この設定で起動
$ codex -c 'mcp_servers={"playwright"={"command"="npx",args=["-y", "@playwright/mcp@latest"]}}'
▌ https://example.com を playwright-mcp で開いて
tool running...
playwright.browser_navigate({"url":"https://example.com"})
手元に .mcp.json
を配置しておいて、動的にロードするなら
$ codex -c "mcp_servers=$(jq .mcpServers .mcp.json -cM | sed 's/\":/\"=/g')" mcp list
これを bash/zsh のエイリアスにしておく
# ~/.bashrc
alias codex-mcp='codex -c "mcp_servers=$(jq .mcpServers .mcp.json -cM | sed 's/\":/\"=/g')"'
.mcp.json
が存在するという強い過程があり、 また sed で無理やり JSON => TOML にしてる点に注意
参考(というかほぼそのまま)
追記 for serena
JSON => TOML の変換が雑すぎて、 serena では動かなかったので(使う人が多い気がするので)これだけ修正する。
https://
が https=//
になってしまっていた。
# sed なし
codex -c 'mcp_servers.serena={command="uvx",args=["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "codex", "--enable-web-dashboard=false"]}'
# .zshrc
alias codex-serena='codex -c "mcp_servers.serena={command=\"uvx\",args=[\"--from\", \"git+https://github.com/oraios/serena\", \"serena\", \"start-mcp-server\", \"--context\", \"codex\", \"--enable-web-dashboard=false\"]}"'
おわり
というわけで、どう考えてもあとから別の手段で不要になりそうな TIPS でした。
Discussion