2025-06-18 and 2026-07-28 tools over stdio and
independent HTTP POSTs with JSON responses. Local reports record the checked-out
base Git revision; verification can include uncommitted working-tree changes.
Results
Codex’s normal test configuration contains neither
features.mcp_2026_07_28 nor
CODEX_MCP_PROTOCOL_VERSION. Captured traffic starts with initialize requesting
2025-06-18, then notifications/initialized, tools/list, and tools/call.
Both transports return the expected identity and tool schema, ASCII and Unicode
greetings, and isError: true for empty or numeric names. All six
client/transport combinations across the three configurations pass, including
24 tool calls. The same HTTP example serves both eras.
Modern captures confirm server/discover, per-request version/capability
metadata, and matching HTTP routing headers. Legacy wire results omit modern
resultType and cache fields; modern wire results retain them. CLI clients can
normalize these fields before printing, so envelope assertions use raw captures
and integration tests.
After separating the modern and legacy modules on 2026-10-17, all client checks
above pass again. A frozen build of a235d7e and the refactored build also produce
identical results across 147 observations covering both eras, HTTP statuses and
headers, malformed requests, stdio initialization, cancellation, and shutdown.
Public server, transport, and HTTP declarations remain byte-identical. Modern
modules have no direct or transitive dependency on legacy modules within MCP or
HTTP; execution and transport behavior stay shared.
Unified tool API verification — 2026-10-18
After moving tool authoring and execution into@toolgrain/mcp, Inspector 2.11.0
passes all 30 checks again over real stdio and plain Node HTTP, covering modern,
legacy, and automatic discovery. Strict tool listings now also verify the title,
read-only annotation, and object output schema. The Codex results above describe
the earlier verification; Codex was not rerun for this API change.
The library suites and six example applications pass 182 tests. Each example
imports tool and createServer from @toolgrain/mcp and verifies metadata,
output-schema discovery, and execution in both revisions. Additional server tests
cover parsed/defaulted/transformed outputs, asynchronous validation, rich content,
explicit errors, cancellation during output validation, and incompatible legacy
metadata/output-schema omission. Compiled package/declaration checks pass, and
vendor integrity remains unchanged. MCP coverage is 99.52% statements, 99.32%
branches, 99.03% functions, and 100% lines.
Structured error validation was also rechecked on 2026-10-18: both revisions now
validate any supplied structuredContent against the declared output schema,
including isError: true results. Text-only errors may omit structured data;
output defaults do not create it. Regression tests cover parsed error defaults,
transforms, async refinements, and 0, false, and null payloads. All 93 MCP and
38 HTTP tests pass, as do source type checks and compiled declaration checks for
valid text-only errors and rejected incompatible structured errors.
Review fixes on 2026-10-19 treat undefined optional mcpResult() envelope and
content fields, and undefined optional properties after output parsing, as absent.
Undefined values inside unparsed structured data are still rejected. Text that
serializes the original structured data is replaced by the parsed serialization.
Tools and rich results are recognized across duplicate package copies through
registered-symbol brands; spreads still lose the brand. MCP now passes 99 tests.
Normal Codex setup
Build the examples and configure the command or URL using normal MCP settings:Explicit modern verification
These optional settings select2026-07-28 in the tested Codex alpha:
Repeat the Inspector checks
Use Node 24.20.0 or a newer supported Node version and Bun 1.3.14:bun run verify:inspector) pins Inspector 2.11.0 through
Bunx outside the workspace, runs the compiled examples using the invoking Node
executable, and starts HTTP on an available loopback port. Configuration, storage, and secrets are temporary.
It cleans up subprocess groups on POSIX systems, including timeouts and signals.
No browser, authentication, inference, or npm publication is needed. An uncached
Inspector needs registry access. To use a preinstalled copy:
- In each era: discovery/connection, strict tool-schema listing, ASCII and Unicode greetings, empty-string and numeric-input errors, and an unlisted tool.
- Automatic discovery selects modern mode on each transport.
isError: true. Its connection-only CLI operation is named
--method initialize in both eras; modern mode performs discovery. Interactive
inspect scripts select modern mode; this verification script tests both.
See the official protocol-era
and CLI documentation.
Runs write status, stdout/stderr, exit codes, versions, and base revision to
reports/compatibility/inspector.json. Failures replace earlier success reports.
This manual check is not added to CI and adds no MCP SDK dependency.
Codex verification method
Tests launched the installedcodex app-server --stdio with isolated temporary
configuration and an ephemeral thread. An unused loopback model provider required
no authentication; no inference turn started. The control sequence was:
initializewithcapabilities.experimentalApi: true, theninitialized.thread/startwithephemeral: true, using the temporary test directory.mcpServerStatus/listfor each server and returnedthreadId, usingdetail: "toolsAndAuthOnly"; assert connection and schema.mcpServer/tool/callwith namesCompatibilityandZoë 世界; assert greetings.- Repeat with an empty and numeric name; assert
isError: true.
initialize. Separate stdio/HTTP forwarding
taps capture actual MCP traffic to distinguish it. All test-owned processes were
stopped. A sanitized local summary is retained at reports/compatibility/codex.json.
Protocol behavior and limits
- Initialization negotiates
2025-06-18, including when a client proposes another revision. A client unable to use it must stop. This does not implement or claim the proposed revision. Modern discovery advertises the two supported revisions. - Modern metadata and HTTP routing headers remain strict. Contradictory versions are rejected. Stdio keeps legacy readiness per connection while allowing independent modern requests; HTTP selects the revision per POST without session IDs or one client’s negotiated version affecting another.
- Legacy HTTP initialization may omit the version header; later POSTs use
MCP-Protocol-Version: 2025-06-18. Optional routing/parameter headers are checked when present. Valid initialized/cancelled notifications return 202 empty; GET and DELETE remain 405. - Legacy HTTP cancellation is advisory and cannot cancel another invocation:
a stateless notification has no client/session identity for safe routing.
Disconnects and stdio cancellation suppress delivery and abort the handler’s
ctx.signal; handlers stop early only if they observe it. - Legacy structured content contains objects only. Other JSON outputs retain their JSON text. Modern output behavior remains unchanged.
bun run test:package now also
installs each packed library in its own npm consumer to check declared dependency
resolution, runtime imports, and strict declarations. A separate full consumer
checks both protocol revisions over stdio and HTTP under Node.
This installation check uses the development dependency versions and offline
JWT/Clerk initialization with test configuration; it does not extend the real-client
compatibility claims above. Licensing and other proposed roadmap items remain
separate work.