ó
    |¤jì,  ã                  ón   • S r SSKJr  SSKrSSKrSSKJr  SSKJrJ	r	  SS/r
S\S	.rS
rSr " S S5      rg)aR  MCP stdio transport client.

Speaks newline-delimited JSON-RPC 2.0 to a local MCP server subprocess
over stdin/stdout. Mirrors the SSE ``MCPClient`` interface (initialize /
list_tools / list_prompts / call_tool / close plus ``tools``, ``prompts``
and ``last_error`` attributes) so ``cli/mcp.py`` can use either transport
interchangeably.
é    )ÚannotationsN)Ú__version__)ÚMCP_PROTOCOL_VERSIONÚMCPErrorÚStdioMCPClientr   Úacli)ÚnameÚversiong      @iô  c                  óÖ   • \ rS rSrSr  S     SS jjrSS jrSS jrSS jrSS jr	SS	 jr
SS
 jr S     SS jjr S     SS jjrSS jrSS jrSS jrSS jrS S jrSrg)!r   é   a)  MCP client that drives a local server over stdio.

The server process is spawned with ``command`` + ``args``; requests
and responses are single-line JSON documents. A background reader
matches response ids to pending request futures; server notifications
(messages without an ``id``) are ignored.
Nc                óâ   • U(       d  [        S5      eXl        [        U=(       d    / 5      U l        X0l        / U l        / U l        SU l        S U l        S U l	        0 U l
        SU l        SU l        g )Nz#stdio MCP server requires a commandÚ r   )r   ÚcommandÚlistÚargsÚtimeoutÚtoolsÚpromptsÚ
last_errorÚ_procÚ_reader_taskÚ_pendingÚ_request_idÚ_stderr_tail)Úselfr   r   r   s       Ú¦C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\dashscope/acli/mcp_stdio.pyÚ__init__ÚStdioMCPClient.__init__#   sh   € ö ÜÐ@ÓAÐAØŒÜ˜Ÿ Ó$ˆŒ	ØŒØ!#ˆŒ
Ø#%ˆŒØˆŒØ8<ˆŒ
Ø15ˆÔØ35ˆŒØˆÔØˆÕó    c              ƒ  óò  #   •  [         R                  " U R                  /U R                  Q7[         R                  R
                  [         R                  R
                  [         R                  R
                  S.6I Sh  v•N U l        [         R                  " U R                  5       5      U l        [        0 [        [        5      S.n U R!                  SU5      I Sh  v•N nSU;   aC  US   nUR)                  S[%        U5      5      nS	U 3U l	        U R'                  5       I Sh  v•N   g U R+                  S
5      I Sh  v•N   g NÈ! [        [        4 a  nSU 3U l	         SnAgSnAff = f N‘! ["         a3  n[%        U5      U l	        U R'                  5       I Sh  v•N     SnAgSnAff = f N‹ Nr! ["         a3  n[%        U5      U l	        U R'                  5       I Sh  v•N     SnAgSnAff = f7f)z3Spawn the server, run the MCP initialize handshake.)ÚstdinÚstdoutÚstderrNzFailed to start MCP server: F)ÚprotocolVersionÚcapabilitiesÚ
clientInfoÚ
initializeÚerrorÚmessagezMCP initialize failed: znotifications/initializedT)ÚasyncioÚcreate_subprocess_execr   r   Ú
subprocessÚPIPEr   ÚOSErrorÚ
ValueErrorr   Úcreate_taskÚ
_read_loopr   r   ÚdictÚ_CLIENT_INFOÚ_requestr   ÚstrÚcloseÚgetÚ_notify)r   ÚexcÚparamsÚrespr(   r)   s         r   r'   ÚStdioMCPClient.initialize:   s¬  é € ð
	Ü&×=Ò=Ø—‘ð à—‘ñ ô ×(Ñ(×-Ñ-Ü×)Ñ)×.Ñ.Ü×)Ñ)×.Ñ.ò ÷ ˆDŒJô $×/Ò/°·±Ó0AÓBˆÔô  4ØÜœ|Ó,ñ
ˆð
	ØŸ™ |°VÓ<×<ˆDð
 �d‹?Ø˜‘MˆEØ—i‘i 	¬3¨u«:Ó6ˆGØ 7¸°yÐAˆDŒOØ—*‘*“,×ÐØð	Ø—,‘,Ð:Ó;×;Ð;ð
 ñIøô œÐ$ó 	Ø <¸S¸EÐBˆDŒOÜûð	úñ =øÜó 	Ü! #›hˆDŒOØ—*‘*“,×ÑÜûð	úñ ñ <øÜó 	Ü! #›hˆDŒOØ—*‘*“,×ÑÜûð	üsß   ‚G7„A;E
 Á?EÂ 	E
 Â	A G7Ã
E3 ÃE1Ã E3 Ã$AG7Ä'F3Ä(G7Ä.F7 ÅF5ÅF7 ÅG7ÅE
 Å
E.Å
E)Å$G7Å)E.Å.G7Å1E3 Å3
F0Å=#F+Æ F#Æ!F+Æ&G7Æ+F0Æ0G7Æ5F7 Æ7
G4Ç#G/Ç$G'Ç%G/Ç*G7Ç/G4Ç4G7c              ƒ  ó6  #   • U R                  S5        U R                  (       aN  U R                  R                  5       (       d/  U R                  R                  5          U R                  I Sh  v•N   SU l        U R                  nSU l        Uc  gUR                  (       a:  UR                  R                  5       (       d   UR                  R                  5         UR                  c0   [        R                  " UR                  5       [         S9I Sh  v•N   U R+                  U5      I Sh  v•N   g NÄ! [        R
                  [        4 a     NÞf = f! [        [        4 a     N‹f = f NV! [        R"                   a“     UR%                  5         [        R                  " UR                  5       [         S9I Sh  v•N     N«! [        R"                  [&        [        4 a-     UR)                  5           NÞ! [&        [        4 a       Nòf = ff = ff = f Né7f)z7Stop the reader, close stdin, terminate the subprocess.zconnection closedN©r   )Ú_fail_all_pendingr   ÚdoneÚcancelr*   ÚCancelledErrorÚ	Exceptionr   r!   Ú
is_closingr6   r.   ÚRuntimeErrorÚ
returncodeÚwait_forÚwaitÚ_CLOSE_TIMEOUTÚTimeoutErrorÚ	terminateÚProcessLookupErrorÚkillÚ_drain_stderr)r   Úprocs     r   r6   ÚStdioMCPClient.closec   s»  é € à×ÑÐ2Ô3Ø×× T×%6Ñ%6×%;Ñ%;×%=Ñ%=Ø×Ñ×$Ñ$Ô&ðØ×'Ñ'×'Ð'ð !ˆÔà�z‰zˆØˆŒ
Ø‰<ØØ�:�:˜dŸj™j×3Ñ3×5Ñ5ðØ—
‘
× Ñ Ô"ð �?‰?Ñ"ðÜ×&Ò& t§y¡y£{¼NÑK×KÐKð × Ñ  Ó&×&Ñ&ñ; (øÜ×*Ñ*¬IÐ6ó Ùðûô œ\Ð*ó Ùðúñ LøÜ×'Ñ'ó ð
Ø—N‘NÔ$Ü!×*Ò*ØŸ	™	›Ü .ñ÷ ó øô  ×,Ñ,Ô.@Ä'ÐJó ðØŸ	™	ŸøÜ.´Ð8ó Ûðúðúðúñ 	'ùsñ   ‚AHÁD5 Á.D3Á/D5 Á3AHÃE ÃHÃ**E- ÄE+ÄE- ÄHÄ-HÄ.HÄ3D5 Ä5EÅHÅEÅHÅE(Å%HÅ'E(Å(HÅ+E- Å-HÆ:GÆ<F?Æ=GÇHÇHÇ$G7Ç4HÇ5HÇ7HÈHÈHÈ	HÈHÈHÈHÈHc              ƒ  ó  #   • U R                  S5      I S h  v•N nSU;   a.  US   nUR                  S[        U5      5      n[        SU 35      eUR                  S0 5      nUR                  S/ 5      U l        U R                  $  Nm7f)Nz
tools/listr(   r)   ztools/list failed: Úresultr   )r4   r7   r5   r   r   )r   r;   r(   r)   rR   s        r   Ú
list_toolsÚStdioMCPClient.list_tools‹   s~   é € Ø—]‘] <Ó0×0ˆØ�d‹?Ø˜‘MˆEØ—i‘i 	¬3¨u«:Ó6ˆGÜÐ0°°	Ð:Ó;Ð;Ø—‘˜( BÓ'ˆØ—Z‘Z ¨Ó,ˆŒ
Ø�z‰zÐñ 1ùs   ‚B—B˜A.Bc              ƒ  óà   #   •  U R                  S5      I Sh  v•N nSU;   a  / $ UR                  S0 5      nUR                  S/ 5      U l        U R                  $  NA! [         a    / s $ f = f7f)z5Discover prompts/skills; returns [] when unsupported.zprompts/listNr(   rR   r   )r4   r   r7   r   )r   r;   rR   s      r   Úlist_promptsÚStdioMCPClient.list_prompts•   sm   é € ð	ØŸ™ ~Ó6×6ˆDð �d‹?ØˆIØ—‘˜( BÓ'ˆØ—z‘z )¨RÓ0ˆŒØ�|‰|Ðñ 7øÜó 	ØŠIð	üs7   ‚A.„A ˜A™A �=A.ÁA ÁA+Á(A.Á*A+Á+A.c           	   ƒ  ó8  #   • XS.nU R                  SU5      I S h  v•N nSU;   a%  US   nUR                  S[        U5      5      nSU 3$ UR                  S0 5      nUR                  S/ 5      n/ n	U H}  n
[        U
[        5      (       aA  U
R                  S5      S	:X  a,  U	R                  [        U
R                  S	S
5      5      5        MY  U	R                  [        R                  " U
SS95        M     U	(       a  SR                  U	5      $ [        U5      $  Nû7f)N)r	   Ú	argumentsz
tools/callr(   r)   zMCP Error: rR   ÚcontentÚtypeÚtextr   F©Úensure_asciiÚ
)	r4   r7   r5   Ú
isinstancer2   ÚappendÚjsonÚdumpsÚjoin)r   Ú	tool_namerY   r:   r;   r(   r)   rR   rZ   ÚpartsÚitems              r   Ú	call_toolÚStdioMCPClient.call_tool¡   sñ   é € Ø#Ñ<ˆØ—]‘] <°Ó8×8ˆØ�d‹?Ø˜‘MˆEØ—i‘i 	¬3¨u«:Ó6ˆGØ   	Ð*Ð*Ø—‘˜( BÓ'ˆØ—*‘*˜Y¨Ó+ˆØˆÛˆDÜ˜$¤×%Ñ%¨$¯(©(°6Ó*:¸fÓ*DØ—‘œS §¡¨&°"Ó!5Ó6Ö7à—‘œTŸZšZ¨¸5ÑAÖBñ	 ö
 $)ˆt�y‰y˜ÓÐ9¬c°&«kÐ9ñ 9ùs   ‚DœD�C<Dc                óD   • U =R                   S-  sl         U R                   $ )Né   )r   )r   s    r   Ú_next_idÚStdioMCPClient._next_idµ   s   € Ø×Ò˜AÑÕØ×ÑÐr   c              ƒ  ó‚  #   • U R                   nUb  UR                  c  [        S5      eU R                  5       nSUU=(       d    0 US.n[        R
                  " 5       R                  5       nX`R                  U'    U R                  U5      I Sh  v•N    [        R                  " X`R                  S9I Sh  v•N $  N+! [         a    U R                  R                  US5        e f = f N1! [        R                   a=    U R                  R                  US5        SU SU R                  S S	3n[        U5      Sef = f7f)
z/Send a request and await the matching response.Nú!stdio MCP client is not connectedú2.0)ÚjsonrpcÚmethodr:   Úidr>   zMCP request 'z' timed out after ÚgÚs)r   r!   r   rl   r*   Úget_running_loopÚcreate_futurer   Ú_writeÚpoprG   r   rJ   )r   rr   r:   rO   Úreq_idÚpayloadÚfuturer)   s           r   r4   ÚStdioMCPClient._request¹   s,  é € ð �z‰zˆØ‰<˜4Ÿ:™:Ñ-ÜÐ>Ó?Ð?Ø—‘“ˆàØØ—l Øñ	
ˆô ")×!9Ò!9Ó!;×!IÑ!IÓ!KˆØ &�‰�fÑð	Ø—+‘+˜gÓ&×&Ð&ð	.Ü ×)Ò)¨&¿,¹,ÑG×GÐGñ 'øÜó 	Ø�M‰M×Ñ˜f dÔ+Øð	úñ HøÜ×#Ñ#ó 	.Ø�M‰M×Ñ˜f dÔ+à ˜xÐ'=¸d¿l¹lÈ1Ð=MÈQÐOð ô ˜7Ó#¨Ð-ð	.üsU   ‚A9D?Á<B> ÂB<ÂB> Â!C+ Â7C)Â8C+ Â;D?Â<B> Â>(C&Ã&D?Ã)C+ Ã+AD<Ä<D?c              ƒ  óÀ   #   • U R                   b  U R                   R                  c  [        S5      eSUS.nU(       a  X#S'   U R                  U5      I Sh  v•N   g N7f)z2Send a notification (no id, no response expected).Nro   rp   )rq   rr   r:   )r   r!   r   rx   )r   rr   r:   r{   s       r   r8   ÚStdioMCPClient._notifyÙ   sS   é € ð �:‰:Ñ §¡×!1Ñ!1Ñ!9ÜÐ>Ó?Ð?Ø#¨vÑ6ˆÞØ &�HÑØ�k‰k˜'Ó"×"Ó"ùs   ‚AAÁAÁAc              ƒ  óŠ  #   • U R                   nUb  UR                  c  [        S5      e[        R                  " USS9S-   n UR                  R                  UR                  S5      5        UR                  R                  5       I S h  v•N   g  N! [        [        [        [        4 a  n[        SU 35      UeS nAff = f7f)Nro   Fr]   r_   úutf-8zMCP server process is gone: )r   r!   r   rb   rc   ÚwriteÚencodeÚdrainÚConnectionResetErrorÚBrokenPipeErrorr.   rE   )r   r{   rO   Úliner9   s        r   rx   ÚStdioMCPClient._writeæ   s¬   é € Ø�z‰zˆØ‰<˜4Ÿ:™:Ñ-ÜÐ>Ó?Ð?Ü�zŠz˜'°Ñ6¸Ñ=ˆð	Ø�J‰J×Ñ˜TŸ[™[¨Ó1Ô2Ø—*‘*×"Ñ"Ó$×$Ó$øä ÜÜÜð	
ó 	ô Ø.¨s¨eÐ4óàðûð	üs=   ‚A CÁAB Â
BÂB ÂCÂB ÂC Â,B;Â;C Ã Cc              ƒ  óp  #   • U R                   nUb  UR                  c  g  UR                  R                  5       I Sh  v•N nU(       d#  U R                  SU R	                  5       -   5        gUR                  SSS9R                  5       nU(       d  Mt   [        R                  " U5      n[        U[        5      (       d  M¢  UR                  S
5      nUc  M¸  U R                  R!                  US5      nUb&  UR#                  5       (       d  UR%                  U5        Mþ   Nà! [        R                   a>    U R                  S-   U-   S-   [        * S U l
        SUSS	  3nU R                  U5         gf = f! [&        R(                   a    e [*         a  nU R                  SU 35         SnAgSnAff = f7f)z4Read stdout lines and resolve pending futures by id.NzMCP server closed stdoutr�   Úreplace©Úerrorsz
non-JSON: r_   z!MCP server sent non-JSON output: éd   rs   zMCP stdio stream error: )r   r"   Úreadliner?   Ú_stderr_suffixÚdecodeÚstriprb   ÚloadsÚJSONDecodeErrorr   Ú_STDERR_TAILr`   r2   r7   r   ry   r@   Ú
set_resultr*   rB   rC   )	r   rO   Úrawr‡   Úmsgr)   Úmsg_idr|   r9   s	            r   r1   ÚStdioMCPClient._read_loopø   s£  é € à�z‰zˆØ‰<˜4Ÿ;™;Ñ.Øð$	EØØ ŸK™K×0Ñ0Ó2×2�ÞØ×*Ñ*Ø2°T×5HÑ5HÓ5JÑJôð Ø—z‘z '°)�zÐ<×BÑBÓD�ÞÙðÜŸ*š* TÓ*�Cô " #¤t×,Ñ,ÙØŸ™ ›�Ø‘>ÙØŸ™×*Ñ*¨6°4Ó8�ØÑ%¨f¯k©k¯m©mØ×%Ñ% cÔ*ñ? Ù2øô ×+Ñ+ó ð
 ×)Ñ)¨LÑ8¸4Ñ?À$ÑFÜ#�m�nð)&�DÔ%ð <¸tÀDÀS¸z¸lÐKð ð ×*Ñ*¨7Ô3Ùðûô( ×%Ñ%ó 	ØÜó 	EØ×"Ñ"Ð%=¸c¸UÐ#C×DÑDûð	Eüsk   ‚F6¡E7 ¿D Á -E7 Á-F6Á.'E7 ÂD" Â,A5E7 Ä"AE4Å1E7 Å2F6Å3E4Å4E7 Å7F3ÆF.Æ)F6Æ.F3Æ3F6c                óº   • U R                   0 so l         UR                  5        H4  nUR                  5       (       a  M  UR                  [	        U5      5        M6     g ©N)r   Úvaluesr@   Úset_exceptionr   )r   ÚreasonÚpendingr|   s       r   r?   Ú StdioMCPClient._fail_all_pending#  sA   € Ø!%§¡°Ðˆ”Ø—n‘nÖ&ˆFØ—;‘;—=“=Ø×$Ñ$¤X¨fÓ%5Ö6ò 'r   c              ƒ  óf  #   • UR                   c  g  [        R                  " UR                   R                  [        5      SS9I S h  v•N nU(       a;  UR                  SSS9R                  5       nU R                  U-   [        * S  U l        g g  NG! [        R                  [        4 a     g f = f7f)Ng      ð?r>   r�   rŠ   r‹   )
r#   r*   rG   Úreadr”   r�   r‘   r   rJ   r.   )r   rO   Údatar\   s       r   rN   ÚStdioMCPClient._drain_stderr)  s¥   é € Ø�;‰;ÑØð		Ü ×)Ò)Ø—‘× Ñ ¤Ó.Øñ÷ ˆDö Ø—{‘{ 7°9�{Ð=×CÑCÓE�Ø%)×%6Ñ%6¸Ñ%=Ä¸}¸~Ð$N�Õ!ð ñ	øô ×$Ñ$¤gÐ.ó 	Ùð	üs;   ‚B1’5B ÁBÁAB ÂB1ÂB ÂB.Â+B1Â-B.Â.B1c                óT   • U R                   R                  5       nU(       a  SU S3$ S$ )Nz
 (stderr: Ú)r   )r   r‘   )r   Útails     r   r�   ÚStdioMCPClient._stderr_suffix7  s,   € Ø× Ñ ×&Ñ&Ó(ˆÞ'+�˜D˜6 Ð#Ð3°Ð3r   )r   r   r   r   r   r   r   r   r   r   r   )Ng      >@)r   r5   r   zlist[str] | Noner   Úfloat)ÚreturnÚbool)rª   ÚNone)rª   z
list[dict])re   r5   rY   r2   rª   r5   )rª   Úintr›   )rr   r5   r:   údict | Nonerª   r2   )rr   r5   r:   r®   rª   r¬   )r{   r2   rª   r¬   )rž   r5   rª   r¬   )rO   zasyncio.subprocess.Processrª   r¬   )rª   r5   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r'   r6   rS   rV   rh   rl   r4   r8   rx   r1   r?   rN   r�   Ú__static_attributes__© r   r   r   r      s¸   † ñð "&Øð	àðð ðð õ	ô.'ôR#'ôPô
ô:ô( ð #ð.àð.ð ð.ð 
õ	.ðF #ð#àð#ð ð#ð 
õ	#ôô$)EôV7ô÷4r   )r³   Ú
__future__r   r*   rb   Údashscope.aclir   Ú$dashscope.acli.platforms.bailian.mcpr   r   Ú__all__r3   rI   r”   r   rµ   r   r   Ú<module>rº      sE   ðñõ #ã Û å &ß Oà˜ZÐ
(€à¨;Ñ7€Ø€Ø€÷_4ò _4r   