From 92edacb86adc344e56f737fee679b0994ab217e6 Mon Sep 17 00:00:00 2001 From: Sandipan Haldar Date: Fri, 25 Apr 2025 12:14:58 +0000 Subject: [PATCH] added dictionary type to load server config --- src/fastmcp/client/base.py | 1 - src/fastmcp/client/client.py | 2 +- src/fastmcp/client/transports.py | 26 +++++++++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) delete mode 100644 src/fastmcp/client/base.py diff --git a/src/fastmcp/client/base.py b/src/fastmcp/client/base.py deleted file mode 100644 index 8b1378917..000000000 --- a/src/fastmcp/client/base.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/fastmcp/client/client.py b/src/fastmcp/client/client.py index 7fdd21899..8509511d2 100644 --- a/src/fastmcp/client/client.py +++ b/src/fastmcp/client/client.py @@ -35,7 +35,7 @@ class Client: def __init__( self, - transport: ClientTransport | FastMCP | AnyUrl | Path | str, + transport: ClientTransport | FastMCP | AnyUrl | Path | dict[str, Any] | str, # Common args roots: RootsList | RootsHandler | None = None, sampling_handler: SamplingHandler | None = None, diff --git a/src/fastmcp/client/transports.py b/src/fastmcp/client/transports.py index 210286bf2..8437c8436 100644 --- a/src/fastmcp/client/transports.py +++ b/src/fastmcp/client/transports.py @@ -416,7 +416,7 @@ class FastMCPTransport(ClientTransport): def infer_transport( - transport: ClientTransport | FastMCPServer | AnyUrl | Path | str, + transport: ClientTransport | FastMCPServer | AnyUrl | Path | dict[str, Any] | str, ) -> ClientTransport: """ Infer the appropriate transport type from the given transport argument. @@ -449,7 +449,31 @@ def infer_transport( # the transport is a websocket URL elif isinstance(transport, AnyUrl | str) and str(transport).startswith("ws"): return WSTransport(url=transport) + elif isinstance(transport, dict): + # Stdio transport + if "command" in transport and "args" in transport: + return StdioTransport( + command=transport["command"], + args=transport["args"], + env=transport.get("env", None), + cwd=transport.get("cwd", None), + ) + # HTTP transport + elif "url" in transport: + return SSETransport( + url=transport["url"], + headers=transport.get("headers", None), + ) + + # WebSocket transport + elif "ws_url" in transport: + return WSTransport( + url=transport["ws_url"], + ) + + raise ValueError("Cannot determine transport type from dictionary") + # the transport is an unknown type else: raise ValueError(f"Could not infer a valid transport from: {transport}")