diff --git a/src/mcp/client/streamable_http.py b/src/mcp/client/streamable_http.py index 63b09133f..644760550 100644 --- a/src/mcp/client/streamable_http.py +++ b/src/mcp/client/streamable_http.py @@ -21,6 +21,7 @@ from mcp.shared._httpx_utils import McpHttpClientFactory, create_mcp_http_client from mcp.shared.message import ClientMessageMetadata, SessionMessage from mcp.types import ( + INVALID_REQUEST, ErrorData, InitializeResult, JSONRPCError, @@ -266,6 +267,14 @@ async def _handle_post_request(self, ctx: RequestContext) -> None: logger.debug("Received 202 Accepted") return + if response.status_code == 400: + if isinstance(message.root, JSONRPCRequest): + await self._send_invalid_request_error( + ctx.read_stream_writer, + message.root.id, + ) + return + if response.status_code == 404: if isinstance(message.root, JSONRPCRequest): await self._send_session_terminated_error( @@ -359,6 +368,20 @@ async def _send_session_terminated_error( session_message = SessionMessage(JSONRPCMessage(jsonrpc_error)) await read_stream_writer.send(session_message) + async def _send_invalid_request_error( + self, + read_stream_writer: StreamWriter, + request_id: RequestId, + ) -> None: + """Send an invalid request error response.""" + jsonrpc_error = JSONRPCError( + jsonrpc="2.0", + id=request_id, + error=ErrorData(code=INVALID_REQUEST, message="Invalid request"), + ) + session_message = SessionMessage(JSONRPCMessage(jsonrpc_error)) + await read_stream_writer.send(session_message) + async def post_writer( self, client: httpx.AsyncClient,