wan0ri Lab

巷で噂のCodeX CLIに触れてセッティング諸々トライしてみた

· wan0ri

はじめに

以前書いた記事で ChatLLM の API を使ってバイブコーディングの環境を構築しました。

ChatLLM API と VSCode 拡張機能 Continue を組み合わせてバイブコーディング環境を構築した話

使い始めた当初は AI に壁打ちしながらコーディングできていたのですが、以下の問題点が出てきました。

  • チャットを入力してレスポンスまでかなりの時間がかかった
  • 拡張機能の Continue がかなりの頻度でエラーになってしまいチャットでの壁打ちが困難

他のサービスに切り替えることを検討するなかで Claude Code を視野に入れましたが、ここ最近精度があまりよろしくないと他のユーザーからの声が挙がっていたので、早々に候補から外しました。

Qiita や Zenn などを眺めていたところ、ChatGPT を提供している OpenAI から CodeX という AI エージェントがかなりいいという記事を多数見かけましたので、遅ればせながら試してみました。

Codex cloud

以降、私が設定した内容になります。
以前 Cursor を使用していて、その中で AI と壁打ちでチャットできるようルールを作ったことがあるので、そのルールを踏襲して CodeX にもルールの定義付けをしようと思います。

説明しないこと

  • CodeX の概要説明やインストール、導入までの手順
  • CodeX に対しての詳細説明※あくまで CodeX のルールなどの設定内容と実行手順にフォーカス

設定(AGENTS.md)

ユーザー配下に.codex があることを確認し、その中にAGENTS.mdを作成する。
これは現在のプロジェクト内を解析する説明書のようなものになります。

AGENTS.md
# AGENTS

最終更新: 2025-10-03 00:00:00

## 基本指示

- CodeX CLI エージェントは初回応答から日本語で返答し、ユーザーが別の言語を明示した場合のみ切り替える。
- 説明は平易な日本語で、必要な識別子やコードは英語で表記する。

## 運用スタイル

- 基本は `codex` コマンド単体で起動し、用途に応じて都度 `-p <profile>``--prompt` を指定する。
- プロファイル切替ラッパー(`codex-infra` など)は廃止し、`codex` コマンドに集約する。
- 設定変更後は Codex CLI を再起動するか、TUI で `:config reload` を実行して反映させる。

## プロファイル一覧

### infra-tf (profile: `infra`)

- **目的**: Terraform / Kubernetes / Docker / CI レビューに特化。
- **呼び出し例**: `codex -p infra --prompt "@tf:rules"`- **備考**: インフラ構成レビューは「目的 → 差分 → 影響 → ロールバック → 検証」で整理する。

### docs-scribe (profile: `docs`)

- **目的**: ADR / 設計資料 / 要件定義の骨子生成。
- **呼び出し例**: `codex -p docs --prompt "@docs:adr title=\"...\""`- **備考**: Markdown 構造化と簡潔な要約を優先する。

### full-stack-rev (profile: `full`)

- **目的**: BE / FE / DB / CI を横断したレビュー。
- **呼び出し例**: `codex -p full --prompt "@fe:rules"`- **備考**: アプリとインフラの相互影響を棚卸ししてから提案する。

### quality-ops (profile: `quality`)

- **目的**: コマンド安全性・セキュリティ・テスト生成のスポットチェック。
- **呼び出し例**: `codex -p quality --prompt "@review:commands"`- **備考**: 機微情報と再現性、重大リスクを最優先で精査する。

## プロンプトプリセット

- プリセット本文は `config.toml``[prompt_presets]` に定義される。
- 追加・更新時は diff を確認しつつ `:config reload` で反映する。
- よく使うプリセットは `codex --prompt "@name"` 形式で直接呼び出す。

## MCP サーバー

