Skip to content

Fix/mcp sse accept routing - #13

Merged
abcsnowwolf merged 2 commits into
mainfrom
fix/mcp-sse-accept-routing
Aug 16, 2026
Merged

abcsnowwolf merged 2 commits into
mainfrom
fix/mcp-sse-accept-routing

Conversation

@abcsnowwolf

Copy link
Copy Markdown
Contributor

No description provided.

MCP's Streamable HTTP transport requires clients to send
`Accept: application/json, text/event-stream` on every POST.
ESPAsyncWebServer reads any Accept containing text/event-stream as an SSE
subscription and marks the request RCT_EVENT regardless of method, after
which AsyncCallbackWebHandler::canHandle() declines it (it insists on
isHTTP()) and the request falls through to the catch-all. Every
spec-conformant client got a 404 while a bare curl worked.

* replace the three /mcp server->on() routes with a custom AsyncWebHandler
  that matches on path alone, keeping the connection type out of routing
* dispatch by method in handleEndpointRequest, so the client's GET probe
  for a server-initiated stream gets the 405 the spec prescribes, not 404
* return false from begin() when the endpoint handler cannot be allocated,
  rolling back the worker task instead of listening on a dead server
* model the Accept-driven RCT_EVENT downgrade in the test mock and resolve
  routes per request, so the gap is reproducible rather than assumed away
* cover both the POST and the GET stream probe with regression tests
* ship the /mcp routing fix for clients sending the Streamable HTTP
  Accept header; every consumer on 0.2.0 is unreachable by a conformant
  MCP client
@abcsnowwolf
abcsnowwolf merged commit c9db77c into main Aug 16, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant