
    h                         d Z ddlZddlZddlmZ ddlmZ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 ddlmZ ddlmZmZmZmZmZ dedefdZ G d d      Z y)zF
LiteLLM Proxy uses this MCP Client to connnect to other MCP servers.
    N)	timedelta)ListOptional)ClientSessionStdioServerParameters)
sse_client)stdio_client)streamablehttp_client)CallToolRequestParams)CallToolResult)Tool)MCPAuthMCPAuthTypeMCPStdioConfigMCPTransportMCPTransportType
auth_valuereturnc                 f    t        j                  | j                  d            j                         S )z(Convert auth value to Basic Auth format.zutf-8)base64	b64encodeencodedecode)r   s    b/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/experimental_mcp_client/client.pyto_basic_authr      s'    J--g67>>@@    c                       e Zd ZdZdej
                  ddddfdededede	e   d	e
d
e	e   fdZd Zd Zd Zd ZdefdZdefdZdee   fdZdedefdZy)	MCPClientz
    MCP Client supporting:
      SSE and HTTP transports
      Authentication via Bearer token, Basic Auth, or API Key
      Tool calling with error handling and result parsing
     Ng      N@
server_urltransport_type	auth_typer   timeoutstdio_configc                     || _         || _        || _        || _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        || _        |r| j                  |       y y )N)r    r!   r"   r#   _mcp_auth_value_session_context_transport_ctx
_transport_session_ctx_taskr$   update_auth_value)selfr    r!   r"   r   r#   r$   s          r   __init__zMCPClient.__init__'   su      *,:&/%.215" -1
6B "":. r   c                    K   	 | j                          d{    | S 7 # t        $ r | j                          d{  7    w xY ww)zh
        Enable async context manager support.
          Initializes the transport and session.
        N)connect	Exception
