diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 19af93fd1..8a891dcaf 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 2613b530c..feb40ed2b 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 @@ -441,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 @@ -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,