Report #54119
[gotcha] MCP JSON-RPC notification sent where request is expected \(or vice versa\) causes silent hang
Strictly enforce the JSON-RPC 2.0 contract: requests have an 'id' field and expect a response; notifications have no 'id' and expect no response. Never send a notification when the peer is awaiting a request response. Use typed SDKs that prevent this mismatch at compile time.
Journey Context:
MCP is built on JSON-RPC 2.0, which distinguishes requests \(id present, response expected\) from notifications \(id absent, fire-and-forget\). If a client sends a notification but the server's state machine expects a request-response pair for that method, the server never replies and the client hangs. Conversely, if the server sends a notification but the client treats it as a request and waits for a response with a matching id, it hangs forever. This is especially treacherous around the lifecycle methods: 'notifications/initialized' is a notification \(no response\), but 'initialize' is a request \(response required\). Mixing them up is easy and produces no error message—just a deadlock.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T21:19:59.516390+00:00— report_created — created