MCP compatibility
Conduit has one policy, audit, registry, and dispatcher. Its native public
profile is MCP 2026-07-28 (server/discover, tools/list, and terminal
JSON tools/call). At ingress only, it also adapts the standard session-based
Streamable HTTP negotiation used by current desktop and CLI MCP clients. The
adapter never changes the modern protocol used to communicate with downstream
servers.
Compatibility matrix
| Client / mode | Status | Negotiation accepted | Last verified |
|---|---|---|---|
| MCP Inspector 2.4.0, default | Supported | initialize + session, 2025-11-25 |
Real tools/list and tools/call through Conduit on 2026-09-02. |
MCP Inspector 2.4.0, protocolEra: modern |
Supported | Native server/discover, 2026-07-28 |
Real tools/list and tools/call on 2026-09-02. |
| Claude Code 2.1.236, HTTP MCP | Supported | Standard session-based Streamable HTTP (2025-11-25) |
claude mcp get reported Connected on 2026-09-02. An authenticated Claude conversation is required to issue a tool call. |
| Codex CLI 0.149.1 remote MCP | Supported | Standard session-based Streamable HTTP (2025-06-18) |
The real Codex connector completed MCP initialization/event-channel setup on 2026-09-02. A logged-in Codex session is required for model-directed tool calls. |
| Older/other standard clients | Conditional | Exactly 2025-06-18 or 2025-11-25, initialize, Mcp-Session-Id |
Try the standard Streamable HTTP endpoint; unsupported protocol versions fail closed. |
| stdio, SSE-only, OAuth broker clients | Unsupported | — | Conduit is an HTTP gateway, not a stdio/SSE/OAuth broker. |
The verification dates describe installed-client interoperability, not a claim that a client vendor will never change its wire behavior. Keep Conduit and the client updated together and use the regression tests when upgrading either.
What the adapter accepts
For a standard client, Conduit accepts initialize with protocol version
2025-06-18 or 2025-11-25, returns an opaque Mcp-Session-Id, accepts the
client's notifications/initialized, and requires that same session/version
pair on later tools/list and tools/call requests. Sessions are opaque,
per-client, version-bound, and removed by DELETE /mcp; they are never passed
to a downstream or used to select a route.
GET /mcp for a valid standard session returns a short comment-only
text/event-stream response. It exists for clients that establish their
notification channel during initialization. Conduit never turns a downstream
tool response into SSE and does not emit progress, subscriptions, tasks, or
server notifications. Tool results remain terminal JSON.
All adapted tools/list and tools/call requests continue through the exact
same registry snapshot, deny-wins policy, header validation, durable
audit-before-dispatch write, credential isolation, route lookup, timeout, and
one-shot downstream dispatch as native modern requests. The adapter supplies
only the internal Mcp-Name correlation header from the validated JSON body;
a caller-provided conflicting value is rejected.
Downstream terminal SSE responses
Conduit supports Streamable HTTP downstreams that return either
application/json terminal JSON-RPC responses or a finite
text/event-stream response containing exactly one correlated terminal
JSON-RPC message event. The SSE decoder is incremental and bounded by the
same catalog or tool-response limit as JSON. It supports LF/CRLF framing,
comments, chunk boundaries, and multiple data: lines joined according to SSE
framing rules.
This is terminal-response compatibility, not a streaming bridge. Conduit does
not forward downstream SSE to clients, relay progress/events, accept unrelated
or multiple terminal messages, reconnect/replay, or retry a tools/call. A
malformed, truncated, mismatched, oversized, progress-style, or indefinite
stream fails closed. Once a tool call may have reached its downstream, a lost
or unreadable terminal response remains an uncertain outcome.
Stateful downstream tool calls may return Mcp-Session-Id; Conduit performs at
most one bounded cleanup DELETE using that invocation-owned downstream
session ID. It does not retain or replay that identifier on a later invocation.
A session advertised before a failed, oversized, or disconnected response is
still cleaned up where the downstream made that identifier available.
Client setup
Start Conduit and wait for "ready": true first:
conduit --config conduit.yaml
curl -sS http://127.0.0.1:8080/healthz
Claude Code
claude mcp add --transport http conduit http://127.0.0.1:8080/mcp
claude mcp list
For project configuration use --scope project; Claude Code requires project
MCP approval before it opens the connection. claude mcp get conduit should
show Status: Connected. Then use the namespaced tools in an authenticated
Claude Code conversation, for example github.add or calc.square.
Codex CLI / Codex app
codex mcp add conduit --url http://127.0.0.1:8080/mcp
codex mcp list
Start a logged-in Codex session and ask it to use a namespaced Conduit tool. The remote MCP configuration is HTTP; do not configure Conduit as a stdio server. A 401 from the OpenAI model endpoint is Codex authentication failure, not a Conduit MCP protocol failure.
MCP Inspector default mode
npx @modelcontextprotocol/inspector --cli \
--transport http --server-url http://127.0.0.1:8080/mcp \
--method tools/list --format json
To call a tool:
npx @modelcontextprotocol/inspector --cli \
--transport http --server-url http://127.0.0.1:8080/mcp \
--method tools/call --tool-name calc.square \
--tool-args-json '{"value": 9}' --format json
MCP Inspector forced-modern mode
Save inspector-modern.json:
{
"mcpServers": {
"conduit": {
"type": "http",
"url": "http://127.0.0.1:8080/mcp",
"protocolEra": "modern"
}
}
}
Then run:
npx @modelcontextprotocol/inspector --cli \
--config inspector-modern.json --server conduit \
--method tools/list --format json