Codex CLI

OpenAI's coding agent, shipping as a CLI and an app-server. Rust, using rmcp 3.1.3 as its MCP client through a codex-rmcp-client wrapper crate. Codex also runs as an MCP server, which is a separate code path and not described here.

At a glance

Registry id openai-codex
Vendor OpenAI
Category cli
Platforms windows, macos, linux
Licence Apache-2.0
Source https://github.com/openai/codex
Home https://openai.com/codex
Wire names codex-mcp-client
SDK rmcp 3.1.3 · declares =3.1.3 · official Rust SDK · unpatched
Prefers 2025-06-18
Speaks 2025-06-18, 2026-07-28
Source last updated 2026-08-24
Last read 2026-08-24
Probed 0.169.0-alpha.3 (see below)
In traffic evalstate/mcp-clients, window ending 2026-11-08 (see below)

Capabilities

Capability Status Known by At
Transports
  ↳ stdio ● full read 2025-06-18
  ↳ sse ○ unsupported read 2025-06-18
  ↳ streamableHttp ● full read, declared 2025-06-18
Authentication
  ↳ oauth ● full read 2025-06-18
  ↳ header ● full read 2025-06-18
Tools ● full read, declared 2025-06-18
  ↳ listChanged ◐ partial read 2025-06-18
  ↳ result ● full read 2025-06-18
    ↳ structuredContent ● full read ⇧ 2025-06-18
    ↳ content ◐ partial read ⇧ 2025-06-18
    ↳ audience ○ unsupported read ⇧ 2025-06-18
Resources ● full read 2025-06-18
  ↳ listChanged ◐ partial read ⇧ 2025-06-18
  ↳ subscribe ○ unsupported read ⇧ 2025-06-18
Prompts ○ unsupported read 2025-06-18
Completions ○ unsupported read 2025-06-18
Sampling ○ unsupported read 2025-06-18
Elicitation ● full read, declared 2025-06-18
  ↳ form ● full read, declared ⇧ 2025-06-18
  ↳ url ● full read, declared ⇧ 2025-06-18
Roots ○ unsupported read 2025-06-18
Logging ◐ partial read 2026-07-28
Instructions ● full read 2025-06-18
Icons ◐ partial read 2025-06-18
Tasks ○ unsupported read 2026-07-28
JSON Schema — not recorded
Extensions
  ↳ openai/form ◐ partial read 2025-06-18
  ↳ openai/standard-form-input ◐ partial read 2025-06-18
  ↳ io.modelcontextprotocol/ui ◐ partial read 2025-06-18
Beyond the spec
  ↳ modelInitiatedResourceRead ● full read 2025-06-18

● full ◐ partial ○ unsupported · untested — not recorded ⇧ rests on the parent capability's evidence

Not recorded means nobody has looked, which is not the same claim as unsupported. Under tools.result, full means the field reaches the model on the default conversational path, partial means it does under a condition the notes name, and unsupported means it never does.

What the table flattens

Verified by the probe

38 records from the live probe (probe/), client version 0.169.0-alpha.3. Each row is one run against the instrumented fixture server with the model mocked; the verdict says which fixture fields reached the model. Glyphs: […] content, {…} structuredContent, ⟨…⟩ the whole envelope, "…" a placeholder. The scenario link opens the record; the raw captures sit next to it. Overlay: data/verified/codex.json.

