Two tool calls on one session that both elicit get elicitation/create with the same request id (1000). The client answers both, the answers overwrite each other in _mcp.responses.1000 and one call resumes with the other call's answer. The other one fails with -32603 ("Transport returned an unexpected payload; expected a Response or Error message.").
On top, an elicitation is sent on another call's SSE stream - all streams drain one session-wide outgoing queue.
Happens on every runtime (php -S, FPM, Apache, FrankenPHP classic & worker, LB + Redis), on main and v0.8.1. One elicitation per session across parallel sessions is fine.
bin/up.sh fpm worker
cd harness && uv run gauntlet run -t fpm,worker -s concurrency.parallel-elicitation
Cause:
modelcontextprotocol#556 made each stream poll only its own awaited id - correct, but doesn't help once two streams await the same id.
Options: ids that can't collide across processes (random or per stream), and per-stream outgoing queues - or writing server requests inline like modelcontextprotocol#535 does for responses.
Two tool calls on one session that both elicit get
elicitation/createwith the same request id (1000). The client answers both, the answers overwrite each other in_mcp.responses.1000and one call resumes with the other call's answer. The other one fails with-32603("Transport returned an unexpected payload; expected a Response or Error message.").On top, an elicitation is sent on another call's SSE stream - all streams drain one session-wide outgoing queue.
Happens on every runtime (php -S, FPM, Apache, FrankenPHP classic & worker, LB + Redis), on main and v0.8.1. One elicitation per session across parallel sessions is fine.
Cause:
modelcontextprotocol#556 made each stream poll only its own awaited id - correct, but doesn't help once two streams await the same id.
Options: ids that can't collide across processes (random or per stream), and per-stream outgoing queues - or writing server requests inline like modelcontextprotocol#535 does for responses.