diff --git a/src/mcp/server/mcpserver/server.py b/src/mcp/server/mcpserver/server.py index be77705da..32c53489f 100644 --- a/src/mcp/server/mcpserver/server.py +++ b/src/mcp/server/mcpserver/server.py @@ -203,9 +203,6 @@ def __init__( self._token_verifier = ProviderTokenVerifier(auth_server_provider) self._custom_starlette_routes: list[Route] = [] - # Configure logging - configure_logging(self.settings.log_level) - @property def name(self) -> str: return self._lowlevel_server.name @@ -291,6 +288,8 @@ def run( if transport not in TRANSPORTS.__args__: # type: ignore # pragma: no cover raise ValueError(f"Unknown transport: {transport}") + configure_logging(self.settings.log_level) + match transport: case "stdio": anyio.run(self.run_stdio_async) diff --git a/tests/server/mcpserver/test_server.py b/tests/server/mcpserver/test_server.py index 3457ec944..40f16292b 100644 --- a/tests/server/mcpserver/test_server.py +++ b/tests/server/mcpserver/test_server.py @@ -1516,3 +1516,22 @@ async def test_report_progress_passes_related_request_id(): message="halfway", related_request_id="req-abc-123", ) + + +def test_mcpserver_init_does_not_configure_logging() -> None: + """MCPServer.__init__ must not call logging.basicConfig or add handlers. + + Regression test for https://github.com/modelcontextprotocol/python-sdk/issues/1656. + Library code should never configure the root logger — that is the + application's responsibility. + """ + import logging + + root = logging.getLogger() + handlers_before = list(root.handlers) + level_before = root.level + + MCPServer("test-logging") + + assert root.handlers == handlers_before + assert root.level == level_before