MCP elicitation over remote streamable HTTP: dialog renders, user's Accept never reaches the server (works over stdio)
Environment
- ChatGPT Desktop (Mac) 26.810.50856 (released 2026-08-14)
- Embedded MCP client:
codex-mcp-client0.148.0-alpha.9 - Remote MCP server over streamable HTTP (TypeScript SDK 1.x), OAuth-authenticated
- Client capabilities advertised:
elicitation: { form: {}, url: {} }
Behavior
The server issues elicitation/create (form mode, a simple single-select enum schema). The dialog renders correctly in ChatGPT Desktop and the user clicks Accept/OK — but the response never reaches the server: the server-side elicitation/create request fails with an error ~6 seconds later.
Observed identically for two different requests in the same session:
- a diagnostic probe elicitation: server-side error after 6104 ms
- a confirm dialog ("Need help?" with OK/Cancel options): user clicked OK; the server received an error instead of the accept
Works over stdio
The same host (ChatGPT Desktop 26.810.41047, same codex-mcp-client 0.148.0-alpha.9) against a local stdio MCP server completes the identical elicitation end-to-end: dialog renders, user accepts, { action: "accept", content: { value: "ok" } } arrives at the server (~10 s human latency, negotiated protocol 2025-06-18).
Expected
The user's Accept (with content) is delivered to the server as the elicitation/create response, exactly as it is over stdio.
Possibly related
- #6992 (rmcp_client elicitation support — closed; this bug appears to be in the response-delivery path added after that)
- #9053 (Accept arrived with
content: None— closed; here the Accept doesn't arrive at all) - #13405 (umbrella elicitation compliance)
2 Comments
Could you assign this to me
Correction — this was not a host bug. ChatGPT Desktop behaved correctly; closing.
After adding error-detail capture to our diagnostics, the failing round-trip surfaced the true cause on our side:
Our server runs on Cloudflare Workers. The MCP TypeScript SDK (v1) validates a form-mode accept's
contentagainstrequestedSchemawith Ajv by default, and Ajv compiles schemas vianew Function()— forbidden in the Workers runtime. The client's Accept did arrive, correctly formed; our server errored while validating it. Cancel/decline/URL responses carry no content, which is why only content-bearing accepts failed and the pattern looked transport-specific.Fix on our side: pass the SDK's own
CfWorkerJsonSchemaValidatorviaServerOptions.jsonSchemaValidator. Verified end-to-end afterward: ChatGPT Desktop 26.810.52044 completes remote streamable-HTTP form elicitation correctly (accept with content, ~4s human latency).Apologies for the noise. For anyone landing here with the same symptom on a Workers-hosted MCP server: the default Ajv provider cannot run in workerd; the validator option is the cure.