|
20 | 20 | from pydantic_settings import BaseSettings, SettingsConfigDict |
21 | 21 | from starlette.applications import Starlette |
22 | 22 | from starlette.requests import Request |
| 23 | +from starlette.responses import Response |
23 | 24 | from starlette.routing import Mount, Route |
24 | 25 |
|
25 | 26 | from mcp.server.fastmcp.exceptions import ResourceError |
@@ -482,17 +483,20 @@ def sse_app(self) -> Starlette: |
482 | 483 | """Return an instance of the SSE server app.""" |
483 | 484 | sse = SseServerTransport(self.settings.message_path) |
484 | 485 |
|
485 | | - async def handle_sse(request: Request) -> None: |
486 | | - async with sse.connect_sse( |
487 | | - request.scope, |
488 | | - request.receive, |
489 | | - request._send, # type: ignore[reportPrivateUsage] |
490 | | - ) as streams: |
491 | | - await self._mcp_server.run( |
492 | | - streams[0], |
493 | | - streams[1], |
494 | | - self._mcp_server.create_initialization_options(), |
495 | | - ) |
| 486 | + async def handle_sse(request: Request) -> Response: |
| 487 | + with anyio.CancelScope() as cancel_scope: |
| 488 | + async with sse.connect_sse( |
| 489 | + request.scope, |
| 490 | + request.receive, |
| 491 | + request._send, # type: ignore[reportPrivateUsage] |
| 492 | + callback=lambda: cancel_scope.cancel(), |
| 493 | + ) as streams: |
| 494 | + await self._mcp_server.run( |
| 495 | + streams[0], |
| 496 | + streams[1], |
| 497 | + self._mcp_server.create_initialization_options(), |
| 498 | + ) |
| 499 | + return Response(status_code=200) |
496 | 500 |
|
497 | 501 | return Starlette( |
498 | 502 | debug=self.settings.debug, |
|
0 commit comments