|
4 | 4 | from collections.abc import Awaitable, Callable, Iterable |
5 | 5 | from contextlib import nullcontext |
6 | 6 | from copy import deepcopy |
7 | | -from typing import Any, Generic, TypeVar, overload |
| 7 | +from pathlib import Path |
| 8 | +from typing import Any, overload |
8 | 9 |
|
9 | | -from fastmcp import Client, FastMCP |
| 10 | +from fastmcp import Client |
10 | 11 | from fastmcp.client.client import CallToolResult |
11 | | -from fastmcp.client.transports.base import ClientTransport |
12 | | -from fastmcp.mcp_config import MCPConfig |
13 | 12 | from mcp.types import TextContent |
14 | | -from pydantic import AnyUrl |
15 | 13 | from typing_extensions import Self |
16 | | -from zipp import Path |
17 | 14 |
|
18 | 15 | from amrita_core.logging import logger |
19 | 16 |
|
|
27 | 24 | cast_mcp_properties_to_amrita, |
28 | 25 | ) |
29 | 26 |
|
30 | | -MCP_SERVER_SCRIPT_TYPE = TypeVar( |
31 | | - "MCP_SERVER_SCRIPT_TYPE", |
32 | | - str, |
33 | | - ClientTransport, |
34 | | - AnyUrl, |
35 | | - FastMCP, |
36 | | - MCPConfig, |
37 | | - dict[str, Any], |
38 | | - covariant=True, |
| 27 | +MCP_SERVER_SCRIPT_TYPE = ( |
| 28 | + str | Path # TODO: Support all types of scripts |
39 | 29 | ) |
40 | 30 |
|
41 | 31 |
|
42 | 32 | class NOT_GIVEN: |
43 | 33 | pass |
44 | 34 |
|
45 | 35 |
|
46 | | -class MCPClient(Generic[MCP_SERVER_SCRIPT_TYPE]): |
| 36 | +class MCPClient: |
47 | 37 | """Reusable MCP Client""" |
48 | 38 |
|
49 | 39 | mcp_client: Client | None = None |
@@ -174,9 +164,7 @@ def __init__(self, tools_manager: MultiToolsManager | None = None) -> None: |
174 | 164 | self.script_to_clients = {} |
175 | 165 | self._lock = Lock() |
176 | 166 |
|
177 | | - def get_client_by_script( |
178 | | - self, server_script: MCP_SERVER_SCRIPT_TYPE |
179 | | - ) -> MCPClient[MCP_SERVER_SCRIPT_TYPE]: |
| 167 | + def get_client_by_script(self, server_script: MCP_SERVER_SCRIPT_TYPE) -> MCPClient: |
180 | 168 | """Get MCP Client (without operating stored MCP Server) |
181 | 169 | Args: |
182 | 170 | server_script (str, optional): MCP Server script path (or URI). |
@@ -219,7 +207,7 @@ def register_only( |
219 | 207 | self, |
220 | 208 | *, |
221 | 209 | server_script: MCP_SERVER_SCRIPT_TYPE | None = None, |
222 | | - client: MCPClient[MCP_SERVER_SCRIPT_TYPE] | None = None, |
| 210 | + client: MCPClient | None = None, |
223 | 211 | ) -> Self: |
224 | 212 | """Register MCP Server only, without initialization""" |
225 | 213 | if client is not None: |
@@ -253,9 +241,7 @@ async def initialize_this( |
253 | 241 | self, server_script: MCP_SERVER_SCRIPT_TYPE, fail_then_raise: bool = False |
254 | 242 | ) -> Self: |
255 | 243 | """Register and initialize single MCP Server""" |
256 | | - client: MCPClient[MCP_SERVER_SCRIPT_TYPE] = self.get_client_by_script( |
257 | | - server_script |
258 | | - ) |
| 244 | + client: MCPClient = self.get_client_by_script(server_script) |
259 | 245 | async with self._lock: |
260 | 246 | try: |
261 | 247 | await self._load_this(client) |
|
0 commit comments