Ë
    uPêj½¦  ã                   óÈ  — U d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZ ddlZddlmZmZmZmZmZ ddlmZ dd	lmZ dZedz  ed
<   	 ddlmc mZ   e!e d
d«      ZdZ#eed<   de"fd„Z$ddl%m&Z' ddl%m(Z) ddl%m*Z*m+Z+m,Z,m-Z-m.Z. ddl%m/Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD deEdeEfd„ZFdeEdeEdeEfd„ZGdeEdeEfd„ZHdeIeEeEf   deIeEeEf   fd„ZJd eKdeKdz  fd!„ZL eMejœ                  jž                  «      ZPeed"<   	 d eKdeQdz  fd#„ZR ed$«      ZS G d%„ d&ej¨                  «      ZU G d'„ d(«      ZVy# e"$ r Y Œôw xY w))zF
LiteLLM Proxy uses this MCP Client to connnect to other MCP servers.
é    N)Ú	AwaitableÚCallableÚ	Generator)Ú	timedelta)Úmetadata)ÚAnyÚFinalÚTypeVar)ÚClientSessionÚMcpErrorÚReadResourceResultÚResourceÚStdioServerParameters)Ú
sse_client)Ústdio_clientÚstreamable_http_clientzmcp>=1.28.1ÚMCP_STREAMABLE_HTTP_REQUIREMENTÚreturnc                  óT   — t        dt        › dt        j                  d«      › d�«      S )Nz'MCP streamable HTTP transport requires z, but the installed mcp Úmcpz| does not provide streamable_http_client. Fix with: pip install 'litellm[mcp]' (or upgrade mcp directly: pip install -U mcp))ÚImportErrorr   r   Úversion© ó    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/experimental_mcp_client/client.pyÚ$missing_streamable_http_client_errorr      s;   € ÜØ
1Ô2QÐ1Rð SÜ×Ñ Ó&Ð'ð (]ð	]óð r   )ÚCallToolRequestParams)ÚCallToolResult)ÚGetPromptRequestParamsÚGetPromptResultÚPromptÚResourceTemplateÚTextContent)ÚTool)ÚAnyUrl)Úverbose_logger)ÚMCP_CLIENT_TIMEOUTÚMCP_NPM_CACHE_DIR)Úget_ssl_configuration)ÚVerifyTypes)ÚMCPAuthÚMCPAuthTypeÚMCPStdioConfigÚMCPTransportÚMCPTransportTypeÚcredential_redirect_hookÚ
has_headerÚwithout_headerÚ
auth_valuec                 óf   — t        j                  | j                  d«      «      j                  «       S )z(Convert auth value to Basic Auth format.zutf-8)Úbase64Ú	b64encodeÚencodeÚdecode)r3   s    r   Úto_basic_authr9   A   s'   € ä×Ñ˜J×-Ñ-¨gÓ6Ó7×>Ñ>Ó@Ð@r   Úschemec                 ó¶   — | j                  «       j                  d«      \  }}}|j                  «       }|r#|j                  «       |j                  «       k(  r|S | S )a  Return ``auth_value`` with a leading ``<scheme> `` removed, or unchanged when absent.

    Callers supply both a bare credential and a complete header value, so prefixing
    unconditionally yields ``Bearer Bearer <jwt>``. Scheme names are case-insensitive per
    RFC 7235. A credential is required after the scheme, so both a token that merely begins
    with the scheme text and a scheme with nothing behind it are returned untouched.
    Surrounding whitespace is left to ``_strip_header_whitespace`` at header-build time.
    ú )ÚlstripÚ	partitionÚlower)r3   r:   Úscheme_nameÚ_Ú	remainderÚ
credentials         r   Ústrip_auth_schemerD   F   sW   € ð !+× 1Ñ 1Ó 3× =Ñ =¸cÓ BÑ€K��IØ!×(Ñ(Ó*€JÙ�k×'Ñ'Ó)¨V¯\©\«^Ò;ØÐØÐr   c                 ó¢   — t        | d«      }|| k(  rt        | «      S 	 t        j                  |d¬«       |S # t        $ r t        |«      cY S w xY w)a‰  Return the base64 credentials for a ``Basic`` header, encoding only when needed.

    ``Basic <credentials>`` carries credentials that are already encoded, so encoding the whole
    value again would bury the scheme inside the payload. This has to run before
    :func:`to_basic_auth` rather than at header-build time, where no prefix is left to find.
    A schemed value whose remainder does not decode is the bare ``username:password`` shape with
    the scheme written in front of it, and is encoded rather than forwarded as an invalid header;
    a pair always contains ``:``, which is outside the base64 alphabet, so the two never collide.
    ÚBasicT)Úvalidate)rD   r9   r5   Ú	b64decodeÚ
ValueError)r3   Úcredentialss     r   Úto_basic_credentialsrK   V   s\   € ô +¨:°wÓ?€KØ�jÒ Ü˜ZÓ(Ð(ð*Ü×Ñ˜¨tÕ4ð Ðøô ò *Ü˜[Ó)Ò)ð*ús   ž7 ·AÁAÚheadersc           	      óÖ   — | j                  «       D ��ci c]H  \  }}t        |t        «      r|j                  «       n|t        |t        «      r|j                  «       n|“ŒJ c}}S c c}}w ©N)ÚitemsÚ
isinstanceÚstrÚstrip)rL   ÚkeyÚvalues      r   Ú_strip_header_whitespacerU   j   sX   € ð "Ÿ-™-›/÷áˆC�ô # 3¬Ô,ˆ�‰Œ°#Ì*ÐUZÔ\_ÔJ`¸¿¹¼ÐfkÑ	kóð ùó s   ”AA%Úexcc                 ó°   — | g}|rQ|j                  d«      }t        |dd «      }|r|j                  |«       nt        |t        j
                  «      s|S |rŒQy )Nr   Ú
exceptions)ÚpopÚgetattrÚextendrP   ÚasyncioÚCancelledError)rV   ÚqueueÚcurrentÚnesteds       r   Ú_first_non_cancelled_causera   q   sU   € Ø),¨€EÙ
Ø—)‘)˜A“,ˆÜ˜ ,°Ó5ˆÙØ�L‰L˜Õ Ü˜G¤W×%;Ñ%;Ô<ØˆNò ð r   Ú_SDK_READ_TIMEOUT_CODEc                 óÒ   — t        | t        «      r| j                  j                  t        k7  ryt        | j
                  t        «      syt        | j                  j                  «      S )aÑ  The session read timeout elapsing, re-expressed as a ``TimeoutError``, or ``None``.

    The SDK reports its own elapsed read timeout as ``McpError`` carrying an HTTP status code in a
    field that otherwise holds JSON-RPC error codes, and it relays an upstream's JSON-RPC error
    through that same class and field. The numeric code alone therefore cannot separate the two, and
    an upstream answering with application code 408 would be reported as a gateway timeout it never
    caused. The SDK raises its own from inside an ``except TimeoutError``, so the elapsed timeout is
    on the context chain, while a relayed error is built from a received message and has no such
    chain; that is the discriminator.
    N)rP   r   ÚerrorÚcoderb   Ú__context__ÚTimeoutErrorÚmessage©rV   s    r   Ú_as_read_timeoutrj   ‚   sG   € ô �cœ8Ô$¨¯	©	¯©Ô:PÒ(PØÜ�c—o‘o¤|Ô4ØÜ˜Ÿ	™	×)Ñ)Ó*Ð*r   ÚTSessionResultc                   ó  — e Zd ZdZdZ	 	 	 	 	 	 	 ddedz  dedz  dedz  dedz  dedz  d	edz  d
edz  fd„Zed	ed
edz  dedz  dedz  dedz  defd„«       Zde	j                  dee	j                  e	j                  df   fd„Zy)ÚMCPSigV4Autha  
    httpx Auth class that signs each request with AWS SigV4.
    This is used for MCP servers that require AWS SigV4 authentication,
    such as AWS Bedrock AgentCore MCP servers. httpx calls auth_flow()
    for every outgoing request, enabling per-request signature computation.
    TNÚaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenÚaws_region_nameÚaws_service_nameÚaws_role_nameÚaws_session_namec                 ó~  — 	 ddl m} |xs d| _        |xs d| _        |r'| j                  |||||| j                  ¬«      | _        y |r|r ||||¬«      | _        y dd l}	|	j                  j                  «       }
|
j                  «       | _        | j                  €t        d«      ‚y # t        $ r t        d«      ‚w xY w)	Nr   ©ÚCredentialszJMissing botocore to use AWS SigV4 authentication. Run 'pip install boto3'.zbedrock-agentcorez	us-east-1)rs   rt   rn   ro   rp   rq   ©Ú
access_keyÚ
secret_keyÚtokenz¡No AWS credentials found. Provide aws_access_key_id and aws_secret_access_key, or configure default credentials (env vars, ~/.aws/credentials, instance profile).)Úbotocore.credentialsrw   r   Úservice_nameÚregion_nameÚ_assume_rolerJ   Úbotocore.sessionÚsessionÚget_sessionÚget_credentialsrI   )Úselfrn   ro   rp   rq   rr   rs   rt   rw   Úbotocorer�   s              r   Ú__init__zMCPSigV4Auth.__init__¡   sè   € ð	lÝ8ð -ÒCÐ0CˆÔØ*Ò9¨kˆÔñ Ø#×0Ñ0Ø+Ø!1Ø"3Ø&;Ø"3Ø $× 0Ñ 0ð  1ó  ˆDÕñ Ñ#8Ù*Ø,Ø0Ø'ô ˆDÕó $à%×-Ñ-×9Ñ9Ó;ˆGØ&×6Ñ6Ó8ˆDÔØ×ÑÐ'Ü ðHóð ð (øô9 ò 	lÜÐjÓkÐkð	lús   ‚B' Â'B<c                 ó  — ddl }ddlm} |xs% dt        t	        d«      j                  «       «      › �}d|i}	|r|r||	d<   ||	d<   |r||	d	<    |j                  di |	¤Ž}
|
j                  | |¬
«      }|d   } ||d   |d   |d   ¬«      S )z5Call STS AssumeRole and return temporary credentials.r   Nrv   zlitellm-mcp-Útimer~   rn   ro   rp   )ÚRoleArnÚRoleSessionNamerw   ÚAccessKeyIdÚSecretAccessKeyÚSessionTokenrx   )Ústs)Úboto3r|   rw   ÚintÚ
__import__rˆ   ÚclientÚassume_role)rs   rt   rn   ro   rp   rq   r�   rw   Úsession_nameÚ
sts_kwargsÚ
sts_clientÚsts_responseÚ	sts_credss                r   r   zMCPSigV4Auth._assume_roleÐ   sÄ   € ó 	Ý4à.Òa°LÄÄZÐPVÓEW×E\ÑE\ÓE^ÓA_Ð@`Ð2aˆØ#0°/Ð"Bˆ
ÙÑ!6Ø.?ˆJÐ*Ñ+Ø2GˆJÐ.Ñ/Ù Ø2C�
Ð.Ñ/Ø(˜EŸL™LÑ=°*Ñ=ˆ
Ø(×4Ñ4Ø!Ø(ð 5ó 
ˆð (¨Ñ6ˆ	ÙØ  Ñ/Ø Ð!2Ñ3Ø˜NÑ+ô
ð 	
r   Úrequestr   c              #   óŒ  K  — ddl m} ddlm}  ||j                  t        |j                  «      |j                  t        |j                  «      ¬«      } || j                  | j                  | j                  «      }|j                  |«       |j                  j                  «       D ]  \  }}||j                  |<   Œ |–— y ­w)Nr   )Ú	SigV4Auth)Ú
AWSRequest)ÚmethodÚurlÚdatarL   )Úbotocore.authr›   Úbotocore.awsrequestrœ   r�   rQ   rž   ÚcontentÚdictrL   rJ   r}   r~   Úadd_authrO   )r„   r™   r›   rœ   Úaws_requestÚsigv4Úheader_nameÚheader_values           r   Ú	auth_flowzMCPSigV4Auth.auth_flowð   s¢   è ø€ Ý+Ý2ñ (Ø—>‘>Ü�G—K‘KÓ Ø—‘Ü˜Ÿ™Ó)ô	
ˆñ ! ×!1Ñ!1°4×3DÑ3DÀd×FVÑFVÓWˆØ�‰�{Ô#à)4×)<Ñ)<×)BÑ)BÓ)Dò 	8Ñ%ˆK˜Ø+7ˆG�O‰O˜KÒ(ð	8à‹ùs   ‚CC)NNNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_request_bodyrQ   r†   Ústaticmethodr   ÚhttpxÚRequestr   ÚResponser©   r   r   r   rm   rm   —   s  „ ñð !Ðð )-Ø,0Ø(,Ø&*Ø'+Ø$(Ø'+ñ-à ™:ð-ð  # T™zð-ð  ™:ð	-ð
 ˜t™ð-ð  ™*ð-ð ˜T‘zð-ð  ™*ó-ð^ ð
Øð
à ™*ð
ð  ™:ð
ð  # T™zð	
ð
  ™:ð
ð ò
ó ð
ð> §¡ð °9¸U¿]¹]ÈEÏNÉNÐ\`Ð=`Ñ3aô r   rm   c                   óÊ  — e Zd ZdZdej
                  ddddddddddddfdedededee	eef   z  dz  dedz  d	e
dz  d
edz  de	eef   dz  dedz  dej                  dz  dej                  dz  dedz  dedz  dedz  fd„Zdeeej&                  dz  f   fd„Zde	eef   dz  de	eef   dz  fd„Zdedeegee   f   defd„Zddœdeegee   f   dedefd„Zdee	eef   z  ddfd„Zd edefd!„Zde	fd"„Zded#ej&                  f   fd$„Zd3d%ede e!   fd&„Z"e#d'e$de%fd(„«       Z&	 	 d4d)e'd*edz  d%ede%fd+„Z(de e)   fd,„Z*d-e+de,fd.„Z-de e.   fd/„Z/de e0   fd0„Z1d1e2de3fd2„Z4y)5Ú	MCPClienta4  
    MCP Client supporting:
      SSE and HTTP transports
      Authentication via Bearer token, Basic Auth, or API Key
      Tool calling with error handling and result parsing
      Sampling callbacks for upstream server LLM requests
      Elicitation callbacks for upstream server user-input requests
    Ú NÚ
server_urlÚtransport_typeÚ	auth_typer3   Úauth_header_nameÚtimeoutÚstdio_configÚextra_headersÚ
ssl_verifyÚaws_authÚresolved_authÚsampling_callbackÚelicitation_callbackÚlogging_callbackc                 ó,  — || _         || _        || _        |�|nt        | _        d | _        |xs t        |dd «      | _        || _        || _	        |	| _
        |