disconnectr.   s    r   
__aenter__zMCPClient.__aenter__A   sE     
	,,.  K ! 	//###	s.   A    A  A?AAc                   K   | j                   ry	 | j                  t        j                  k(  r| j                  st        d      t        | j                  j                  dd      | j                  j                  dg       | j                  j                  di             }t        |      | _	        | j                  j                          d{   | _        t        | j                  d   | j                  d	         | _        | j                  j                          d{   | _         | j                   j                          d{    y| j                  t        j                  k(  r| j!                         }t#        | j$                  | j&                  |
      | _	        | j                  j                          d{   | _        t        | j                  d   | j                  d	         | _        | j                  j                          d{   | _         | j                   j                          d{    y| j!                         }t)        | j$                  t+        | j&                        |
      | _	        | j                  j                          d{   | _        t        | j                  d   | j                  d	         | _        | j                  j                          d{   | _         | j                   j                          d{    y7 L7 7 7 e7 7 7 7 ?7 # t,        $ r | j/                          d{  7    w xY ww)z%Initialize the transport and session.Nz,stdio_config is required for stdio transportcommandr   argsenv)r7   r8   r9   r      )urlr#   headers)seconds)r'   r!   r   stdior$   
ValueErrorr   getr	   r)   r5   r*   r   r+   
initializesse_get_auth_headersr   r    r#   r
   r   r2   r3   )r.   server_paramsr<   s      r   r1   zMCPClient.connectM   s    ==)	""l&8&88(($%STT 5 --11)R@**..vr:))--eR8! '3=&A#(,(;(;(F(F(H"H$1$//!2DdooVWFX$Y!&*&7&7&B&B&D Dmm..000$$(8(88002&0 LL#'#
 )-(;(;(F(F(H"H$1$//!2DdooVWFX$Y!&*&7&7&B&B&D Dmm..000002&;%dll;#'#
 )-(;(;(F(F(H"H$1$//!2DdooVWFX$Y!&*&7&7&B&B&D Dmm..0003 #I D0 #I D0 #I D0 	//###	s   MB>L2 LAL2 !L"&L2 L!	L2 MA1L2 ?L$ AL2 L'&L2 8L*9L2 =M>AL2 L,AL2 .L./&L2 L0L2 ML2 L2 !L2 $L2 'L2 *L2 ,L2 .L2 0L2 2MMMMc                 @   K   | j                          d{    y7 w)z%Cleanup when exiting context manager.N)r3   )r.   exc_typeexc_valexc_tbs       r   	__aexit__zMCPClient.__aexit__}   s     oos   c                   K   | j                   rI| j                   j                         s/| j                   j                          	 | j                    d{    | j
                  r4	 | j                  j                  ddd       d{    d| _        d| _        | j                  r4	 | j                  j                  ddd       d{    d| _	        d| _
        | j                  r.	 | j                  j                  ddd       d{    d| _        yy7 # t        j                  $ r Y w xY w7 # t        $ r Y w xY w7 y# t        $ r Y w xY w7 J# t        $ r Y Sw xY ww)z!Clean up session and connections.N)r,   donecancelasyncioCancelledErrorr'   r+   rI   r2   r)   r*   r(   r4   s    r   r3   zMCPClient.disconnect   sP    ::djjoo/JJjj   ==''11$dCCC !DM $D))33D$EEE #'D"DO==mm--dD$??? !DM ) !)) 
 D  F  @ s   AE!D DD E!% D0 D.D0 
E!% E D?E 
E!% E EE 
	E!D D+(E!*D++E!.D0 0	D<9E!;D<<E!?E 	E
E!EE!E 	EE!EE!mcp_auth_valuec                 b    | j                   t        j                  k(  rt        |      }|| _        y)zC
        Set the authentication header for the MCP client.
        N)r"   r   basicr   r&   )r.   rO   s     r   r-   zMCPClient.update_auth_value   s&     >>W]]**>:N-r   r   c                 0   | j                   si S | j                  t        j                  k(  rdd| j                    iS | j                  t        j                  k(  rdd| j                    iS | j                  t        j
                  k(  rd| j                   iS i S )z3Generate authentication headers based on auth type.AuthorizationzBearer zBasic z	X-API-Key)r&   r"   r   bearer_tokenrQ   api_keyr4   s    r   rC   zMCPClient._get_auth_headers   s    ##I>>W111#wt/C/C.D%EFF^^w}},#vd.B.B-C%DEE^^w.!5!566	r   c                   K   | j                   s| j                          d{    | j                   t        d      	 | j                   j                          d{   }|j                  S 7 J7 # t
        j                  $ r | j                          d{  7    t        $ r | j                          d{  7    w xY ww)z%List available tools from the server.NSession is not initialized)	r'   r1   r?   
list_toolstoolsrM   rN   r3   r2   )r.   results     r   rX   zMCPClient.list_tools   s     }},,.  == 9::	==3355F<< !
 6%% 	//### 	//###	sP    CA-CA1 A/A1 ,C/A1 1&CB!C9B<:CCcall_tool_request_paramsc                   K   | j                   s| j                          d{    | j                   t        d      	 | j                   j                  |j                  |j
                         d{   }|S 7 W7 # t        j                  $ r | j                          d{  7    t        $ r | j                          d{  7    w xY ww)z#
        Call an MCP Tool.
        NrW   )name	arguments)
r'   r1   r?   	call_toolr]   r^   rM   rN   r3   r2   )r.   r[   tool_results      r   r_   zMCPClient.call_tool   s      }},,.  == 9::	 $ 7 7-222<< !8 ! K  !
 %% 	//### 	//###	sP    CA:C4A> 3A<4A> 9C<A> >&C$B'%!CC	CC)__name__
__module____qualname____doc__r   httpstrr   r   r   floatr   r/   r5   r1   rI   r3   r-   dictrC   r   MCPToolrX   MCPCallToolRequestParamsMCPCallToolResultr_    r   r   r   r      s     +7+<+<!%$(15// )/ 	/
 SM/ / ~./4
.` !@. .4 $w- "(@	r   r   )!rd   rM   r   datetimer   typingr   r   mcpr   r   mcp.client.sser   mcp.client.stdior	   mcp.client.streamable_httpr
   	mcp.typesr   rj   r   rk   r   ri   litellm.types.mcpr   r   r   r   r   rf   r   r   rl   r   r   <module>ru      sY       ! 4 % ) < G 9 % Ac Ac A
@ @r   