mcdx — switch between Codex auth profiles
mcdx is a small CLI for switching between saved
OpenAI Codex login credentials, so you can
use personal and work accounts on the same machine.
It manages only:
~/.codex/auth.json
It does not copy config.toml, sessions, history, SQLite state, plugins, skills,
or temporary runtime files. Runtime state and config.toml stay owned by Codex
itself — after a switch, mcdx asks Codex to restart its app-server daemon so
the new credentials are actually picked up.
Requirements
- Python 3.10+
- The
codexCLI on yourPATH(used bymcdx add, and to reload the app-server daemon afteradd/switch)
Install
# Recommended: pipx (isolated environment, mcdx lands on your PATH)
pipx install mcdx
# Or plain pip
pip install --user mcdx
Published on PyPI.
Install from a clone
git clone https://github.com/zackaryjing/multi-account-codex
mkdir -p ~/.local/bin
ln -sf "$PWD/multi-account-codex/mcdx.py" ~/.local/bin/mcdx
chmod +x multi-account-codex/mcdx.py
Make sure ~/.local/bin is on your PATH.
Usage
mcdx save-current main # save your current login as a profile
mcdx add alt # log in with Codex device auth, saved as a profile
mcdx list # list saved profiles (* marks the active one)
mcdx current # show the active profile
mcdx switch main # switch the active Codex auth
mcdx use main # alias for switch
mcdx update main # log in again to refresh an expired profile
mcdx remove old-name # delete a profile
mcdx rename a b # rename a profile
mcdx doctor # check paths, Codex binary and daemon status
mcdx add, mcdx update, and mcdx switch accept:
| Flag | Effect |
|---|---|
-y, --yes |
answer yes to prompts, including the daemon restart |
--no-daemon-restart |
leave the Codex app-server daemon running as it is |
Where things live
Profiles are stored under:
~/.local/share/mcdx/profiles/<name>/
Each profile contains an auth.json copy and metadata.json. Credentials are
not encrypted — the profiles directory is created with 0700 permissions.
Environment overrides:
| Variable | Default | Purpose |
|---|---|---|
MCDX_CODEX_HOME |
~/.codex |
Codex home directory |
MCDX_DATA_HOME |
~/.local/share/mcdx |
mcdx data directory |
MCDX_CODEX_BIN |
codex |
Codex binary for add and daemon restarts |
Behavior
mcdx add <name>temporarily moves the active auth aside, runscodex login --device-auth, saves the resultingauth.json, and leaves the new profile active.mcdx update <name>re-runs that login flow for an existing profile and replaces its credentials in place, so an expired profile can be refreshed withoutremove+add. On failure the profile and the active auth are left untouched.mcdx switch <name>saves the current auth as_lastbefore switching.- Duplicate credentials are detected by
account_idandauth.jsonSHA-256. - An interrupted
add/updateis rolled back immediately for catchable exits (Ctrl+C, SIGTERM/SIGHUP from a closing terminal) and on the nextmcdxrun for a hard kill, via a journal under the data directory. - Codex keeps a long-lived app-server daemon that reads
auth.jsononce at startup, and sessions talk to that daemon rather than to the file. Afteradd/switch, mcdx therefore runscodex app-server daemon restart; without it the daemon keeps serving the previous account no matter whatauth.jsonsays. mcdx asks first (default yes) when it can, and never restarts a daemon that is not running. Restarting interrupts any codex sessions live on that daemon, so scripts should pass-yto accept that, or--no-daemon-restartand reload later.
Development
python3 tests.py # run the test suite
License
Metadata
Release files for mcdx 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcdx-0.3.0.tar.gz | 10.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcdx-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.8 kB
Release files / mcdx-0.3.0.tar.gz
| Download URL | mcdx-0.3.0.tar.gz |
|---|---|
| Size | 10.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ff4a0623b6b339b970c003f6ccf09d782f0d43f527a5466e23c84f04c384d46d
|
|
BLAKE2b-256 checksum How to use checksums |
d0703d8bb07606ecfe89fde4759192301bc9c5d488f0b805d8d9b7f251515307
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / mcdx-0.3.0-py3-none-any.whl
| Download URL | mcdx-0.3.0-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
db4be23a008e0d5e26193be5c5bbbaa39a86aaf01930566c4fd8775955926911
|
|
BLAKE2b-256 checksum How to use checksums |
b21c899a67dc4793505fd0ad148fbe96be9a1377673bb801ce5ee0ae95cb7af4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|