| _        || _        d | _        || _        || _        || _        |r| j#                  |«       y y )Nr§   )r¶   r·   r¸   r'   rº   Ú_mcp_auth_valuerZ   Ú_credential_slotr»   r¼   r½   Ú	_aws_authÚ_resolved_authÚ_last_initialize_instructionsÚ_sampling_callbackÚ_elicitation_callbackÚ_logging_callbackÚupdate_auth_value)r„   r¶   r·   r¸   r3   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   s                  r   r†   zMCPClient.__init__  s©   € ð"  *ˆŒØ,:ˆÔØ&/ˆŒØ)0Ð)<™gÔBTˆŒØ<@ˆÔð
 -=Ò,kÄÈÐWdÐfjÓ@kˆÔØ3?ˆÔØ4AˆÔØ.8ˆŒØ,4ˆŒð 2?ˆÔØ9=ˆÔ*Ø3DˆÔØ6JˆÔ"Ø2BˆÔáØ×"Ñ" :Õ.ð r   r   c           	      ó0  — d}| j                   t        j                  k(  rŽ| j                  st	        d«      ‚t        | j                  j                  dd«      | j                  j                  dg «      | j                  | j                  j                  d«      «      ¬«      }t        |«      dfS | j                   t        j                  k(  rE| j                  «       }| j                  «       }t        | j                  | j                  ||¬«      dfS t        €
t!        «       ‚| j                  «       }| j                  «       }t#        j$                  d	|«        ||t'        j(                  | j                  «      ¬
«      }t        | j                  |¬«      }||fS )zå
        Create the appropriate transport context based on transport type.
        Returns:
            Tuple of (transport_context, http_client).
            http_client is only set for HTTP transport and needs cleanup.
        Nz,stdio_config is required for stdio transportÚcommandrµ   ÚargsÚenv)rÎ   rÏ   rÐ   )rž   rº   rL   Úhttpx_client_factoryz.litellm headers for streamable_http_client: %s)rL   rº   )rž   Úhttp_client)r·   r.   Ústdior»   rI   r   ÚgetÚ_get_safe_stdio_envr   ÚsseÚ_get_auth_headersÚ_create_httpx_client_factoryr   r¶   rº   r   r   r&   Údebugr°   ÚTimeout)r„   rÒ   Úserver_paramsrL   rÑ   Útransport_ctxs         r   Ú_create_transport_contextz#MCPClient._create_transport_context;  st  € ð 15ˆØ×Ñ¤,×"4Ñ"4Ò4Ø×$Ò$Ü Ð!OÓPÐPÜ#8Ø×)Ñ)×-Ñ-¨i¸Ó<Ø×&Ñ&×*Ñ*¨6°2Ó6Ø×,Ñ,¨T×->Ñ->×-BÑ-BÀ5Ó-IÓJô$ˆMô
   Ó.°Ð4Ð4Ø×Ñ¤,×"2Ñ"2Ò2Ø×,Ñ,Ó.ˆGØ#'×#DÑ#DÓ#FÐ äØŸ™Ø ŸL™LØ#Ø)=ô	ð ðð ô "Ð)Ü6Ó8Ð8Ø×(Ñ(Ó*ˆØ#×@Ñ@ÓBÐÜ×ÑÐMÈwÔWÙ*ØÜ—M‘M $§,¡,Ó/ô
ˆô  6Ø—‘Ø#ô 
ˆð ˜kÐ)Ð)r   Úprovided_envc                 ó”   — |�|S h d£}i }|D ]+  }|t         j                  v sŒt         j                  |   ||<   Œ- d|vr	t        |d<   |S )a+  
        Return a safe environment for the stdio subprocess.

        If provided_env is set, we use it as-is.
        If provided_env is None, we return a minimal allowlist from the parent environment
        to avoid leaking sensitive LiteLLM keys (OPENAI_API_KEY, etc.) to sub-processes.
        >   ÚTMPÚHOMEÚLANGÚPATHÚTEMPÚUSERÚSHELLÚLC_ALLÚTMPDIRÚWINDIRÚCOMSPECÚLOGNAMEÚPATHEXTÚ	PNPM_HOMEÚ
SYSTEMROOTÚXDG_DATA_HOMEÚXDG_CACHE_HOMEÚXDG_CONFIG_HOMEÚNPM_CONFIG_CACHErò   )ÚosÚenvironr(   )r„   rÞ   Ú	safe_keysÚsafe_envrS   s        r   rÕ   zMCPClient._get_safe_stdio_envj  sd   € ð Ð#ØÐò
ˆ	ð0 ˆØò 	0ˆCØ”b—j‘jÒ Ü "§
¡
¨3¡�˜’ð	0ð  XÑ-Ü+<ˆHÐ'Ñ(àˆr   rÜ   Ú	operationc              ƒ   ó®  K  — |j                  «       ƒ d{  –—† }d}	 |d   |d   }}i }| j                  �| j                  |d<   | j                  �| j                  |d<   | j                  �| j                  |d<   t	        ||fdt        | j                  ¬«      i|¤Ž}|j                  «       ƒ d{  –—† }		 |	j                  «       ƒ d{  –—† }
d| _        |
�Bt        |
d	d«      }t        |t        «      r%|j                  «       r|j                  «       | _         ||	«      ƒ d{  –—† 	 |j                  ddd«      ƒ d{  –—†  	 |j                  ddd«      ƒ d{  –—†  S 7 �ŒL7 Œ³7 Œœ7 ŒC7 Œ*# t        $ r }t        j                   d
|«       Y d}~ŒLd}~ww xY w7 Œ<# t        $ rO}t        j                   d|«       t#        |«      }|�"t        |t$        j&                  «      r||‚Y d}~S Y d}~S d}~ww xY w# 	 |j                  ddd«      ƒ d{  –—†7   w # t        $ r }t        j                   d
|«       Y d}~w d}~ww xY wxY w# t        $ r}|}‚ d}~ww xY w# 	 |j                  ddd«      ƒ d{  –—†7   w # t        $ rO}t        j                   d|«       t#        |«      }|�"t        |t$        j&                  «      r||‚Y d}~w Y d}~w d}~ww xY wxY w­w)aa  
        Execute an operation within a transport and session context.
        Handles entering/exiting contexts and running the operation.
        Passes sampling/elicitation/logging callbacks to the ClientSession
        so that upstream MCP servers can request LLM inference (sampling),
        user input (elicitation), or send log messages.
        Nr   é   rÀ   rÁ   rÂ   Úread_timeout_seconds)ÚsecondsÚinstructionsz%Error during session context exit: %sz'Error during transport context exit: %s)Ú
