XjDzUdZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z m Z mZddlZddlZddlmZdd lmZmZddlZdd lm Z dd lmZmZmZmZmZdd lmZdd lm Z ddl!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(GddeZ)GddeZ*e e)ze*zZ+e e,d<eGddZ-GddZ.y)a* SessionGroup concurrently manages multiple MCP session connections. Tools, resources, and prompts are aggregated across servers. Servers may be connected to or disconnected from at any point after initialization. This abstractions can handle naming collisions using a custom user-provided hook. N)Callable) dataclass) timedelta) TracebackType)Any TypeAliasoverload) BaseModel)Self deprecated)types)ElicitationFnT ListRootsFnT LoggingFnTMessageHandlerFnT SamplingFnT) sse_client)StdioServerParameters)streamable_http_client)create_mcp_http_client)McpError) ProgressFnTcVeZdZUdZeed<dZeeefdzed<dZ e ed<dZ e ed<y) SseServerParametersz(Parameters for intializing a sse_client.urlNheaderstimeout,sse_read_timeout) __name__ __module__ __qualname____doc__str__annotations__rdictrrfloatr l/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/mcp/client/session_group.pyrr#s>2 H&*GT#s(^d ")GU%e$r*rceZdZUdZeed<dZeeefdzed<e dZ e ed<e dZ e ed <d Z e ed <y) StreamableHttpParametersz4Parameters for intializing a streamable_http_client.rNr)secondsrrr Tterminate_on_close)r!r"r#r$r%r&rr'rrrr r0boolr)r*r+r-r-3sU> H&*GT#s(^d ")#2.GY.#,F";i; $#r*r-ServerParametersceZdZUdZdZedzed<dZedzed<dZ e dzed<dZ e dzed<dZ edzed<dZedzed<dZej&dzed <y) ClientSessionParametersz>Parameters for establishing a client session to an MCP server.Nread_timeout_secondssampling_callbackelicitation_callbacklist_roots_callbacklogging_callbackmessage_handler client_info)r!r"r#r$r5rr&r6rr7rr8rr9rr:rr;r Implementationr)r*r+r4r4KszH-1)d*1,0{T)026.4/6/3,3*.j4'.04O&-4/3K%%,3r*r4ceZdZUdZGddeZeeejfe d<eeejfe d<eeejfe d<ee jefe d<eee jfe d<ej e d <ee jej fe d <eeej$gefZee d <ed ze d < d2dej d zded zdd fdZdefdZdeed zded zded zded zfdZedee jfdZedeeejffdZ edeeejffdZ!edeeejffdZ"e# d2d ddedeee$fde%d zde&d zd eee$fd zdejNf d!Z(e#e)d"d d d d#ded$eee$fde%d zde&d zd eee$fd zdejNf d%Z( d3d d d&dedeee$fd zde%d zde&d zd eee$fd zd$eee$fd zdejNfd'Z(d(e jdd fd)Z*d*ej$d(e jde jfd+Z+ d4d,e,d-e-d zde jfd.Z.d,e,d-e-de/ej$e jffd/Z0d*ej$d(e jdd fd0Z1ded*ej$defd1Z2y )5ClientSessionGroupaClient for managing connections to multiple MCP servers. This class is responsible for encapsulating management of server connections. It aggregates tools, resources, and prompts from all connected servers. For auxiliary handlers, such as resource subscription, this is delegated to the client and can be accessed via the session. Example Usage: name_fn = lambda name, server_info: f"{(server_info.name)}_{name}" async with ClientSessionGroup(component_name_hook=name_fn) as group: for server_param in server_params: await group.connect_to_server(server_param) ... cleZdZUdZeZeeed<eZeeed<eZ eeed<y)"ClientSessionGroup._ComponentNamesz*Used for reverse index to find components.prompts resourcestoolsN) r!r"r#r$setrAr%r&rBrCr)r*r+_ComponentNamesr@js58ES!!e 3s8#%s3xr*rE_prompts _resources_tools _sessions_tool_to_session _exit_stack_session_exit_stacks_ComponentNameHookN_component_name_hook exit_stackcomponent_name_hookreturnci|_i|_i|_i|_i|_|!t j |_d|_n||_d|_i|_ ||_ y)zInitializes the MCP client.NTF) rHrGrFrIrJ contextlibAsyncExitStackrK_owns_exit_stackrLrN)selfrOrPs r+__init__zClientSessionGroup.__init__sg   "  )88:D $(D !)D $)D !$&!$7!r*cnK|jr"|jjd{|S7wN)rUrK __aenter__rVs r+rZzClientSessionGroup.__aenter__s1  ""--/ / /  0s *535 _exc_type_exc_val_exc_tbclK|jr"|jjd{tj4d{}|j j D]}|j|jdddd{y7l7Q7 #1d{7swYyxYww)z?Closes session exit stacks and main exit stack upon completion.N)rUrKacloseanyiocreate_task_grouprLvalues start_soon)rVr\r]r^tgrOs r+ __aexit__zClientSessionGroup.__aexit__s  ""))+ + +**, 1 1"77>>@ 1  j//0 1 1 1 1 , 1 1 1 1 1sW*B4BB4 B B4 ;B B4BB4B4B4B1%B( &B1-B4cHt|jjS)z+Returns the list of sessions being managed.)listrIkeysr[s r+sessionszClientSessionGroup.sessionssDNN'')**r*c|jS)z8Returns the prompts as a dictionary of names to prompts.)rFr[s r+rAzClientSessionGroup.promptss}}r*c|jS)z%>%B%B7%K "(//1 1 1 # 1s%B E  ,E 9AE ?E EE  server_infocFK|j||d{|S7wz Connects to a single MCP server.N)_aggregate_components)rVrrys r+connect_with_sessionz'ClientSessionGroup.connect_with_sessions(((g>>> ?s !! server_paramssession_paramscK|j||xs td{\}}|j||d{S7!7wr)_establish_sessionr4r)rVrrrrys r+connect_to_serverz$ClientSessionGroup.connect_to_serversK &*%<%<]NLw^u^w%xx W..{GDDD yDs!"A AA AA A c Ktj} t|tr3t j |}|j |d{\}}nt|trTt|j|j|j|j}|j |d{\}}nt|jtj|jj!|jj!}|j |d{t#|j||j$}|j |d{\}}}|j t j&|||j(|j*|j,|j.|j0|j2|j4 d{} | j7d{} ||j8| <|j:j |d{| j<| fS77777g7Q7!#t>$r|jAd{7wxYww)z,Establish a client session to an MCP server.N)rrrr )read)rr)r http_clientr0)r5r6r7r8r9r:r;)!rSrT isinstancermcp stdio_cliententer_async_contextrrrrrr rhttpxTimeout total_secondsrr0 ClientSessionr5r6r7r8r9r:r; initializerLrK serverInfo Exceptionr`) rVrr session_stackclientrwrite httpx_client_ryresults r+rz%ClientSessionGroup._establish_session$sB#113 : -)>?))-8$1$E$Ef$MM eM+>?#%)))11)11%2%C%C  %2$E$Ef$MM e5)11!MM%--;;=*;;IIK  $77 EEE/%)) ,'4'G'G (5'H'H'P!PeQ)==!!)7)L)L&4&F&F)7)L)L(6(J(J%3%D%D$2$B$B . : :   G#--//F2?D % %g .""66}E E E$$g- -cNNF"Q 0 F  &&( ( (   sI>9IIA$I6I 7A8I/I 0:I*I+A>I)I*II1I3I4II>I I IIIIII;3I64I;;I>c<K|j}i}i}i}i} |jd{j}|D]>} |j| j|} | || <|jj | @ |jd{j} | D]>} |j| j|} | || <|jj | @ |jd{j}|D]C}|j|j|} ||| <||| <|jj | E t|||fs |j|=|j|j jz}|r1t t#j$t"j&|d|j|j(jz}|r1t t#j$t"j&|d|j|j*jz}|r1t t#j$t"j&|d||j,|<|j j/||j(j/||j*j/||j0j/|y7#t $r#} tjd| Yd} ~ d} ~ wwxYw7#t $r#} tjd| Yd} ~ yd} ~ wwxYw7m#t $r#} tjd| Yd} ~ ?d} ~ wwxYww) z>Aggregates prompts, resources, and tools from a given session.NzCould not fetch prompts: zCould not fetch resources: zCould not fetch tools: z already exist in group prompts.r|z" already exist in group resources.z already exist in group tools.)rE list_promptsrA_component_nameroaddrloggingwarninglist_resourcesrB list_toolsrCanyrLrirFr rrrGrHrIupdaterJ)rVrryr prompts_tempresources_temp tools_temptool_to_session_temprApromptroerrrBresourcerCtoolmatching_promptsmatching_resourcesmatching_toolss r+rz(ClientSessionGroup._aggregate_componentshsU ..013 46,. =? ?$1133<))'2(,,.1C1C1EE --/00PQ  ,002T__5I5I5KK --122TU  $*T[[-=-=-?? ---..LM #2w \* ~. :& $$%9:C4  ? OO7u= > > ? 8  A OO9#? @ @ A 0  = OO5cU; < < =sNL LAL NL;L8AL;(N*M-=M*>AM-F2NL L5L0*N0L55N8L;; M'M"N"M''N*M-- N6NNNNcB|jr|j||S|SrY)rN)rVrors r+rz"ClientSessionGroup._component_names#  $ $,,T;? ? r*)NN)NNNrY)3r!r"r#r$r rEr'r%r Promptr&ResourceToolrrrSrTrr<rMrrWr rZtype BaseExceptionrr1rfpropertyrhrjrArBrCr rrrCallToolResultrsr rrr2r4rtuplerrrr)r*r+r>r>Xs" ) 3 $%%S%..()) ejj !!C%%6773 1 1122***s00*2K2KKLL %-c53G3G-H#-M$N N,t338<9=8--480$68  8,$ 1 &-1 $&1% 1  1"+$s001++c5<</04U^^ 34tCO, 2604 #'+##S>#($. # '- #38nt##   ##NO 2604&*##38n # ($. # '- #38nt##   #P#,01504  '+&*  S>D( ($.  '-  38nt# 38nt#     *#2C4E4E#2$#2J //:=:K:K  :>E'E0$6E   EB'B0B u##S%6%66 7 BHR;u7K7KR;VYVgVgR;lpR;hCe6J6Jsr*r>)/r$rSrcollections.abcr dataclassesrdatetimerr rtypingrrr rarpydanticr typing_extensionsr r rmcp.client.sessionrrrrrmcp.client.ssermcp.client.stdiormcp.client.streamable_httprmcp.shared._httpx_utilsrmcp.shared.exceptionsrmcp.shared.sessionrrr-r2r&r4r>r)r*r+rs$!++ . gg%2=:** %) % $y$&46IILdd)d   4 4  4ggr*