From 1f7f007fd92edc8eb694a19bc2e8bf0d5aad0ee2 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Mon, 5 May 2025 11:21:39 -0400 Subject: [PATCH 1/2] Add timeout-graceful-shutdown as a default config --- src/fastmcp/server/server.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 5c221d770..e0b96e90a 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -826,16 +826,19 @@ class FastMCP(Generic[LifespanResultT]): host: str | None = None, port: int | None = None, log_level: str | None = None, + uvicorn_config: dict | None = None, ) -> None: """Run the server using SSE transport.""" - app = self.sse_app() - app = RequestMiddleware(app) + uvicorn_config = uvicorn_config or {} + uvicorn_config.setdefault("timeout_graceful_shutdown", 0) + app = RequestMiddleware(self.sse_app()) config = uvicorn.Config( app, host=host or self.settings.host, port=port or self.settings.port, log_level=log_level or self.settings.log_level.lower(), + **uvicorn_config, ) server = uvicorn.Server(config) await server.serve() From 396207f17771961e4863c3ee631f778217644687 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Mon, 5 May 2025 11:24:06 -0400 Subject: [PATCH 2/2] Update server.py --- src/fastmcp/server/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index e0b96e90a..1de7dd908 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -830,6 +830,8 @@ class FastMCP(Generic[LifespanResultT]): ) -> None: """Run the server using SSE transport.""" uvicorn_config = uvicorn_config or {} + # the SSE app hangs even when a signal is sent, so we disable the timeout to make it possible to close immediately. + # see https://github.com/jlowin/fastmcp/issues/296 uvicorn_config.setdefault("timeout_graceful_shutdown", 0) app = RequestMiddleware(self.sse_app())