__aenter__rÉ   rÊ   rË   r   r   rº   Ú
initializerÈ   rZ   rP   rQ   rR   Ú	__aexit__ÚBaseExceptionr&   rÙ   ra   r\   r]   )r„   rÜ   r÷   Ú	transportÚin_flight_errorÚread_streamÚwrite_streamÚsession_kwargsÚsession_ctxr�   Úinit_resultÚinsÚeÚ
exit_errorÚ
root_causes                  r   Ú_execute_session_operationz$MCPClient._execute_session_operation˜  sÑ  è ø€ ð "/×!9Ñ!9Ó!;×;ˆ	Ø04ˆð*	:Ø(1°!©°iÀ±l˜ˆKà46ˆNØ×&Ñ&Ð2Ø6:×6MÑ6M�Ð2Ñ3Ø×)Ñ)Ð5Ø9=×9SÑ9S�Ð5Ñ6Ø×%Ñ%Ð1Ø59×5KÑ5K�Ð1Ñ2ô "/ØØñ"ô &/°t·|±|Ô%Dð"ð !ñ	"ˆKð $/×#9Ñ#9Ó#;×;ˆGðUØ+2×+=Ñ+=Ó+?×%?�Ø59�Ô2ØÐ*Ü!(¨°nÀdÓ!K�CÜ! #¤sÔ+°·	±	´Ø=@¿Y¹Y»[˜Ô:Ù& wÓ/×/ðUØ%×/Ñ/°°d¸DÓA×AÐAð:Ø#×-Ñ-¨d°D¸$Ó?×?Ñ?ðO <ùð( <øà%?øð 0øð BùÜ$ò UÜ"×(Ñ(Ð)PÐRS×TÑTûðUúð @ùÜ ò :Ü×$Ñ$Ð%NÐPZÔ[Ü$>¸zÓ$J�
ØÐ)¬j¸Ì'×J`ÑJ`Ô.aØ$¨/Ð9ô /bÔ)ûð:ûðUØ%×/Ñ/°°d¸DÓA×AÒAøÜ$ò UÜ"×(Ñ(Ð)PÐRS×TÑTûðUþäò 	ØˆOØûð	ûð:Ø#×-Ñ-¨d°D¸$Ó?×?Ò?øÜ ò :Ü×$Ñ$Ð%NÐPZÔ[Ü$>¸zÓ$J�
ØÐ)¬j¸Ì'×J`ÑJ`Ô.aØ$¨/Ð9ô /bÔ)ûð:ÿsb  ‚K–E"—KžBI Â1E%Â2I Â7G6 Ã
E'ÃAG6 Ä%E)Ä&G6 Ä*E-Å E+ÅE-ÅFÅFÅFÅ!KÅ%I Å'G6 Å)G6 Å+E-Å-	FÅ6FÆI ÆFÆI ÆFÆ	G3Æ$A G.Ç$
KÇ.G3Ç3KÇ6IÇ8HÈHÈHÈIÈ	H>ÈH9È4IÈ9H>È>IÉI É	IÉIÉIÉI ÉKÉI7É0I3É1I7É6KÉ7	KÊ A K
Ë 
KË
KËKËKF©Úquiet_on_errorr  c             ƒ   óÀ  K  — d}	 d| _         | j                  «       \  }}| j                  ||«      ƒ d{  –—† |�	 |j                  «       ƒ d{  –—†  S S 7 Œ 7 Œ# t        $ r }t        j                  d|«       Y d}~S d}~ww xY w# t        $ r~}t        |«      }|�2t        j                  d| j                  | j                  xs d«       ||‚|rt
        j                  nt
        j                  } |d| j                  xs d«       ‚ d}~ww xY w# |�G	 |j                  «       ƒ d{  –—†7   w # t        $ r }t        j                  d|«       Y d}~w d}~ww xY ww xY w­w)aR  Open a session, run the provided coroutine, and clean up.

        quiet_on_error demotes the failure line to debug for callers that own the exception
        (call_tool / list_tools under raise_on_error), so an expected pass-through re-auth does
        not emit a warning per call; every other caller keeps the operator-visible warning.Nz$Error during http_client cleanup: %sz�MCP client timed out after %ss waiting for %s to answer; the server accepted the request and ended its response stream without a JSON-RPC replyrÓ   z)MCP client run_with_session failed for %s)rÈ   rÝ   r  Úacloser   r&   rÙ   Ú	Exceptionrj   Úwarningrº   r¶   )r„   r÷   r  rÒ   rÜ   r	  Úread_timeoutÚ_logs           r   Úrun_with_sessionzMCPClient.run_with_sessionÒ  sd  è ø€ ð 15ˆð	TØ15ˆDÔ.Ø)-×)GÑ)GÓ)IÑ&ˆM˜;Ø×8Ñ8¸È	ÓR×Rð Ð&ðTØ%×,Ñ,Ó.×.Ñ.ð 'ð Søð" /ùÜ$ò TÜ"×(Ñ(Ð)OÐQR×SÑSûðTûô# ò 	Ü"2°1Ó"5ˆLØÐ'Ü×&Ñ&ðUà—L‘LØ—O‘OÒ. wô	ð #¨Ð)Ù2@œ.×.Ò.Än×F\ÑF\ˆDÙÐ<¸d¿o¹oÒ>XÐQXÔYØûð	ûð Ð&ðTØ%×,Ñ,Ó.×.Ò.øÜ$ò TÜ"×(Ñ(Ð)OÐQR×SÑSûðTúð 'üsµ   ‚E†/B µA¶B ¹E¼AÁAÁAÁEÁB ÁAÁ	BÁ#A>Á9EÁ>BÂEÂ	DÂA9DÄDÄD ÄEÄD.Ä'D*Ä(D.Ä-EÄ.	EÄ7EÅEÅEÅEÅEÚmcp_auth_valuec                 óž   — t        |t        «      r|| _        y| j                  t        j
                  k(  rt        |«      | _        y|| _        y)zC
        Set the authentication header for the MCP client.
        N)rP   r£   rÄ   r¸   r+   ÚbasicrK   )r„   r  s     r   rÌ   zMCPClient.update_auth_valueö  s;   € ô �n¤dÔ+Ø#1ˆDÕ Ø�^‰^œwŸ}™}Ò,Ü#7¸Ó#GˆDÕ à#1ˆDÕ r   Údefaultc                 ó"   — | j                   xs |S rN   )rÅ   )r„   r  s     r   Ú_header_slotzMCPClient._header_slot  s   € Ø×$Ñ$Ò/¨Ð/r   c                 ó^  — i }| j                   �r7t        | j                   t        «      �rç| j                  t        j
                  k(  r/t        | j                   d«      }d|› �|| j                  d«      <   �nÐ| j                  t        j                  k(  r#d| j                   › �|| j                  d«      <   �n�| j                  t        j                  k(  r | j                   || j                  d«      <   �nS| j                  t        j                  k(  r | j                   || j                  d«      <   �n| j                  t        j                  k(  r.t        | j                   d«      }d|› �|| j                  d«      <   nË| j                  t        j                  k(  r.t        | j                   d«      }d|› �|| j                  d«      <   n€| j                  t        j                  k(  rct        | j                   d«      }d|› �|| j                  d«      <   n5t        | j                   t        «      r|j                  | j                   «       | j                   rQ| j"                  }|r"t%        ||«      rt'        | j                   |«      n| j                   }|j                  |xs i «       t)        |«      S )z3Generate authentication headers based on auth type.ÚBearerzBearer ÚAuthorizationzBasic z	X-API-Keyr{   ztoken )rÄ   rP   rQ   r¸   r+   Úbearer_tokenrD   r  r  Úapi_keyÚauthorizationÚoauth2r{   Úoauth2_token_exchanger£   Úupdater¼   rÅ   r1   r2   rU   )r„   rL   Ústatic_bearerÚoauth2_bearerÚscheme_tokenÚexchanged_bearerÚslotÚinjecteds           r   r×   zMCPClient._get_auth_headers  s0  € àˆØ×ÓÜ˜$×.Ñ.´Õ4Ø—>‘>¤W×%9Ñ%9Ò9Ü+<¸T×=QÑ=QÐS[Ó+\�MØDKÈMÈ?ÐB[�G˜D×-Ñ-¨oÓ>Ó?Ø—^‘^¤w§}¡}Ò4ØDJÈ4×K_ÑK_ÐJ`ÐBa�G˜D×-Ñ-¨oÓ>Ó?Ø—^‘^¤w§¡Ò6Ø>B×>RÑ>R�G˜D×-Ñ-¨kÓ:Ó;Ø—^‘^¤w×'<Ñ'<Ò<àBF×BVÑBV�G˜D×-Ñ-¨oÓ>Ó?Ø—^‘^¤w§~¡~Ò5Ü+<¸T×=QÑ=QÐS[Ó+\�MØDKÈMÈ?ÐB[�G˜D×-Ñ-¨oÓ>Ò?Ø—^‘^¤w§}¡}Ò4Ü*;¸D×<PÑ<PÐRYÓ*Z�LØDJÈ<È.ÐBY�G˜D×-Ñ-¨oÓ>Ò?Ø—^‘^¤w×'DÑ'DÒDÜ.?À×@TÑ@TÐV^Ó._Ð$ØDKÐL\ÐK]ÐB^�G˜D×-Ñ-¨oÓ>Ò?Ü˜D×0Ñ0´$Ô7Ø—‘˜t×3Ñ3Ô4ð
 ×Òð ×/Ñ/ˆDá<@ÄZÐPWÐY]ÔE^”˜t×1Ñ1°4Ô8Ðdh×dvÑdvð ð �N‰N˜8š> rÔ*Ü'¨Ó0Ð0r   .c           	      ó¶   ‡ — ddddœdt         t        t        f   dz  dt        j                  dz  dt        j                  dz  dt        j
                  fˆ fd„}|S )a‘  
        Create a custom httpx client factory that uses LiteLLM's SSL configuration.
        This factory follows the same CA bundle path logic as http_handler.py:
        1. Check ssl_verify parameter (can be SSLContext, bool, or path to CA bundle)
        2. Check SSL_VERIFY environment variable
        3. Check SSL_CERT_FILE environment variable
        4. Fall back to certifi CA bundle
        N)rL   rº   ÚauthrL   rº   r,  r   c           	      ób  •— t        ‰j                  «      }t        j                  dt	        |«      j
                  «       ‰j                  �‰j                  n‰j                  }|�|n|}t        ‰j                  ‰j                  «      }t        j                  | |||d|r
