From fe2c2835f6807c6e08ead0a7e9e9032aec9e0eab Mon Sep 17 00:00:00 2001 From: Muspi Merol Date: Thu, 11 Dec 2025 13:31:06 +0800 Subject: [PATCH 1/2] fix: lazy import `sse_starlette` to reduce import time --- src/mcp/server/sse.py | 3 ++- src/mcp/server/streamable_http.py | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 19af93fd16..8a891dcafa 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/server/sse.py @@ -46,7 +46,6 @@ async def handle_sse(request): import anyio from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream from pydantic import ValidationError -from sse_starlette import EventSourceResponse from starlette.requests import Request from starlette.responses import Response from starlette.types import Receive, Scope, Send @@ -185,6 +184,8 @@ async def response_wrapper(scope: Scope, receive: Receive, send: Send): In this case we close our side of the streams to signal the client that the connection has been closed. """ + from sse_starlette import EventSourceResponse + await EventSourceResponse(content=sse_stream_reader, data_sender_callable=sse_writer)( scope, receive, send ) diff --git a/src/mcp/server/streamable_http.py b/src/mcp/server/streamable_http.py index 2613b530c4..8b02360068 100644 --- a/src/mcp/server/streamable_http.py +++ b/src/mcp/server/streamable_http.py @@ -20,7 +20,6 @@ import anyio from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream from pydantic import ValidationError -from sse_starlette import EventSourceResponse from starlette.requests import Request from starlette.responses import Response from starlette.types import Receive, Scope, Send @@ -613,6 +612,8 @@ async def sse_writer(): self._sse_stream_writers.pop(request_id, None) await self._clean_up_memory_streams(request_id) + from sse_starlette import EventSourceResponse + # Create and start EventSourceResponse # SSE stream mode (original behavior) # Set up headers @@ -730,6 +731,8 @@ async def standalone_sse_writer(): logger.debug("Closing standalone SSE writer") await self._clean_up_memory_streams(GET_STREAM_KEY) + from sse_starlette import EventSourceResponse + # Create and start EventSourceResponse response = EventSourceResponse( content=sse_stream_reader, @@ -934,6 +937,8 @@ async def send_event(event_message: EventMessage) -> None: except Exception: logger.exception("Error in replay sender") + from sse_starlette import EventSourceResponse + # Create and start EventSourceResponse response = EventSourceResponse( content=sse_stream_reader, From 7bd87d763863a081d8c5c18001274767d142f272 Mon Sep 17 00:00:00 2001 From: Muspi Merol Date: Thu, 11 Dec 2025 13:46:20 +0800 Subject: [PATCH 2/2] suppress PLR0915 Too many statements (103 > 102) --- src/mcp/server/streamable_http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mcp/server/streamable_http.py b/src/mcp/server/streamable_http.py index 8b02360068..feb40ed2b0 100644 --- a/src/mcp/server/streamable_http.py +++ b/src/mcp/server/streamable_http.py @@ -440,7 +440,7 @@ async def _validate_accept_header(self, request: Request, scope: Scope, send: Se return False return True - async def _handle_post_request(self, scope: Scope, request: Request, receive: Receive, send: Send) -> None: + async def _handle_post_request(self, scope: Scope, request: Request, receive: Receive, send: Send) -> None: # noqa: PLR0915 """Handle POST requests containing JSON-RPC messages.""" writer = self._read_stream_writer if writer is None: # pragma: no cover