Scenario Config Run At Version Verdict
apps.visibility
app_only default stdio 2025-06-18 0.169.0-alpha.3 tool not offered to the model
app_only mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 tool not offered to the model
tools.result._meta
meta_only default stdio 2025-06-18 0.169.0-alpha.3 […] content only (1x, as text, _meta did not reach the model)
meta_only mcp-2026-07-28 http 2026-07-28 0.169.0-alpha.3 […] content only (1x, as text, _meta did not reach the model)
with_meta default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json, _meta did not reach the model)
with_meta mcp-2026-07-28 http 2026-07-28 0.169.0-alpha.3 {…} structuredContent only (1x, as json, _meta did not reach the model)
tools.result.audience
audience_user default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
audience_user mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
tools.result.content
empty_object default stdio 2025-06-18 0.169.0-alpha.3 "…" no marker reached the model; payload: "[{"type":"input_text","text":"Wall time: 0.0053 seconds\nOutput:"},{"type":"inpu"
empty_object mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 "…" no marker reached the model; payload: "[{"type":"input_text","text":"Wall time: 0.0042 seconds\nOutput:"},{"type":"inpu"
large default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
large mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
no_content_key default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
no_content_key mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
tools.result.isError
is_error default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
is_error mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
tools.result.media
with_image default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
with_image mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
tools.result.outputSchema
schema_match default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
schema_match mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
schema_mismatch default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
schema_mismatch mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
tools.result.structuredContent
mirror default http 2025-06-18 0.169.0-alpha.3 payload once (as json)
mirror default stdio 2025-06-18 0.169.0-alpha.3 payload once (as json)
mirror mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 payload once (as json)
sc_empty default stdio 2025-06-18 0.169.0-alpha.3 "…" no marker reached the model; payload: "Wall time: 0.0133 seconds\nOutput:\n{}"
sc_empty mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 "…" no marker reached the model; payload: "Wall time: 0.0117 seconds\nOutput:\n{}"
sc_null default stdio 2025-06-18 0.169.0-alpha.3 […] content only (1x, as text)
sc_null mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 […] content only (1x, as text)
sc_string default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as text)
sc_string mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as text)
structured_only default http 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
structured_only default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
structured_only mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
summary_and_data default http 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
summary_and_data default stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
summary_and_data mcp-2026-07-28 http 2026-07-28 0.169.0-alpha.3 {…} structuredContent only (1x, as json)
summary_and_data mcp-2026-07-28 stdio 2025-06-18 0.169.0-alpha.3 {…} structuredContent only (1x, as json)

Observed in traffic

From evalstate/mcp-clients at c30d6f28, report generated 2026-11-09, window 2026-09-10 to 2026-11-08. Grouped as codex-cli from wire names codex-mcp-client. Tool calls by revision over the 30 days to 2026-11-08: 2026-07-28 <0.1%, 2025-06-18 100%.

Capability Observed At Registry Note
elicitation ● full ? ● full Set because the initialize-era backfill (2026-06-07/2026-07-26) has it, or because more than 50% of 2026-07-28 tool calls declared it; the report does not say which, so no revision is recorded.
elicitation.url ● full ? ● full Set because the initialize-era backfill (2026-06-07/2026-07-26) has it, or because more than 50% of 2026-07-28 tool calls declared it; the report does not say which, so no revision is recorded.
apps ● full 2026-07-28 ◐ partial ≠ More than 50% of this client's 2026-07-28 tool calls in the window declared it. 2026-07-28 is 0.011% of this client's tool calls over the 30 days to 2026-11-08, so the sample is small.
tasks ○ unsupported 2026-07-28 ○ unsupported At most 50% of this client's 2026-07-28 tool calls in the window declared it. 2026-07-28 is 0.011% of this client's tool calls over the 30 days to 2026-11-08, so the sample is small.

≠ the observed status differs from the registry's. The registry status may be about a different revision; compare the At column with the evidence above. Every row is read against the source's policy block, carried verbatim in data/observed/hf-mcp-clients.json.

Where the evidence disagrees

Research notes

Provenance

Read at b705b6b0 on 2026-08-24, from main of https://github.com/openai/codex.git. That commit was authored 2026-08-24.

SDK. Pinned exactly with '=', so the declared requirement and the resolved version agree. codex-rs/patches/ holds twenty-odd build-toolchain patches (v8, llvm, windows link flags) and none touch rmcp, and the [patch.crates-io] rmcp override is commented out as a local-debug escape hatch. Codex selects 2025-06-18 through its own protocol mode rather than inheriting a version from rmcp.

Paths read:

Source is not vendored. To reproduce any claim above, check out that commit in the client's repository.


Generated from data/clients.json, data/verified/codex.json, data/observed/hf-mcp-clients.json by scripts/build-cards.js. Edit the registry, rerun the probe or the ingest, not this file.