d|gi¬«      S i ¬«      S )z=Create an httpx.AsyncClient with LiteLLM's SSL configuration.z&MCP client using SSL configuration: %sTr™   )rL   rº   r,  ÚverifyÚfollow_redirectsÚevent_hooks)r)   r½   r&   rÙ   Útyperª   rÇ   rÆ   r0   r¶   rÅ   r°   ÚAsyncClient)rL   rº   r,  Ú
ssl_configÚfallback_authÚeffective_authÚguardr„   s          €r   Úfactoryz7MCPClient._create_httpx_client_factory.<locals>.factory7  s²   ø€ ô !6°d·o±oÓ FˆJÜ× Ñ Ð!IÌ4ÐPZÓK[×KdÑKdÔeð ;?×:MÑ:MÐ:Y 4×#6Ò#6Ð_c×_mÑ_mˆMØ,0Ð,<¡DÀ-ˆNÜ3°D·O±OÀT×EZÑEZÓ[ˆEÜ×$Ñ$ØØØ#Ø!Ø!%Ù49˜Y¨¨Ð0ôð ð @Bôð r   )r£   rQ   r°   rÚ   ÚAuthr2  )r„   r7  s   ` r   rØ   z&MCPClient._create_httpx_client_factory-  se   ø€ ð .2Ø,0Ø&*ò		äœ#œs˜(‘^ dÑ*ð	ô —]‘] TÑ)ð	ô —*‘*˜tÑ#ð		ô
 ×Ñõ	ð2 ˆr   Úraise_on_errorc              ƒ   ó0  K  — t        j                  d| j                  xs d«       dt        fd„}	 | j	                  ||¬«      ƒ d{  –—† }t        |j                  «      }|j                  D �cg c]  }|j                  ‘Œ }}t        j                  d|| j                  xs d|«       |j                  S 7 Œnc c}w # t        j                  $ r t        j                  d«       ‚ t        $ r¤}t        |«      j                  }|rt         j                  nt         j                  }	 |	d	|› d
|› d| j                  xs d› d| j                   › �«       d|v sd|v r*|rt         j                  nt         j"                  }
 |
d«       |r‚ g cY d}~S d}~ww xY w­w)a®  List available tools from the server.

        Args:
            raise_on_error: When True, re-raise exceptions instead of returning
                an empty list. Used by the proxy's pass-through MCP flow so it
                can surface upstream HTTP 401 responses as a proper 401 to the
                MCP client (triggering the upstream OAuth flow) rather than
                masking them as "connected, no tools".
        ú MCP client listing tools from %srÓ   r�   c              “   ó>   K  — | j                  «       ƒ d {  –—† S 7 Œ­wrN   )Ú
list_tools©r�   s    r   Ú_list_tools_operationz3MCPClient.list_tools.<locals>._list_tools_operation^  s   è ø€ Ø ×+Ñ+Ó-×-Ð-Ð-úó   ‚–—r  Nú&MCP client listed %s tools from %s: %sz#MCP client list_tools was cancelledz+MCP client list_tools failed - Error Type: ú	, Error: ú
, Server: ú, Transport: ÚBrokenResourceErrorÚBrokenú|MCP client detected broken connection/stream during list_tools - the MCP server may have crashed, disconnected, or timed out)r&   rÙ   r¶   r   r  ÚlenÚtoolsÚnameÚinfor\   r]   r  r  r1  rª   Ú	exceptionr·   rd   )r„   r9  r?  ÚresultÚ
tool_countÚtoolÚ
tool_namesr	  Ú
error_typer  Ú_log_brokens              r   r=  zMCPClient.list_toolsR  sŽ  è ø€ ô 	×ÑÐ?ÀÇÁÒA[ÐT[Ô\ð	.´ó 	.ð%	Ø"&×"7Ñ"7Ð8MÐ^lÐ"7Ó"m×mˆFÜ # F§L¡LÓ 1ˆJØ7=·|±|Ö D¨t §£Ð DˆJÐ DÜ×ÑØ8¸*ÀdÇoÁoÒF`ÐY`Ðblôð —<‘<Ðð núâ Døô
 ×%Ñ%ò 	Ü×"Ñ"Ð#HÔIØÜò 	Ü $ Q£× 0Ñ 0ˆJñ 3Aœ.×.Ò.Än×F^ÑF^ˆDÙðØ)˜lð +Ø˜ð ØŸ?™?Ò5¨gÐ6ð 7Ø"×1Ñ1Ð2ð	4ôð %¨
Ñ2°hÀ*Ñ6LÙ=K¤^×%9Ò%9ÔQ_×QeÑQe�ÙðRôñ
 Øà�Iûð5	üsY   ‚/F²B> ÁB7Á	'B> Á0B9Â3B> Â6FÂ7B> Â9B> Â>1FÃ/BFÆFÆ	FÆFÆFrV   c                 ód   — t        t        dt        | «      j                  › d| › �¬«      gd¬«      S )zTThe error result ``call_tool`` returns when it swallows a failure (no re-execution).Útextz: )r1  rT  T)r¢   ÚisError)ÚMCPCallToolResultr#   r1  rª   ri   s    r   Úerror_tool_resultzMCPClient.error_tool_resultˆ  s7   € ô !Ü  f´d¸3³i×6HÑ6HÐ5IÈÈCÈ5Ð3QÔRÐSØô
ð 	
r   Úcall_tool_request_paramsÚhost_progress_callbackc              ƒ   óL  ‡‡‡K  — t        j                  d‰j                  «       dt        dt        dz  dt        dz  fˆˆfd„Šdt
        fˆˆfd„}	 | j                  ||¬	«      ƒ d{  –—† }t        j                  d
‰j                  «       |S 7 Œ&# t        j                  $ r- t        j                  d| j                  | j                  «       ‚ t        $ rÈ}ddl}|j                  «       }t        j                  d|«       t!        |«      j"                  }	|rt         j                  nt         j$                  }
 |
d|	› d|› d‰j                  › d| j                  xs d› d| j&                  › �
«       d|	v sd|	v r |
d«       |r‚ | j)                  |«      cY d}~S d}~ww xY w­w)a®  
        Call an MCP Tool.

        Args:
            raise_on_error: When True, re-raise the underlying exception instead of returning an
                ``isError=True`` result. The token-exchange (OBO) tool-call path uses this to detect
                an upstream 401 so it can re-mint the exchanged token and retry once; every other
                caller keeps the default and gets graceful ``isError`` degradation.
        zMCP client calling tool '%s'ÚprogressÚtotalNrh   c              “   ó  •K  — |r| |z  dz  nd}t        j                  d‰j                  › d| › d|› d|d›d|xs d	› �
«       ‰r	  ‰| |«      ƒ d {  –—†  y y 7 Œ# t        $ r }t        j                  d
|«       Y d }~y d }~ww xY w­w)Néd   r   z
MCP Tool 'z' progress: ú/z (z.0fz%) - rµ   zFailed to forward to Host: %s)r&   rK  rJ  r  r  )r[  r\  rh   Ú
percentager	  rX  rY  s        €€r   Úon_progressz(MCPClient.call_tool.<locals>.on_progress¡  s¥   øè ø€ Ù<A ¨EÑ!1°CÒ!7ÀqˆJÜ×ÑØÐ5×:Ñ:Ð;¸<Ø�*˜A˜e˜W B z°#Ð&6°e¸GºMÀr¸?ðLôñ
 &ðOÙ0°¸5ÓA×AÑAð &àAùÜ ò OÜ"×*Ñ*Ð+JÈA×NÑNûðOüsB   ƒABÁA ÁAÁA ÁBÁA Á	BÁ$A?Á:BÁ?BÂBr�   c              “   óš   •K  — t        j                  d«       | j                  ‰j                  ‰j                  ‰¬«      ƒ d {  –—† S 7 Œ­w)Nz'MCP client sending tool call to session)rJ  Ú	argumentsÚprogress_callback)r&   rÙ   Ú	call_toolrJ  rc  )r�   rX  ra  s    €€r   Ú_call_tool_operationz1MCPClient.call_tool.<locals>._call_tool_operation®  sM   øè ø€ Ü× Ñ Ð!JÔKØ ×*Ñ*Ø-×2Ñ2Ø2×<Ñ<Ø"-ð +ó ÷ ð ð ús   ƒAAÁA	ÁAr  z0MCP client tool call '%s' completed successfullyz/MCP client tool call timed out after %ss for %sr   z"MCP client tool call traceback:
%sz*MCP client call_tool failed - Error Type: rB  z, Tool: rC  rÓ   rD  rE  rF  zkMCP client detected broken connection/stream - the MCP server may have crashed, disconnected, or timed out.)r&   rK  rJ  ÚfloatrQ   r   r  r\   r]   r  rº   r¶   r  Ú	tracebackÚ
format_excrÙ   r1  rª   rd   r·   rW  )r„   rX  rY  r9  rf  Útool_resultr	  rh  Úerror_tracerQ  r  ra  s    ``        @r   re  zMCPClient.call_tool�  s²  úè ø€ ô 	×ÑÐ:Ð<T×<YÑ<YÔZð	O¬ð 	O´e¸d±lð 	OÌSÐSWÉZö 	Oð	´ö 	ð%	-Ø'+×'<Ñ'<Ð=QÐbpÐ'<Ó'q×!qˆKÜ×ÑÐ RÐTl×TqÑTqÔrØÐð "rùô ×%Ñ%ò 	Ü×"Ñ"Ð#TÐVZ×VbÑVbÐdh×dsÑdsÔtØÜò 	-Ûà!*×!5Ñ!5Ó!7ˆKÜ× Ñ Ð!FÈÔTä $ Q£× 0Ñ 0ˆJñ 3Aœ.×.Ò.Än×FZÑFZˆDÙðØ)˜lð +Ø˜ð Ø1×6Ñ6Ð7ð 8ØŸ?™?Ò5¨gÐ6ð 7Ø"×1Ñ1Ð2ð4ôð %¨
Ñ2°hÀ*Ñ6LÙðSôñ Øà×)Ñ)¨!Ó,Õ,ûð=	-üsJ   …AF$ÁB Á)BÁ*%B ÂF$ÂB ÂAF!ÃB=FÆF!ÆF$ÆF!Æ!F$c              ƒ   óÂ  K  — t        j                  d| j                  xs d«       dt        fd„}	 | j	                  |«      ƒ d{  –—† }t        |j                  «      }|j                  D �cg c]  }|j                  ‘Œ }}t        j                  d|| j                  xs d|«       |j                  S 7 Œnc c}w # t        j                  $ r t        j                  d«       ‚ t        $ ro}t        |«      j                  }t        j                  d||| j                  xs d| j                   «       d	|v sd
|v rt        j                  d«       g cY d}~S d}~ww xY w­w)z'List available prompts from the server.r;  rÓ   r�   c              “   ó>   K  — | j                  «       ƒ d {  –—† S 7 Œ­wrN   )Úlist_promptsr>  s    r   Ú_list_prompts_operationz7MCPClient.list_prompts.<locals>._list_prompts_operationá  s   è ø€ Ø ×-Ñ-Ó/×/Ð/Ð/úr@  NrA  z%MCP client list_prompts was cancelledzUMCP client list_prompts failed - Error Type: %s, Error: %s, Server: %s, Transport: %srE  rF  rG  )r&   rÙ   r¶   r   r  rH  ÚpromptsrJ  rK  r\   r]   r  r  r1  rª   rd   r·   )r„   ro  rM  Úprompt_countÚpromptÚprompt_namesr	  rQ  s           r   rn  zMCPClient.list_promptsÝ  s>  è ø€ ä×ÑÐ?ÀÇÁÒA[ÐT[Ô\ð	0´=ó 	0ð	Ø"&×"7Ñ"7Ð8OÓ"P×PˆFÜ"% f§n¡nÓ"5ˆLØ=C¿^¹^Ö"L°6 6§;£;Ð"LˆLÐ"LÜ×ÑØ8¸,ÈÏÉÒHbÐ[bÐdpôð —>‘>Ð!ð Qúâ"Løô
 ×%Ñ%ò 	Ü×"Ñ"Ð#JÔKØÜò 	Ü $ Q£× 0Ñ 0ˆJÜ× Ñ ØgØØØ—‘Ò* 7Ø×#Ñ#ôð %¨