- context7: Context7 ドキュメント参照。
- playwright: Playwright ブラウザ操作。
- filesystem: ローカルファイル参照。
- github: GitHub リポジトリ参照(`GITHUB_TOKEN` を環境変数で渡す)。
- terraform: HashiCorp 公式 Terraform MCP Server。`docker run --rm -i hashicorp/terraform-mcp-server:0.3.0` で起動し、Terraform Registry からプロバイダ情報を取得できる。Terraform Cloud / Enterprise を使う場合は `TERRAFORM_CLOUD_TOKEN` などを `env` で明示すること。ローカル開発環境での利用を前提とし、外部公開時はアクセス制御を追加する。

## 運用ルール

1. 日常作業は `codex` コマンドで開始し、必要に応じて `-p` でプロファイルを切り替える。
2. プロファイルの使い分けが煩雑になった場合はプリセット側で段階的に吸収する。
3. 有用だった会話はプロファイル紐付けのメモとして本ファイルに追記し、再利用できる形に整理する。

設定(config.toml)

次にconfig.tomlの設定を行います。
これは、CodeX の設定ファイルになります。

この記事で今回やったことは大きく 4 つです。迷子になりそうになったら、下のチェックリストだけ押さえれば動きます。

  1. ネットワークアクセスをオンにする
    • ~/.codex/config.toml を開き、network_access = true にします(初期状態は false なので、MCP が外にアクセスできず失敗します)。
    • ターミナルで sed -n '1,20p ~/.codex/config.toml' を打つと冒頭だけ確認できます。network_access = true と表示されれば OK です。
  2. codex コマンドを単体運用に統一する
    • これまで用意していた codex-infra などのラッパーを削除し、必要なときだけ codex -p infra のようにオプションを付けます。
    • TUI で :config reload を実行しても無言で終わるので、反映が不安なら一度 CLI を再起動すると確実です。
  3. Terraform MCP Server を追加する
    • hashicorp/terraform-mcp-server:0.3.0 を Docker で起動できるよう [mcp_servers.terraform] ブロックを追加します。
    • docker version でデーモンが動いているか確認し、Terraform Cloud / Enterprise を使う場合は TERRAFORM_CLOUD_TOKEN などの環境変数を .env などで渡します。
  4. GitHub のトークンを確認する
    • 設定ファイルの mcp_servers.githubGITHUB_TOKEN という環境変数を読むように書いてあります。
    • printenv GITHUB_TOKEN を実行して何も返ってこなければ未設定です。GitHub で Personal Access Token を発行し、export GITHUB_TOKEN=xxxxx.zshrc などに追記すると毎回設定する手間が省けます。

チェック用のコマンド例はこんな感じです。

printenv GITHUB_TOKEN
docker version --format '{{.Server.Version}}'
codex mcp list
# terraform が表示されれば設定反映済み

初心者向けに、今回使ったワンライナーもメモとして残しておきます(そのまま貼り付けても大丈夫ですし、エディタで手修正しても OK です)。

cd ~/.codex
python3 - <<'PY'
from pathlib import Path
path = Path('config.toml')
text = path.read_text()
text = text.replace('network_access = false', 'network_access = true', 1)
path.write_text(text)
PY
sed -n '1,12p' config.toml

これで Docker / npx ベースの MCP サーバー(context7 / playwright / filesystem / github / terraform)が必要なタイミングで外部アクセスできるようになります。

MCP サーバーの基礎知識

  • MCP (Model Context Protocol) サーバーとは?
    CodeX CLI から外部ツールにアクセスするためのブリッジです。CLI 自体はチャットに強いだけなので、MCP サーバーを経由させることで「ブラウザ操作」「ファイルシステム検索」「GitHub API 呼び出し」などを肩代わりさせられます。
  • 設定するとどうなるの?
    config.toml に登録した MCP サーバーが CLI 起動時に順番に立ち上がり、チャット中に必要なとき自動で呼び出されます。今回のように network_access = true にしておくと、npx で配布されている公式サーバーをそのまま実行できます。

今回設定した MCP サーバー一覧

