wellworn

Codex CLI

The config.toml table for a Streamable HTTP server, and the env var that keeps the key out of the file.

Codex reads ~/.codex/config.toml, shared by the CLI, the IDE extension and the desktop app. A project-scoped .codex/config.toml is read as well. Inside, a table with a command key is a stdio server and a table with a url key is a Streamable HTTP one.

Without a key

~/.codex/config.toml
[mcp_servers.wellworn]
url = "https://mcp.wellworn.dev/mcp"

codex mcp add writes the same table:

codex mcp add wellworn --url https://mcp.wellworn.dev/mcp

With a key

bearer_token_env_var names an environment variable. Codex reads it at connect time and sends Authorization: Bearer <value>, so the key never sits in the file.

~/.codex/config.toml
[mcp_servers.wellworn]
url = "https://mcp.wellworn.dev/mcp"
bearer_token_env_var = "WELLWORN_KEY"

http_headers takes static headers and env_http_headers takes headers whose values come from the environment, if you need one beyond authorization.

~/.codex/config.toml
[mcp_servers.wellworn]
url = "https://mcp.wellworn.dev/mcp"
http_headers = { "X-Client" = "codex" }

Confirm it works

codex mcp list prints the servers Codex loaded. Wellworn's eight tools are recommend, compare, alternatives, traps, skill, design, docs and submit_trap.

What breaks

The stdio and HTTP forms of codex mcp add are different commands: stdio is codex mcp add <name> -- <command>, HTTP is codex mcp add <name> --url <url>. Passing the URL after a bare -- registers it as a program to execute, which fails at launch rather than at connect.

codex mcp login <name> starts an OAuth flow. Wellworn has no OAuth server; it takes a bearer key or nothing, so use bearer_token_env_var instead.

Verified 2026-09-08 against learn.chatgpt.com