Ñ2°hÀ*Ñ6LÜ×$Ñ$ðRôð
 �Iûð!	üóY   ‚/E²B< ÁB5Á'B< Á.B7Â3B< Â4EÂ5B< Â7B< Â<1EÃ-A$EÅEÅEÅEÅEÚget_prompt_request_paramsc           	   ƒ   ó„  ‡K  — t        j                  d‰j                  «       dt        fˆfd„}	 | j	                  |«      ƒ d{  –—† }t        j                  d‰j                  «       |S 7 Œ&# t
        j                  $ r t        j                  d«       ‚ t        $ rž}ddl	}|j                  «       }t        j                  d|«       t        |«      j                  }t        j                  d	||‰j                  | j                  xs d
| j                   «       d|v sd|v rt        j                  d«       ‚ d}~ww xY w­w)z.Fetch a prompt definition from the MCP server.zMCP client fetching prompt '%s'r�   c              “   ó˜   •K  — t        j                  d«       | j                  ‰j                  ‰j                  ¬«      ƒ d {  –—† S 7 Œ­w)Nz0MCP client sending get_prompt request to session)rJ  rc  )r&   rÙ   Ú
get_promptrJ  rc  )r�   ru  s    €r   Ú_get_prompt_operationz3MCPClient.get_prompt.<locals>._get_prompt_operation  sJ   øè ø€ Ü× Ñ Ð!SÔTØ ×+Ñ+Ø.×3Ñ3Ø3×=Ñ=ð ,ó ÷ ð ð ús   ƒA A
ÁAÁA
Nz1MCP client get_prompt '%s' completed successfullyz#MCP client get_prompt was cancelledr   z#MCP client get_prompt traceback:
%sz_MCP client get_prompt failed - Error Type: %s, Error: %s, Prompt: %s, Server: %s, Transport: %srÓ   rE  rF  z}MCP client detected broken connection/stream during get_prompt - the MCP server may have crashed, disconnected, or timed out.)r&   rK  rJ  r   r  r\   r]   r  r  rh  ri  rÙ   r1  rª   rd   r¶   r·   )r„   ru  ry  Úget_prompt_resultr	  rh  rk  rQ  s    `      r   rx  zMCPClient.get_prompt  s*  øè ø€ ä×ÑÐ=Ð?X×?]Ñ?]Ô^ð	´õ 	ð	Ø-1×-BÑ-BÐCXÓ-Y×'YÐÜ×ÑÐ SÐUn×UsÑUsÔtØ$Ð$ð (Zùô ×%Ñ%ò 	Ü×"Ñ"Ð#HÔIØÜò 	Ûà!*×!5Ñ!5Ó!7ˆKÜ× Ñ Ð!GÈÔUä $ Q£× 0Ñ 0ˆJÜ× Ñ ØqØØØ)×.Ñ.Ø—‘Ò* 7Ø×#Ñ#ôð %¨
Ñ2°hÀ*Ñ6LÜ×$Ñ$ðSôð ûð+	üs;   ƒ-E ±A. ÁA,Á%A. Á+E Á,A. Á.1D=ÂBD8Ä8D=Ä=E c              ƒ   óÂ  K  — t        j                  d| j                  xs d«       dt        fd„}	 | j	                  |«      ƒ d{  –—† }t        |j                  «      }|j                  D �cg c]  }|j                  ‘Œ }}t        j                  d|| j                  xs d|«       |j                  S 7 Œnc c}w # t        j                  $ r t        j                  d«       ‚ t        $ ro}t        |«      j                  }t        j                  d||| j                  xs d| j                   «       d	|v sd
|v rt        j                  d«       g cY d}~S d}~ww xY w­w)z)List available resources from the server.z$MCP client listing resources from %srÓ   r�   c              “   ó>   K  — | j                  «       ƒ d {  –—† S 7 Œ­wrN   )Úlist_resourcesr>  s    r   Ú_list_resources_operationz;MCPClient.list_resources.<locals>._list_resources_operation.  s   è ø€ Ø ×/Ñ/Ó1×1Ð1Ð1úr@  Nz*MCP client listed %s resources from %s: %sz'MCP client list_resources was cancelledzWMCP client list_resources failed - Error Type: %s, Error: %s, Server: %s, Transport: %srE  rF  z€MCP client detected broken connection/stream during list_resources - the MCP server may have crashed, disconnected, or timed out)r&   rÙ   r¶   r   r  rH  Ú	resourcesrJ  rK  r\   r]   r  r  r1  rª   rd   r·   )r„   r~  rM  Úresource_countÚresourceÚresource_namesr	  rQ  s           r   r}  zMCPClient.list_resources*  sD  è ø€ ä×ÑÐCÀTÇ_Á_ÒE_ÐX_Ô`ð	2´]ó 	2ð	Ø"&×"7Ñ"7Ð8QÓ"R×RˆFÜ$'¨×(8Ñ(8Ó$9ˆNØCI×CSÑCSÖ$T°x X§]£]Ð$TˆNÐ$TÜ×ÑØ<¸nÈdÏoÉoÒNhÐahÐjxôð ×#Ñ#Ð#ð Súâ$Tøô
 ×%Ñ%ò 	Ü×"Ñ"Ð#LÔMØÜò 	Ü $ Q£× 0Ñ 0ˆJÜ× Ñ ØiØØØ—‘Ò* 7Ø×#Ñ#ôð %¨
Ñ2°hÀ*Ñ6LÜ×$Ñ$ðRôð
 �Iûð!	ürt  c              ƒ   óÂ  K  — t        j                  d| j                  xs d«       dt        fd„}	 | j	                  |«      ƒ d{  –—† }t        |j                  «      }|j                  D �cg c]  }|j                  ‘Œ }}t        j                  d|| j                  xs d|«       |j                  S 7 Œnc c}w # t        j                  $ r t        j                  d«       ‚ t        $ ro}t        |«      j                  }t        j                  d||| j                  xs d| j                   «       d	|v sd
|v rt        j                  d«       g cY d}~S d}~ww xY w­w)z2List available resource templates from the server.z-MCP client listing resource templates from %srÓ   r�   c              “   ó>   K  — | j                  «       ƒ d {  –—† S 7 Œ­wrN   )Úlist_resource_templatesr>  s    r   Ú"_list_resource_templates_operationzMMCPClient.list_resource_templates.<locals>._list_resource_templates_operationR  s   è ø€ Ø ×8Ñ8Ó:×:Ð:Ð:úr@  Nz3MCP client listed %s resource templates from %s: %sz0MCP client list_resource_templates was cancelledz`MCP client list_resource_templates failed - Error Type: %s, Error: %s, Server: %s, Transport: %srE  rF  z‰MCP client detected broken connection/stream during list_resource_templates - the MCP server may have crashed, disconnected, or timed out)r&   rÙ   r¶   r   r  rH  ÚresourceTemplatesrJ  rK  r\   r]   r  r  r1  rª   rd   r·   )r„   r†  rM  Úresource_template_countÚresourceTemplateÚresource_template_namesr	  rQ  s           r   r…  z!MCPClient.list_resource_templatesN  sK  è ø€ ä×ÑÐLÈdÏoÉoÒNhÐahÔið	;¼mó 	;ð	Ø"&×"7Ñ"7Ð8ZÓ"[×[ˆFÜ-0°×1IÑ1IÓ-JÐ#Ø\b×\tÑ\tÖ-uÐHXÐ.>×.CÓ.CÐ-uÐ#Ð-uÜ×ÑØEØ'Ø—‘Ò* 7Ø'ô	ð ×+Ñ+Ð+ð \úâ-uøô ×%Ñ%ò 	Ü×"Ñ"Ð#UÔVØÜò 	Ü $ Q£× 0Ñ 0ˆJÜ× Ñ ØrØØØ—‘Ò* 7Ø×#Ñ#ôð %¨
Ñ2°hÀ*Ñ6LÜ×$Ñ$ðRôð
 �Iûð!	ürt  rž   c           	   ƒ   óH  ‡K  — t        j                  d‰«       dt        fˆfd„}	 | j                  |«      ƒ d{  –—† }t        j                  d‰«       |S 7 Œ# t        j
                  $ r t        j                  d«       ‚ t        $ r”}ddl}|j                  «       }t        j                  d|«       t        |«      j                  }t        j                  d	||‰| j                  xs d
