
    6?i                         d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlm Z  dZ! G d d      Z"g dZ#y)zClient for connecting to multiple MCP servers and loading LangChain-compatible resources.

This module provides the MultiServerMCPClient class for managing connections to multiple
MCP servers and loading tools, prompts, and resources from them.
    N)AsyncIterator)asynccontextmanager)TracebackType)Any)Blob)	AIMessageHumanMessage)BaseTool)ClientSession)load_mcp_prompt)load_mcp_resources)
ConnectionMcpHttpClientFactorySSEConnectionStdioConnectionStreamableHttpConnectionWebsocketConnectioncreate_session)load_mcp_toolsa  As of langchain-mcp-adapters 0.1.0, MultiServerMCPClient cannot be used as a context manager (e.g., async with MultiServerMCPClient(...)). Instead, you can do one of the following:
1. client = MultiServerMCPClient(...)
   tools = await client.get_tools()
2. client = MultiServerMCPClient(...)
   async with client.session(server_name) as session:
       tools = await load_mcp_tools(session)c                   "   e Zd ZdZddeeef   dz  ddfdZeddded	e	de
e   fd
       Zdddedz  dee   fdZdddededeeef   dz  deeez     fdZdddedeee   z  dz  dee   fdZddZdee   dz  dedz  dedz  ddfdZy)MultiServerMCPClientzvClient for connecting to multiple MCP servers and loading LangChain-compatible tools, prompts and resources from them.Nconnectionsreturnc                 &    ||| _         yi | _         y)a  Initialize a MultiServerMCPClient with MCP servers connections.

        Args:
            connections: A dictionary mapping server names to connection configurations.
                If None, no initial connections are established.

        Example: basic usage (starting a new session on each tool call)

        ```python
        from langchain_mcp_adapters.client import MultiServerMCPClient

        client = MultiServerMCPClient(
            {
                "math": {
                    "command": "python",
                    # Make sure to update to the full absolute path to your math_server.py file
                    "args": ["/path/to/math_server.py"],
                    "transport": "stdio",
                },
                "weather": {
                    # Make sure you start your weather server on port 8000
                    "url": "http://localhost:8000/mcp",
                    "transport": "streamable_http",
                }
            }
        )
        all_tools = await client.get_tools()
        ```

        Example: explicitly starting a session

        ```python
        from langchain_mcp_adapters.client import MultiServerMCPClient
        from langchain_mcp_adapters.tools import load_mcp_tools

        client = MultiServerMCPClient({...})
        async with client.session("math") as session:
            tools = await load_mcp_tools(session)
        ```

        N)r   )selfr   s     _/opt/tws/coop-23/cliente-mcp/venv/lib/python3.12/site-packages/langchain_mcp_adapters/client.py__init__zMultiServerMCPClient.__init__-   s    T BMAX+^`    T)auto_initializeserver_namer   c               h  K   || j                   vr5d| dt        | j                   j                                d}t        |      t	        | j                   |         4 d{   }|r|j                          d{    | ddd      d{    y7 47 7 	# 1 d{  7  sw Y   yxY ww)ao  Connect to an MCP server and initialize a session.

        Args:
            server_name: Name to identify this server connection
            auto_initialize: Whether to automatically initialize the session

        Raises:
            ValueError: If the server name is not found in the connections

        Yields:
            An initialized ClientSession

        "Couldn't find a server with name '', expected one of ''N)r   listkeys
ValueErrorr   
initialize)r   r    r   msgsessions        r   r*   zMultiServerMCPClient.sessionY   s     ( d...6{mCWX\]a]m]m]r]r]tXuWvvwxCS/!!$"2"2;"?@ 	 	G((***M	 	 	*	 	 	 	sZ   A B2"B#B2&B<B=	BB2BB2BB2B/#B&$B/+B2)r    c                  K   |e|| j                   vr5d| dt        | j                   j                                d}t        |      t	        d| j                   |          d{   S g }g }| j                   j                         D ]3  }t        j                  t	        d|            }|j                  |       5 t        j                  |  d{   }|D ]  }|j                  |        |S 7 7  w)a\  Get a list of all tools from all connected servers.

        Args:
            server_name: Optional name of the server to get tools from.
                If None, all tools from all servers will be returned (default).

        NOTE: a new session will be created for each tool call

        Returns:
            A list of LangChain tools

        Nr"   r#   r$   )
connection)r   r%   r&   r'   r   valuesasynciocreate_taskappendgatherextend)	r   r    r)   	all_toolsload_mcp_tool_tasksr,   load_mcp_tool_task
tools_listtoolss	            r   	get_toolszMultiServerMCPClient.get_toolsv   s     "$"2"22:;-G[\`aeaqaqavavax\y[zz{| o%'9I9I+9VWWW$&	 **113 	;J!(!4!4^DU_5`!a&&'9:	; #>>+>??
 	$EU#	$ X @s%   A#C6%C2&A-C6C4C64C6	argumentsprompt_namer:   c                   K   | j                  |      4 d{   }t        |||       d{   cddd      d{    S 7 +7 7 	# 1 d{  7  sw Y   yxY ww)z%Get a prompt from a given MCP server.Nr9   )r*   r   )r   r    r;   r:   r*   s        r   