サーバー名起動コマンド役割こんなときに便利
context7npx -y @upstash/context7-mcpContext7 のドキュメント検索を肩代わりし、API リファレンスを素早く引いてくれるライブラリの使い方をその場で調べたいとき
playwrightnpx -y @playwright/mcp@latestヘッドレスブラウザを動かしてスクレイピングやサイトの動作確認を自動化UI の挙動チェックや Web ページの要素確認をしたいとき
filesystemnpx -y @modelcontextprotocol/server-filesystemローカルのファイルを安全に列挙・検索・読み出し大量の設定ファイルから該当ファイルを探したいとき
githubnpx -y @modelcontextprotocol/server-githubGitHub REST / GraphQL API を呼び出して Issue や PR 情報を取得リポジトリの Issue 調査やレビュー状況を確認したいとき
terraformdocker run –rm -i hashicorp/terraform-mcp-server:0.3.0Terraform Registry や Terraform Cloud の情報取得を肩代わりProvider や Module をその場で調べたい / Workspace を操作したいとき

設定は config.toml の # MPC SERVERS セクションでまとめており、上の表と一対一で対応しています。どれかを無効化したい場合は該当ブロックをコメントアウトするだけで OK です。

config.toml
# =============================================
# CodeX config (Unified single-file setup)
# =============================================
model = "gpt-5-codex"
temperature = 0.2
max_output_tokens = 3500
hide_agent_reasoning = true
network_access = true

shell = "/bin/bash"
workdir = "."
notify = ["bash", "-lc", "command -v afplay >/dev/null 2>&1 && afplay /System/Library/Sounds/Ping.aiff || true"]

log_level = "info"
telemetry = false

redact_patterns = [
  "AKIA[0-9A-Z]{16}",
  "ASIA[0-9A-Z]{16}",
  "ghp_[0-9A-Za-z]{36,}",
  "xox[baprs]-[0-9A-Za-z-]{10,}",
]

context_window_soft_limit = 200000

file_globs_include = ["**/*.tf", "**/*.tfvars", "**/*.toml", "**/*.{yaml,yml}", "**/*.md", "docs/**/*.md", "scripts/**/*.sh", "**/*.{ts,tsx,js,jsx}", "**/*.json", "**/*.sql"]
file_globs_exclude = ["**/.terraform/**", "**/.git/**", "node_modules/**"]

allowlist_domains = [
  "developer.hashicorp.com", "learn.hashicorp.com", "registry.terraform.io",
  "kubernetes.io", "kubernetes.dev", "istio.io",
  "docs.docker.com",
  "docs.aws.amazon.com", "aws.amazon.com",
  "cloud.google.com", "learn.microsoft.com",
  "docs.github.com"
]

system_prompt = """
常に日本語で回答してください。必要に応じてコードや識別子には英語を使いますが、説明は日本語で行います。
"""

[tools]
web_search = true
tool_timeout_sec = 45

# ...(中略:profiles / prompt_presets は既存のまま)

# MPC SERVERS

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

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

[mcp_servers.filesystem]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem"]

[mcp_servers.github]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
env = { "GITHUB_TOKEN" = "${env:GITHUB_TOKEN}" }

[mcp_servers.terraform]
command = "docker"
args = ["run", "--rm", "-i", "hashicorp/terraform-mcp-server:0.3.0"]

セットアップガイド

1. パス設定

# ~/.zshrc などに追記
export PATH="$HOME/.codex/bin:$PATH"

設定後に source ~/.zshrc もしくは新しいシェルを開きます。

2. codex コマンドの使い方

  • 基本は codex 単体で起動し、対話しながら必要に応じて --prompt-p オプションを追加する。
  • プリセットを使うときは codex --prompt "@tf:rules" のように呼び出す。
  • プロファイルを切り替える場合は codex -p infra --prompt "@tf:rules" のように組み合わせる。
  • 旧来の codex-infra などのラッパーは廃止したため、シェル設定から削除して問題ありません。

