|
21 | 21 | from starlette.requests import Request |
22 | 22 | from starlette.responses import Response |
23 | 23 | from starlette.routing import Mount, Route |
| 24 | +from starlette.types import Receive, Scope, Send |
24 | 25 |
|
25 | 26 | from mcp.client.session import ClientSession, ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT |
26 | 27 | from mcp.client.sse import sse_client |
|
32 | 33 | from mcp.server.auth.routes import build_resource_metadata_url, create_auth_routes, create_protected_resource_routes |
33 | 34 | from mcp.server.auth.settings import AuthSettings |
34 | 35 | from mcp.server.fastmcp import FastMCP |
35 | | -from mcp.server.fastmcp.server import StreamableHTTPASGIApp |
36 | 36 | from mcp.server.sse import SseServerTransport |
37 | 37 | from mcp.server.streamable_http import EventStore |
38 | 38 | from mcp.server.streamable_http_manager import StreamableHTTPSessionManager |
|
59 | 59 | NO_DNS_REBINDING_PROTECTION = TransportSecuritySettings(enable_dns_rebinding_protection=False) |
60 | 60 |
|
61 | 61 |
|
| 62 | +class StreamableHTTPASGIApp: |
| 63 | + """Thin ASGI wrapper around `StreamableHTTPSessionManager.handle_request`. |
| 64 | +
|
| 65 | + Starlette's `Route(path, endpoint=...)` treats a *class instance* as a raw ASGI callable |
| 66 | + (matching all HTTP verbs), whereas a coroutine function is wrapped via `request_response` |
| 67 | + and defaults to GET/HEAD only. v1's `FastMCP.streamable_http_app()` relies on this same |
| 68 | + distinction; we inline the wrapper here rather than deep-importing the (non-`__all__`) |
| 69 | + `mcp.server.fastmcp.server.StreamableHTTPASGIApp`. |
| 70 | + """ |
| 71 | + |
| 72 | + def __init__(self, session_manager: StreamableHTTPSessionManager) -> None: |
| 73 | + self.session_manager = session_manager |
| 74 | + |
| 75 | + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: |
| 76 | + await self.session_manager.handle_request(scope, receive, send) |
| 77 | + |
| 78 | + |
62 | 79 | def _lowlevel(server: Server[Any] | FastMCP) -> Server[Any]: |
63 | 80 | """Return the lowlevel `Server` for either flavour. |
64 | 81 |
|
|
0 commit comments