get_promptzMultiServerMCPClient.get_prompt   sa      <<, 	T 	T(+SS	T 	T 	TS	T 	T 	T 	TsQ   AAAA
AA
AAAA
A
AAAAurisr?   c                   K   | j                  |      4 d{   }t        ||       d{   cddd      d{    S 7 *7 7 	# 1 d{  7  sw Y   yxY ww)a)  Get resources from a given MCP server.

        Args:
            server_name: Name of the server to get resources from
            uris: Optional resource URI or list of URIs to load. If not provided, all resources will be loaded.

        Returns:
            A list of LangChain Blobs

        Nr>   )r*   r   )r   r    r?   r*   s       r   get_resourcesz"MultiServerMCPClient.get_resources   s_       <<, 	@ 	@+G$??	@ 	@ 	@?	@ 	@ 	@ 	@sQ   AAAA	AA	AAAA	A	AAAAc                 (   K   t        t              w)zAsync context manager entry point.

        Raises:
            NotImplementedError: Context manager support has been removed.
        NotImplementedErrorASYNC_CONTEXT_MANAGER_ERROR)r   s    r   
__aenter__zMultiServerMCPClient.__aenter__   s      ""=>>s   exc_typeexc_valexc_tbc                      t        t              )aU  Async context manager exit point.

        Args:
            exc_type: Exception type if an exception occurred.
            exc_val: Exception value if an exception occurred.
            exc_tb: Exception traceback if an exception occurred.

        Raises:
            NotImplementedError: Context manager support has been removed.
        rC   )r   rG   rH   rI   s       r   	__aexit__zMultiServerMCPClient.__aexit__   s      ""=>>r   )N)r   r   )__name__
__module____qualname____doc__dictstrr   r   r   boolr   r   r*   r%   r
   r8   r   r	   r   r=   r   rA   rF   typeBaseExceptionr   rK    r   r   r   r   *   sT    A*aDj$9D$@ *aD *aX 
 !%	 	
 
}	% 8 <@ cDj DN D ,0	T	T 	T
 S>D(	T 
lY&	'	T (,	@@ DIo$	@
 
d@&??}%,? %? $	?
 
?r   r   )r   r   r   r   r   r   )$rO   r.   collections.abcr   
contextlibr   typesr   typingr   langchain_core.documents.baser   langchain_core.messagesr   r	   langchain_core.toolsr
   mcpr   langchain_mcp_adapters.promptsr    langchain_mcp_adapters.resourcesr   langchain_mcp_adapters.sessionsr   r   r   r   r   r   r   langchain_mcp_adapters.toolsr   rE   r   __all__rU   r   r   <module>rc      s_     ) *   . ; )  : ?   83 _? _?Dr   