3. プリセットの管理

  • プロンプト本文は config.toml[prompt_presets] に直接定義されています。
  • config.toml を編集したら Codex CLI を再起動するか、TUI の :config reload で再読み込みします。
  • プロファイルは full / infra / docs / quality の 4 種を維持しつつ、必要なときだけ -p で指定します。

4. MCP サーバー

  • Terraform Registry 連携のため、HashiCorp 公式 Terraform MCP Server を docker run --rm -i hashicorp/terraform-mcp-server:0.3.0 で起動する設定を追記しています。
  • Docker が利用できることを確認し、Terraform Cloud / Enterprise を使う場合は TERRAFORM_CLOUD_TOKEN などの環境変数を .env などで用意してください。
  • その他の MCP サーバー(context7 / playwright / filesystem / github)も config.toml から有効化済みです。

5. ベストプラクティス

  1. プロファイルは 4 種に集約しつつ、普段は codex 単体で開始する。
  2. 設定ファイルは config.toml に一本化し、変更時は diff を確認する。
  3. プリセットを拡張したら :config reload で反映し、必要ならテスト用のダミー対話を実施する。
  4. Docker を利用する MCP サーバーはバージョンを明示し、アップデート時は互換性を確認する。

6. トラブルシュート

  • loading... から変化しない → 読み込んだ config にプリセットが存在しない可能性。codex :prompt list で確認。
  • 新プリセットが出ない → Codex CLI を再起動、もしくは .codex/log/codex-tui.log を確認。
  • CLI コマンドが見つからない → PATH="$HOME/.codex/bin:$PATH" が設定されているかチェック。
  • Terraform MCP Server が起動しない → Docker デーモンが動作しているか、プロキシ設定やトークン設定を確認。

7. 今後の拡張メモ

  • プリセット数が増えたら scripts/build_codex_configs.py などを作り、Markdown から TOML を自動生成する。
  • チーム共有を想定する場合は .codex/ 配下を Git 管理し、README に運用ルールを追記する。

codex コマンド運用メモ

  • TUI で :config reload を実行してもメッセージは表示されないので、設定を変えた直後は codex mcp list で反映状況を確認すると安心です。
  • codex mcp listterraform が並んでいれば Docker 経由の Terraform MCP Server が起動できる状態になっています。表示されない場合は Docker デーモンか環境変数を再確認します。
  • config.toml[projects."..."] にある trust_level = "trusted" は Codex CLI が初回起動時に自動で追記するもので、消しても再度確認ダイアログが表示されるだけです。気にせず据え置きで問題ありません。
  • codex exec -- "terraform plan" のように exec サブコマンドを併用すれば、Terraform MCP Server で取得した情報を元にコマンドを直接実行させるワークフローも組めます(ただし実行前に diff や環境変数を必ずチェック)。

運用方法について

VSCode のターミナルやお気に入りのシェルからそのまま codex を呼び出します。たとえば codex --prompt "@review:commands" でレビューを開始し、会話の途中で @docs:adr など別プリセットを呼ぶだけでドキュメント生成モードに切り替え可能です。用途に応じて -p infra-p docs を追加する運用に統一しました。

TUI (テキストユーザーインターフェース) が立ち上がったら、まず @review:commands のようにプリセットを指定して壁打ちを始めます。Terraform 周りの調査が必要になったら同じセッション内で @tf:rules を追加で投げれば、Terraform MCP Server が自動で Provider / Module 情報を参照してくれる流れです。

現時点での感想

  • 以前の ChatLLM を使ったやり取りに比べて、途中で不明なエラーが今のところ出ていないので快適
  • VSCode の拡張機能でも CodeX を使えるが、途中で不明なエラーが出てしまい新しいチャットでリスタートしないといけない事象多発

なので、できれば CodeX CLI の導入をお勧めします。

今のところ快適に使うことができています。

使用上限について

お察しの方もいらっしゃると思いますが、チャットには上限があります。
ただ、上限に達した場合でも 5 時間位で回復するそうなので、チャットはここぞという場面で使うようにしましょう。