diff --git a/mcp_python/client/sse.py b/mcp_python/client/sse.py index 93d026d74..ebb4842a2 100644 --- a/mcp_python/client/sse.py +++ b/mcp_python/client/sse.py @@ -104,7 +104,7 @@ async def post_writer(endpoint_url: str): logger.debug(f"Sending client message: {message}") response = await client.post( endpoint_url, - json=message.model_dump(by_alias=True, mode="json"), + json=message.model_dump(by_alias=True, mode="json", exclude_none=True), ) response.raise_for_status() logger.debug( diff --git a/mcp_python/client/stdio.py b/mcp_python/client/stdio.py index 2c710640f..30c0bf64c 100644 --- a/mcp_python/client/stdio.py +++ b/mcp_python/client/stdio.py @@ -70,7 +70,7 @@ async def stdin_writer(): try: async with write_stream_reader: async for message in write_stream_reader: - json = message.model_dump_json(by_alias=True) + json = message.model_dump_json(by_alias=True, exclude_none=True) await process.stdin.send((json + "\n").encode()) except anyio.ClosedResourceError: await anyio.lowlevel.checkpoint() diff --git a/mcp_python/server/sse.py b/mcp_python/server/sse.py index 8ae643666..c6e9fa675 100644 --- a/mcp_python/server/sse.py +++ b/mcp_python/server/sse.py @@ -74,7 +74,7 @@ async def sse_writer(): await sse_stream_writer.send( { "event": "message", - "data": message.model_dump_json(by_alias=True), + "data": message.model_dump_json(by_alias=True, exclude_none=True), } ) diff --git a/mcp_python/server/stdio.py b/mcp_python/server/stdio.py index 8757c3d03..bfcc76c4d 100644 --- a/mcp_python/server/stdio.py +++ b/mcp_python/server/stdio.py @@ -48,7 +48,7 @@ async def stdout_writer(): try: async with write_stream_reader: async for message in write_stream_reader: - json = message.model_dump_json(by_alias=True) + json = message.model_dump_json(by_alias=True, exclude_none=True) await stdout.write(json + "\n") await stdout.flush() except anyio.ClosedResourceError: diff --git a/mcp_python/server/websocket.py b/mcp_python/server/websocket.py index 6547d7775..09f8a5a54 100644 --- a/mcp_python/server/websocket.py +++ b/mcp_python/server/websocket.py @@ -47,7 +47,7 @@ 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") + obj = message.model_dump(by_alias=True, mode="json", exclude_none=True) await websocket.send_json(obj) except anyio.ClosedResourceError: await websocket.close() diff --git a/mcp_python/shared/session.py b/mcp_python/shared/session.py index 8be938601..1705e0d39 100644 --- a/mcp_python/shared/session.py +++ b/mcp_python/shared/session.py @@ -132,7 +132,7 @@ async def send_request( self._response_streams[request_id] = response_stream jsonrpc_request = JSONRPCRequest( - jsonrpc="2.0", id=request_id, **request.model_dump(by_alias=True, mode="json") + jsonrpc="2.0", id=request_id, **request.model_dump(by_alias=True, mode="json", exclude_none=True) ) # TODO: Support progress callbacks @@ -150,7 +150,7 @@ async def send_notification(self, notification: SendNotificationT) -> None: Emits a notification, which is a one-way message that does not expect a response. """ jsonrpc_notification = JSONRPCNotification( - jsonrpc="2.0", **notification.model_dump(by_alias=True, mode="json") + jsonrpc="2.0", **notification.model_dump(by_alias=True, mode="json", exclude_none=True) ) await self._write_stream.send(JSONRPCMessage(jsonrpc_notification)) @@ -165,7 +165,7 @@ async def _send_response( jsonrpc_response = JSONRPCResponse( jsonrpc="2.0", id=request_id, - result=response.model_dump(by_alias=True, mode="json"), + result=response.model_dump(by_alias=True, mode="json", exclude_none=True), ) await self._write_stream.send(JSONRPCMessage(jsonrpc_response)) @@ -180,7 +180,7 @@ async def _receive_loop(self) -> None: await self._incoming_message_stream_writer.send(message) elif isinstance(message.root, JSONRPCRequest): validated_request = self._receive_request_type.model_validate( - message.root.model_dump(by_alias=True, mode="json") + message.root.model_dump(by_alias=True, mode="json", exclude_none=True) ) responder = RequestResponder( request_id=message.root.id, @@ -196,7 +196,7 @@ async def _receive_loop(self) -> None: await self._incoming_message_stream_writer.send(responder) elif isinstance(message.root, JSONRPCNotification): notification = self._receive_notification_type.model_validate( - message.root.model_dump(by_alias=True, mode="json") + message.root.model_dump(by_alias=True, mode="json", exclude_none=True) ) await self._received_notification(notification) diff --git a/tests/client/test_session.py b/tests/client/test_session.py index adfc6df6a..17634fed0 100644 --- a/tests/client/test_session.py +++ b/tests/client/test_session.py @@ -35,7 +35,7 @@ async def mock_server(): jsonrpc_request = await client_to_server_receive.receive() assert isinstance(jsonrpc_request.root, JSONRPCRequest) request = ClientRequest.model_validate( - jsonrpc_request.model_dump(by_alias=True, mode="json") + jsonrpc_request.model_dump(by_alias=True, mode="json", exclude_none=True) ) assert isinstance(request.root, InitializeRequest) @@ -59,14 +59,14 @@ async def mock_server(): JSONRPCResponse( jsonrpc="2.0", id=jsonrpc_request.root.id, - result=result.model_dump(by_alias=True, mode="json"), + result=result.model_dump(by_alias=True, mode="json", exclude_none=True), ) ) ) jsonrpc_notification = await client_to_server_receive.receive() assert isinstance(jsonrpc_notification.root, JSONRPCNotification) initialized_notification = ClientNotification.model_validate( - jsonrpc_notification.model_dump(by_alias=True, mode="json") + jsonrpc_notification.model_dump(by_alias=True, mode="json", exclude_none=True) ) async def listen_session(): diff --git a/tests/server/test_stdio.py b/tests/server/test_stdio.py index 782b750c5..c07b9b35f 100644 --- a/tests/server/test_stdio.py +++ b/tests/server/test_stdio.py @@ -18,7 +18,7 @@ async def test_stdio_server(): ] for message in messages: - stdin.write(message.model_dump_json() + "\n") + stdin.write(message.model_dump_json(by_alias=True, exclude_none=True) + "\n") stdin.seek(0) async with stdio_server( diff --git a/tests/test_types.py b/tests/test_types.py index 75cac1130..decd1c81d 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -15,7 +15,7 @@ def test_jsonrpc_request(): request = JSONRPCMessage.model_validate(json_data) assert isinstance(request.root, JSONRPCRequest) - ClientRequest.model_validate(request.model_dump(by_alias=True)) + ClientRequest.model_validate(request.model_dump(by_alias=True, exclude_none=True)) assert request.root.jsonrpc == "2.0" assert request.root.id == 1