Tolerate a non JSON-RPC response body for notifications - #153
Draft
orthodoX wants to merge 1 commit into
Draft
Conversation
orthodoX
marked this pull request as draft
July 30, 2026 19:16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The MCP spec says a server answers a notification (a message with no
id) with 202 Accepted and no body, which the transport handles. Some servers (e.g.https://mcp.trainual.com) instead return 200 withbody: { ok: true }that is not a JSON-RPC envelope.handle_success_responsevalidates every 200 JSON body as an envelope, so thenotifications/initializedstep raisesTransportError: Invalid JSON response: Invalid JSON-RPC envelope, killing the handshake right after a successfulinitialize.Fix
When the message was a notification (
request_idis nil), skip the JSON body entirely, nothing waits on it. Requests keep the strict envelope validation. The session id header is still captured, since that happens inhandle_responsebefore the body is read.One existing spec asserted a
Resultwas returned for a notification response; updated it to expect nil while confirming the session id is still captured.