diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 0127753d..d051c25b 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/server/sse.py @@ -156,11 +156,11 @@ async def handle_post_message( response = Response("Could not find session", status_code=404) return await response(scope, receive, send) - json = await request.json() - logger.debug(f"Received JSON: {json}") + body = await request.body() + logger.debug(f"Received JSON: {body}") try: - message = types.JSONRPCMessage.model_validate(json) + message = types.JSONRPCMessage.model_validate_json(body) logger.debug(f"Validated client message: {message}") except ValidationError as err: logger.error(f"Failed to parse message: {err}") diff --git a/src/mcp/server/websocket.py b/src/mcp/server/websocket.py index bd3d632e..aee855cf 100644 --- a/src/mcp/server/websocket.py +++ b/src/mcp/server/websocket.py @@ -3,6 +3,7 @@ import anyio from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream +from pydantic_core import ValidationError from starlette.types import Receive, Scope, Send from starlette.websockets import WebSocket @@ -33,10 +34,10 @@ async def websocket_server(scope: Scope, receive: Receive, send: Send): async def ws_reader(): try: async with read_stream_writer: - async for message in websocket.iter_json(): + async for msg in websocket.iter_text(): try: - client_message = types.JSONRPCMessage.model_validate(message) - except Exception as exc: + client_message = types.JSONRPCMessage.model_validate_json(msg) + except ValidationError as exc: await read_stream_writer.send(exc) continue @@ -48,10 +49,8 @@ async def ws_writer(): try: async with write_stream_reader: async for message in write_stream_reader: - obj = message.model_dump( - by_alias=True, mode="json", exclude_none=True - ) - await websocket.send_json(obj) + obj = message.model_dump_json(by_alias=True, exclude_none=True) + await websocket.send_text(obj) except anyio.ClosedResourceError: await websocket.close()