@@ -197,11 +197,53 @@ def mount(self, server: Any, *, prefix: str | None = None) -> None:
197197 env = TestEnv ()
198198 with patch ("hud.settings.settings" , spec = Settings ) as mock_settings :
199199 mock_settings .hud_mcp_url = "https://mcp.hud.ai"
200- mock_settings .client_timeout = 300 # Used in connect_mcp for sse_read_timeout
200+ mock_settings .client_timeout = 300 # Used in connect_mcp transport timeout logic
201201
202202 env .connect_hub ("browser" )
203203
204204 # connect_hub creates a connection named "hud" (from mcp_config key)
205205 assert "hud" in env ._connections
206206 # Verify hub config is stored for serialization
207207 assert env ._hub_config == {"name" : "browser" }
208+
209+ def test_connect_mcp_streamable_transport_uses_client_timeout (self ) -> None :
210+ """Streamable HTTP uses FastMCP client timeout instead of deprecated transport arg."""
211+ from fastmcp .client .transports import StreamableHttpTransport
212+
213+ from hud .environment .connectors .mcp_config import MCPConfigConnectorMixin
214+ from hud .settings import Settings
215+
216+ class TestEnv (MCPConfigConnectorMixin ):
217+ def __init__ (self ) -> None :
218+ self ._connections : dict [str , Connector ] = {}
219+
220+ env = TestEnv ()
221+ with patch ("hud.settings.settings" , spec = Settings ) as mock_settings :
222+ mock_settings .client_timeout = 300
223+ env .connect_mcp ({"browser" : {"url" : "https://mcp.hud.ai/browser" }})
224+
225+ transport = env ._connections ["browser" ]._transport
226+ assert isinstance (transport , StreamableHttpTransport )
227+ assert transport .sse_read_timeout is None
228+ assert getattr (transport , "_hud_client_timeout" , None ) == 300
229+
230+ def test_connect_mcp_sse_transport_keeps_sse_timeout (self ) -> None :
231+ """SSE transports should continue to receive sse_read_timeout directly."""
232+ from fastmcp .client .transports import SSETransport
233+
234+ from hud .environment .connectors .mcp_config import MCPConfigConnectorMixin
235+ from hud .settings import Settings
236+
237+ class TestEnv (MCPConfigConnectorMixin ):
238+ def __init__ (self ) -> None :
239+ self ._connections : dict [str , Connector ] = {}
240+
241+ env = TestEnv ()
242+ with patch ("hud.settings.settings" , spec = Settings ) as mock_settings :
243+ mock_settings .client_timeout = 300
244+ env .connect_mcp ({"browser" : {"url" : "https://mcp.hud.ai/browser" , "transport" : "sse" }})
245+
246+ transport = env ._connections ["browser" ]._transport
247+ assert isinstance (transport , SSETransport )
248+ assert transport .sse_read_timeout is not None
249+ assert transport .sse_read_timeout .total_seconds () == 300
0 commit comments