| j                  «       d|v sd|v rt        j                  d«       ‚ d}~ww xY w­w)z,Fetch resource contents from the MCP server.z!MCP client fetching resource '%s'r�   c              “   ól   •K  — t        j                  d«       | j                  ‰«      ƒ d {  –—† S 7 Œ­w)Nz3MCP client sending read_resource request to session)r&   rÙ   Úread_resource)r�   rž   s    €r   Ú_read_resource_operationz9MCPClient.read_resource.<locals>._read_resource_operationy  s-   øè ø€ Ü× Ñ Ð!VÔWØ ×.Ñ.¨sÓ3×3Ð3Ð3ús   ƒ*4­2®4Nz4MCP client read_resource '%s' completed successfullyz&MCP client read_resource was cancelledr   z&MCP client read_resource traceback:
%sz_MCP client read_resource failed - Error Type: %s, Error: %s, Url: %s, Server: %s, Transport: %srÓ   rE  rF  z€MCP client detected broken connection/stream during read_resource - the MCP server may have crashed, disconnected, or timed out.)r&   rK  r   r  r\   r]   r  r  rh  ri  rÙ   r1  rª   rd   r¶   r·   )r„   rž   rŽ  Úread_resource_resultr	  rh  rk  rQ  s    `      r   r�  zMCPClient.read_resourceu  s  øè ø€ ä×ÑÐ?ÀÔEð	4´Mõ 	4ð	Ø04×0EÑ0EÐF^Ó0_×*_Ð Ü×ÑÐ VÐX[Ô\Ø'Ð'ð +`ùô ×%Ñ%ò 	Ü×"Ñ"Ð#KÔLØÜò 	Ûà!*×!5Ñ!5Ó!7ˆKÜ× Ñ Ð!JÈKÔXä $ Q£× 0Ñ 0ˆJÜ× Ñ ØqØØØØ—‘Ò* 7Ø×#Ñ#ôð %¨
Ñ2°hÀ*Ñ6LÜ×$Ñ$ðSôð ûð+	üs9   ƒ#D"§A »A¼A ÁD"ÁA Á1DÂBDÄDÄD")F)NF)5rª   r«   r¬   r­   r.   ÚhttprQ   r/   r,   r£   rg  r-   r*   r°   r8  r   r†   Útupler   r2  rÝ   rÕ   r   r   rk   r  Úboolr  rÌ   r  r×   rØ   ÚlistÚMCPToolr=  r¯   r  rV  rW  ÚMCPCallToolRequestParamsre  r!   rn  r   r    rx  r   r}  r"   r…  r%   r   r�  r   r   r   r´   r´     s  „ ñð Ø+7×+<Ñ+<Ø!%Ø26Ø'+Ø $Ø.2Ø/3Ø)-Ø&*Ø+/Ø-1Ø04Ø,0ñ(/àð(/ð )ð(/ð ð	(/ð
 ˜$˜s C˜x™.Ñ(¨4Ñ/ð(/ð  ™*ð(/ð ˜‘ð(/ð % tÑ+ð(/ð ˜C ˜H‘~¨Ñ,ð(/ð   $Ñ&ð(/ð —*‘*˜tÑ#ð(/ð —z‘z DÑ(ð(/ð $ d™?ð(/ð '¨™oð(/ð # T™/ó(/ðT-*à	ˆs�E×%Ñ%¨Ñ,Ð,Ñ	-ó-*ð^,°°S¸#°X±ÀÑ0Eð ,È$ÈsÐTWÈxÉ.Ð[_ÑJ_ó ,ð\8:àð8:ð ˜]˜O¨Y°~Ñ-FÐFÑGð8:ð 
ó	8:ð|  %ò	"Tà˜]˜O¨Y°~Ñ-FÐFÑGð"Tð ð	"Tð
 
ó"TðH	2°°d¸3À¸8±nÑ0Dð 	2Èó 	2ð0 Cð 0¨Có 0ð'1 4ó '1ðR#¨h°s¸E×<MÑ<MÐ7MÑ.Nó #ñJ4¨tð 4ÀÀWÁó 4ðl ð
˜yð 
Ð->ò 
ó ð
ð 37Ø$ñ	K-à":ðK-ð !)¨4¡ðK-ð ð	K-ð
 
óK-ðZ" D¨¡Ló "ðH'Ð:Pð 'ÐUdó 'ðR" d¨8¡nó "ðH%¨tÐ4DÑ/Eó %ðN$ vð $Ð2Dô $r   r´   )Wr­   r\   r5   ró   Úcollections.abcr   r   r   Údatetimer   Ú	importlibr   Útypingr   r	   r
   r°   r   r   r   r   r   r   Úmcp.client.sser   Úmcp.client.stdior   r   Ú__annotations__Úmcp.client.streamable_httpr’   Ústreamable_httpÚstreamable_http_modulerZ   r   r   r   Ú	mcp.typesr   r•  r   rV  r   r    r!   r"   r#   r$   r”  Úpydanticr%   Úlitellm._loggingr&   Úlitellm.constantsr'   r(   Ú&litellm.llms.custom_httpx.http_handlerr)   Úlitellm.types.llms.custom_httpr*   Úlitellm.types.mcpr+   r,   r-   r.   r/   r0   r1   r2   rQ   r9   rD   rK   r£   rU   r   ra   r�   ÚcodesÚREQUEST_TIMEOUTrb   rg   rj   rk   r8  rm   r´   r   r   r   ú<module>r©     s©  ðòó Û Û 	ß :Ñ :Ý Ý ß &Ñ &ã ß \Õ \Ý %Ý )à%)Ð ˜˜d™
Ó )ð	ß?Ð?á$Ð%;Ð=UÐW[Ó\Ðð *7Ð  Ó 6ð¨kó õ HÝ 9÷õ õ &Ý å +ß CÝ HÝ 6÷	÷ 	ó 	ðA˜cð A có Að
 #ð ¨sð °só ð  Sð ¨Só ð( d¨3°¨8¡nð ¸¸cÀ3¸h¹ó ð	 Mð 	°mÀdÑ6Jó 	ñ !$ E§K¡K×$?Ñ$?Ó @Ð ˜Ó @ð+ð+˜-ð +¨L¸4Ñ,?ó +ñ$ Ð)Ó*€ôm�5—:‘:ô m÷`R
ò R
øða ò 	Ùð	ús   ÁE ÅE!Å E!