From 13d33996df085f624961467200a56593ad65f40b Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Wed, 7 May 2025 09:14:56 -0400 Subject: [PATCH 1/2] always apply request context middleware --- src/fastmcp/server/server.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 2c09da879..29556f29a 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -728,7 +728,7 @@ class FastMCP(Generic[LifespanResultT]): # timeout to make it possible to close immediately. see # https://github.com/jlowin/fastmcp/issues/296 uvicorn_config.setdefault("timeout_graceful_shutdown", 0) - app = RequestContextMiddleware(self.sse_app()) + app = self.sse_app() config = uvicorn.Config( app, @@ -837,6 +837,8 @@ class FastMCP(Generic[LifespanResultT]): # mount these routes last, so they have the lowest route matching precedence routes.extend(self._custom_starlette_routes) + middleware.append(Middleware(RequestContextMiddleware)) + # Create Starlette app with routes and middleware return Starlette( debug=self.settings.debug, routes=routes, middleware=middleware From 95930956f4124162d91cf73cdda6fa154cc1b3c3 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Wed, 7 May 2025 10:01:06 -0400 Subject: [PATCH 2/2] Ensure a response is returned from sse endpoint --- src/fastmcp/server/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 2c09da879..04cbbe4f4 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -817,9 +817,9 @@ class FastMCP(Generic[LifespanResultT]): else: # Auth is disabled, no need for RequireAuthMiddleware # Since handle_sse is an ASGI app, we need to create a compatible endpoint - async def sse_endpoint(request: Request) -> None: + async def sse_endpoint(request: Request) -> Response: # Convert the Starlette request to ASGI parameters - await handle_sse(request.scope, request.receive, request._send) # type: ignore[reportPrivateUsage] + return await handle_sse(request.scope, request.receive, request._send) # type: ignore[reportPrivateUsage] routes.append( Route(