Skip to content

Commit 17f5444

Browse files
committed
Remove submounting for streamable http app
1 parent 3abefee commit 17f5444

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/mcp/server/fastmcp/server.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from mcp.server.session import ServerSession, ServerSessionT
4545
from mcp.server.sse import SseServerTransport
4646
from mcp.server.stdio import stdio_server
47-
from mcp.server.streamable_http import EventStore
47+
from mcp.server.streamable_http import EventStore, StreamableHTTPASGIApp
4848
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
4949
from mcp.server.transport_security import TransportSecuritySettings
5050
from mcp.shared.context import LifespanContextT, RequestContext, RequestT
@@ -828,7 +828,6 @@ async def sse_endpoint(request: Request) -> Response:
828828
def streamable_http_app(self) -> Starlette:
829829
"""Return an instance of the StreamableHTTP server app."""
830830
from starlette.middleware import Middleware
831-
from starlette.routing import Mount
832831

833832
# Create session manager on first call (lazy initialization)
834833
if self._session_manager is None:
@@ -841,8 +840,7 @@ def streamable_http_app(self) -> Starlette:
841840
)
842841

843842
# Create the ASGI handler
844-
async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) -> None:
845-
await self.session_manager.handle_request(scope, receive, send)
843+
streamable_http_app = StreamableHTTPASGIApp(self._session_manager)
846844

847845
# Create routes
848846
routes: list[Route | Mount] = []
@@ -889,17 +887,17 @@ async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) ->
889887
)
890888

891889
routes.append(
892-
Mount(
890+
Route(
893891
self.settings.streamable_http_path,
894-
app=RequireAuthMiddleware(handle_streamable_http, required_scopes, resource_metadata_url),
892+
endpoint=RequireAuthMiddleware(streamable_http_app, required_scopes, resource_metadata_url),
895893
)
896894
)
897895
else:
898896
# Auth is disabled, no wrapper needed
899897
routes.append(
900-
Mount(
898+
Route(
901899
self.settings.streamable_http_path,
902-
app=handle_streamable_http,
900+
endpoint=streamable_http_app,
903901
)
904902
)
905903

src/mcp/server/streamable_http.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
TransportSecurityMiddleware,
2929
TransportSecuritySettings,
3030
)
31+
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
3132
from mcp.shared.message import ServerMessageMetadata, SessionMessage
3233
from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS
3334
from mcp.types import (
@@ -896,3 +897,15 @@ async def message_router():
896897
except Exception as e:
897898
# During cleanup, we catch all exceptions since streams might be in various states
898899
logger.debug(f"Error closing streams: {e}")
900+
901+
902+
class StreamableHTTPASGIApp:
903+
"""
904+
ASGI application for StreamableHTTP server transport.
905+
"""
906+
907+
def __init__(self, session_manager: StreamableHTTPSessionManager):
908+
self.session_manager = session_manager
909+
910+
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
911+
await self.session_manager.handle_request(scope, receive, send)

0 commit comments

Comments
 (0)