Skip to main content

Codex

You need a personal access token — create one in Profile -> API Tokens (guide) — and a current Codex version. Streamable HTTP is a first-class transport in current Codex; no flags needed. Very old builds may require experimental_use_rmcp_client = true — see If the connection fails.

Codex cloud/web doesn't support custom MCP servers. This guide covers the CLI and the IDE extension only.

Quick setup

Keep the token out of the config file by passing it through an environment variable:

# Add the export to ~/.zshrc or ~/.bashrc so it survives new shells
export WRITEMARS_PAT="writemars_pat_..."

codex mcp add writemars --url "https://api.writemars.com/mcp/" --bearer-token-env-var WRITEMARS_PAT

This works because WriteMars accepts Authorization: Bearer writemars_pat_... alongside X-API-Key.

Verify:

codex mcp list # writemars should show as connected
codex mcp get writemars # full details for one server

There is no --header flag on codex mcp add. If you want a custom header instead of the bearer token, edit config.toml directly (below).

config.toml

codex mcp add writes the global ~/.codex/config.toml. You can edit it by hand — or use .codex/config.toml inside a trusted project. The equivalent of the command above:

[mcp_servers.writemars]
url = "https://api.writemars.com/mcp/"
bearer_token_env_var = "WRITEMARS_PAT"

To send the X-API-Key header instead:

[mcp_servers.writemars]
url = "https://api.writemars.com/mcp/"
env_http_headers = { "X-API-Key" = "WRITEMARS_PAT" } # value read from the env var

# or static — token sits in the file in plaintext:
# http_headers = { "X-API-Key" = "writemars_pat_..." }

config.toml has no ${VAR} interpolation — bearer_token_env_var and env_http_headers are the only ways to pull values from the environment.

Optional per-server keys: startup_timeout_sec (default 10), tool_timeout_sec (default 60), enabled_tools / disabled_tools to filter tools, and enabled = false to switch the server off without deleting it.

IDE extension

The Codex IDE extension reads the same ~/.codex/config.toml as the CLI — configure once, both pick it up.

One caveat: an editor launched from the GUI (Dock, Spotlight) may not see env vars set in your shell profile, so bearer_token_env_var and env_http_headers resolve empty. Either launch the editor from a terminal (code .) or use the static http_headers form.

If the connection fails

Very old Codex builds need a flag for Streamable HTTP:

# ~/.codex/config.toml — old builds only; removed in current Codex
experimental_use_rmcp_client = true

If native HTTP still fails, bridge through mcp-remote over stdio (needs Node.js):

[mcp_servers.writemars]
command = "npx"
args = ["-y", "mcp-remote", "https://api.writemars.com/mcp/", "--header", "X-API-Key:${WRITEMARS_PAT}"]
env = { WRITEMARS_PAT = "writemars_pat_..." }

The X-API-Key:${WRITEMARS_PAT} form (no space after :) sidesteps an argument-splitting quirk in some mcp-remote versions. ${WRITEMARS_PAT} is expanded by mcp-remote itself from its env table — not by Codex's config parser.

More in troubleshooting.

Try it

Inside any Codex session:

List my WriteMars workspaces.

Then see the tool reference for what's available and the prompt cookbook for example prompts. Connection failing? See troubleshooting.