Skip to content

Commit c897868

Browse files
authored
Avoid double JSON encoding/decoding (#287)
1 parent 3775916 commit c897868

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

src/mcp/server/sse.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,11 @@ async def handle_post_message(
156156
response = Response("Could not find session", status_code=404)
157157
return await response(scope, receive, send)
158158

159-
json = await request.json()
160-
logger.debug(f"Received JSON: {json}")
159+
body = await request.body()
160+
logger.debug(f"Received JSON: {body}")
161161

162162
try:
163-
message = types.JSONRPCMessage.model_validate(json)
163+
message = types.JSONRPCMessage.model_validate_json(body)
164164
logger.debug(f"Validated client message: {message}")
165165
except ValidationError as err:
166166
logger.error(f"Failed to parse message: {err}")

src/mcp/server/websocket.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import anyio
55
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
6+
from pydantic_core import ValidationError
67
from starlette.types import Receive, Scope, Send
78
from starlette.websockets import WebSocket
89

@@ -33,10 +34,10 @@ async def websocket_server(scope: Scope, receive: Receive, send: Send):
3334
async def ws_reader():
3435
try:
3536
async with read_stream_writer:
36-
async for message in websocket.iter_json():
37+
async for msg in websocket.iter_text():
3738
try:
38-
client_message = types.JSONRPCMessage.model_validate(message)
39-
except Exception as exc:
39+
client_message = types.JSONRPCMessage.model_validate_json(msg)
40+
except ValidationError as exc:
4041
await read_stream_writer.send(exc)
4142
continue
4243

@@ -48,10 +49,8 @@ async def ws_writer():
4849
try:
4950
async with write_stream_reader:
5051
async for message in write_stream_reader:
51-
obj = message.model_dump(
52-
by_alias=True, mode="json", exclude_none=True
53-
)
54-
await websocket.send_json(obj)
52+
obj = message.model_dump_json(by_alias=True, exclude_none=True)
53+
await websocket.send_text(obj)
5554
except anyio.ClosedResourceError:
5655
await websocket.close()
5756

0 commit comments

Comments
 (0)