diff --git a/src/fastmcp/mcp_config.py b/src/fastmcp/mcp_config.py index 4d8d8283b..84a114c36 100644 --- a/src/fastmcp/mcp_config.py +++ b/src/fastmcp/mcp_config.py @@ -143,6 +143,9 @@ class StdioMCPServer(BaseModel): # Execution context cwd: str | None = None # Working directory for command execution timeout: int | None = None # Maximum response time in milliseconds + keep_alive: bool | None = ( + None # Whether to keep the subprocess alive between connections + ) # Metadata description: str | None = None # Human-readable server description @@ -161,6 +164,7 @@ class StdioMCPServer(BaseModel): args=self.args, env=self.env, cwd=self.cwd, + keep_alive=self.keep_alive, ) diff --git a/tests/test_mcp_config.py b/tests/test_mcp_config.py index 994e78062..f927b623a 100644 --- a/tests/test_mcp_config.py +++ b/tests/test_mcp_config.py @@ -70,6 +70,37 @@ def test_parse_single_stdio_config(): assert transport.args == ["hello"] +def test_stdio_config_keep_alive_passthrough(): + """Test that keep_alive parameter is passed through from StdioMCPServer to StdioTransport.""" + # Test with keep_alive=False + server = StdioMCPServer(command="test", keep_alive=False) + assert server.keep_alive is False + transport = server.to_transport() + assert isinstance(transport, StdioTransport) + assert transport.keep_alive is False + + # Test with keep_alive=True + server = StdioMCPServer(command="test", keep_alive=True) + assert server.keep_alive is True + transport = server.to_transport() + assert isinstance(transport, StdioTransport) + assert transport.keep_alive is True + + # Test with keep_alive=None (should default to True in StdioTransport) + server = StdioMCPServer(command="test", keep_alive=None) + assert server.keep_alive is None + transport = server.to_transport() + assert isinstance(transport, StdioTransport) + assert transport.keep_alive is True # StdioTransport defaults to True + + # Test with keep_alive not specified (should default to None, then True in StdioTransport) + server = StdioMCPServer(command="test") + assert server.keep_alive is None + transport = server.to_transport() + assert isinstance(transport, StdioTransport) + assert transport.keep_alive is True # StdioTransport defaults to True + + def test_parse_extra_keys(): config = { "mcpServers": {