From 188974d55e8ca3e03502c948badf1667622ebd83 Mon Sep 17 00:00:00 2001 From: jfouret Date: Tue, 27 May 2025 10:45:52 +0200 Subject: [PATCH 1/3] add init_timeout for mcp client --- src/fastmcp/client/client.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/fastmcp/client/client.py b/src/fastmcp/client/client.py index c5293fb4b..4a36c6032 100644 --- a/src/fastmcp/client/client.py +++ b/src/fastmcp/client/client.py @@ -62,6 +62,8 @@ class Client: message_handler: Optional handler for protocol messages progress_handler: Optional handler for progress notifications timeout: Optional timeout for requests (seconds or timedelta) + init_timeout: Optional timeout for initial connection (seconds or + timedelta) Examples: ```python @@ -93,6 +95,7 @@ class Client: message_handler: MessageHandler | None = None, progress_handler: ProgressHandler | None = None, timeout: datetime.timedelta | float | int | None = None, + init_timeout: datetime.timedelta | float | int | None = 1, ): self.transport = infer_transport(transport) self._session: ClientSession | None = None @@ -110,6 +113,17 @@ class Client: if isinstance(timeout, int | float): timeout = datetime.timedelta(seconds=timeout) + + if isinstance(init_timeout, int): + self._init_timeout = float(init_timeout) + elif isinstance(init_timeout, datetime.timedelta): + self._init_timeout = float(init_timeout.total_seconds()) + elif isinstance(init_timeout, float): + self._init_timeout = init_timeout + else: + raise ValueError( + "init_timeout must be int, float or datetime.timedelta" + ) self._session_kwargs: SessionKwargs = { "sampling_callback": None, @@ -168,7 +182,7 @@ class Client: self._session = session # Initialize the session try: - with anyio.fail_after(1): + with anyio.fail_after(self._init_timeout): self._initialize_result = await self._session.initialize() yield except TimeoutError: From 68636536dfc2d7cbb313c73d43cdfb688b16a05b Mon Sep 17 00:00:00 2001 From: jfouret Date: Tue, 27 May 2025 10:56:01 +0200 Subject: [PATCH 2/3] ruff format src/fastmcp/client/client.py --- src/fastmcp/client/client.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/fastmcp/client/client.py b/src/fastmcp/client/client.py index 4a36c6032..51ca9c5a7 100644 --- a/src/fastmcp/client/client.py +++ b/src/fastmcp/client/client.py @@ -62,7 +62,7 @@ class Client: message_handler: Optional handler for protocol messages progress_handler: Optional handler for progress notifications timeout: Optional timeout for requests (seconds or timedelta) - init_timeout: Optional timeout for initial connection (seconds or + init_timeout: Optional timeout for initial connection (seconds or timedelta) Examples: @@ -113,7 +113,7 @@ class Client: if isinstance(timeout, int | float): timeout = datetime.timedelta(seconds=timeout) - + if isinstance(init_timeout, int): self._init_timeout = float(init_timeout) elif isinstance(init_timeout, datetime.timedelta): @@ -121,9 +121,7 @@ class Client: elif isinstance(init_timeout, float): self._init_timeout = init_timeout else: - raise ValueError( - "init_timeout must be int, float or datetime.timedelta" - ) + raise ValueError("init_timeout must be int, float or datetime.timedelta") self._session_kwargs: SessionKwargs = { "sampling_callback": None, From fc110e46d43fb3a3403eb35388a349dba72a44f2 Mon Sep 17 00:00:00 2001 From: jfouret Date: Tue, 27 May 2025 11:00:41 +0200 Subject: [PATCH 3/3] types, None type impossible for init_timeout --- src/fastmcp/client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fastmcp/client/client.py b/src/fastmcp/client/client.py index 51ca9c5a7..7e8c106e8 100644 --- a/src/fastmcp/client/client.py +++ b/src/fastmcp/client/client.py @@ -95,7 +95,7 @@ class Client: message_handler: MessageHandler | None = None, progress_handler: ProgressHandler | None = None, timeout: datetime.timedelta | float | int | None = None, - init_timeout: datetime.timedelta | float | int | None = 1, + init_timeout: datetime.timedelta | float | int = 1, ): self.transport = infer_transport(transport) self._session: ClientSession | None = None