·tips

Codex CLIで複数アカウントを切り替える

CODEX_HOMEを切り替えてCodex CLIのauth.jsonだけを分離し、sessionsや設定は共有する

5 min read
Writing style

まとめ

  • Codex CLIはCODEX_HOME配下にauth.jsonconfig.toml、sessions、history、SQLite state等を置く
  • auth.jsonだけを分けたい場合、別のCODEX_HOMEを作って、それ以外をデフォルト側へsymlinkする
  • CODEX_PROFILEはCodex CLI標準の環境変数ではないが、シェル関数でCODEX_PROFILECODEX_HOMEへ変換すればAWS profileっぽく使える
  • codex_appsはChatGPT auth/runtime側に寄るため、auth.jsonを切り替えると利用アカウントも切り替わる
  • 通常MCP OAuth credentialを共有したい場合は.credentials.jsonもsymlinkできるが、どのアカウントの外部サービス認証を使うかは意識する

やりたいこと

Codex CLIを複数のChatGPTアカウントで使い分けたい。

ただし、設定や履歴まで完全に分けたいわけではない。やりたいのはだいたいこれ:

default profile:
  ~/.codex/auth.json

alternate profile:
  ~/.codex-alternate/auth.json

shared:
  config.toml
  sessions/
  history.jsonl
  state_*.sqlite
  logs_*.sqlite
  skills/
  plugins/
  cache/

つまり、認証だけ分けて、Codexの作業状態は共有する

前提確認

まず現在のCodex CLIがfile storageを使っているか確認する。

codex doctor --summary

詳細表示では、以下のように出る。

auth storage mode: File
auth file: ~/.codex/auth.json

ログイン状態だけならこれでよい。

codex login status

alternate用のCODEX_HOMEを作る

ここではデフォルトを~/.codex、もう一つを~/.codex-alternateにする。

mkdir -p "$HOME/.codex-alternate"

alternate側でログインする。

CODEX_HOME="$HOME/.codex-alternate" codex login

ログイン状態を確認する。

CODEX_HOME="$HOME/.codex-alternate" codex login status

auth.json以外を共有する

~/.codex-alternate/auth.jsonだけを残して、それ以外は~/.codexへのsymlinkにする。

Codexが動いている最中でもSQLiteのWALは基本的に扱えるが、移行作業としては一度Codex CLIを閉じてからやる方が安心。

backup="$HOME/.codex-alternate-local-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup"

find "$HOME/.codex-alternate" \
  -mindepth 1 \
  -maxdepth 1 \
  ! -name auth.json \
  -exec mv {} "$backup"/ \;

find "$HOME/.codex" \
  -mindepth 1 \
  -maxdepth 1 \
  ! -name auth.json \
  ! -name 'auth.*' \
  ! -name .credentials.json \
  -exec sh -c '
    for src do
      ln -s "$src" "$HOME/.codex-alternate/$(basename "$src")"
    done
  ' sh {} +

確認する。

find ~/.codex-alternate -mindepth 1 -maxdepth 1 ! -type l -print

auth.jsonだけが出ればよい。

/Users/you/.codex-alternate/auth.json

代表的な共有状態はこうなる。

~/.codex-alternate/auth.json         # alternate専用
~/.codex-alternate/config.toml       -> ~/.codex/config.toml
~/.codex-alternate/sessions          -> ~/.codex/sessions
~/.codex-alternate/history.jsonl     -> ~/.codex/history.jsonl
~/.codex-alternate/state_5.sqlite    -> ~/.codex/state_5.sqlite
~/.codex-alternate/logs_2.sqlite     -> ~/.codex/logs_2.sqlite
~/.codex-alternate/goals_1.sqlite    -> ~/.codex/goals_1.sqlite
~/.codex-alternate/memories_1.sqlite -> ~/.codex/memories_1.sqlite
~/.codex-alternate/skills            -> ~/.codex/skills
~/.codex-alternate/plugins           -> ~/.codex/plugins

CODEX_PROFILEで切り替える

Codex CLI標準にCODEX_PROFILEという環境変数はない。なので、シェル関数で作る。

~/.zshrcなどに追加する:

codex() {
  local profile="${CODEX_PROFILE:-default}"
  local codex_home

  case "$profile" in
    default|primary)
      codex_home="$HOME/.codex"
      ;;
    alternate|secondary)
      codex_home="$HOME/.codex-alternate"
      ;;
    *)
      echo "unknown CODEX_PROFILE: $profile" >&2
      echo "expected: default or alternate" >&2
      return 2
      ;;
  esac

  CODEX_HOME="$codex_home" command codex "$@"
}

使い方:

codex
CODEX_PROFILE=alternate codex

execlogin statusも同じ。

codex login status
CODEX_PROFILE=alternate codex login status

codex exec "Reply OK"
CODEX_PROFILE=alternate codex exec "Reply OK"

cxporterも同じノリにする

cxporterもCodex config/authを読むので、同じCODEX_PROFILE解決にしておくと混乱しにくい。

cxporter() {
  local profile="${CODEX_PROFILE:-default}"
  local codex_home

  case "$profile" in
    default|primary)
      codex_home="$HOME/.codex"
      ;;
    alternate|secondary)
      codex_home="$HOME/.codex-alternate"
      ;;
    *)
      echo "unknown CODEX_PROFILE: $profile" >&2
      echo "expected: default or alternate" >&2
      return 2
      ;;
  esac

  CODEX_HOME="$codex_home" command cxporter "$@"
}

これで以下のように使える。

cxporter list --server codex_apps
CODEX_PROFILE=alternate cxporter list --server codex_apps

MCP credentialの扱い

通常MCP OAuth credentialのfile storeは.credentials.jsonに入る。これを共有したい場合はsymlinkできる。

ln -s "$HOME/.codex/.credentials.json" "$HOME/.codex-alternate/.credentials.json"

共有すると、alternate profileでも同じ外部サービス identity になる。

一方、codex_appsは通常MCPの.credentials.jsonとは別物。ChatGPT auth / Codex runtime側でconnector surfaceとauthが合成される。

default codex_apps   -> ~/.codex/auth.json のChatGPT account
alternate codex_apps -> ~/.codex-alternate/auth.json のChatGPT account

codex_appsだけを.credentials.jsonで共有する、という運用は基本的にできない。

注意点

  • auth.jsonは共有しない
  • sessions/history/state/logsは混ざる
  • 履歴も完全に分けたい場合は、symlinkせずにCODEX_HOMEを完全分離する

ref

  • codex --help
  • codex login --help
  • codex doctor --summary