Ë
    A²Xj¯=  ã                  ó`  — d Z ddlmZ ddlZddlZddlmZ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mZmZmZ ddlmZ d
dlmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( d
dl)m*Z+ g d¢Z, e-h d£«      Z. G d„ de/«      Z0 G d„ de1«      Z2d%d„Z3d&d„Z4 G d„ de5«      Z6ddœ	 	 	 	 	 d'd„Z7ddœ	 	 	 	 	 d(d„Z8ddœ	 	 	 	 	 d)d„Z9ddœ	 	 	 	 	 d*d„Z:	 	 	 	 d+d „Z;d,d!„Z<ddddddd"œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d#„Z=ddddddd"œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.d$„Z>y# e$ rZ ed	«      e‚dZ[ww xY w)/aG  Helpers for integrating MCP (Model Context Protocol) SDK types with the Anthropic SDK.

These helpers reduce boilerplate when converting between MCP types and Anthropic API types.

Usage::

    from anthropic.lib.tools.mcp import mcp_tool, async_mcp_tool, mcp_message

This module requires the ``mcp`` package to be installed.
é    )ÚannotationsN)ÚAnyÚIterable)Úurlparse)ÚLiteral)
ÚToolÚTextContentÚContentBlockÚImageContentÚPromptMessageÚCallToolResultÚEmbeddedResourceÚReadResourceResultÚBlobResourceContentsÚTextResourceContents)ÚClientSessionz~The `mcp` package is required to use MCP helpers. Install it with: pip install anthropic[mcp]. Requires Python 3.10 or higher.é   )ÚBetaBase64PDFSourceParamÚBetaPlainTextSourceParamÚBetaBase64ImageSourceParamÚBetaCacheControlEphemeralParamé   )Ú	ToolErrorÚBetaFunctionToolÚBetaAsyncFunctionToolÚBetaFunctionToolResultTypeÚ	beta_toolÚbeta_async_toolé   )Ú
tag_helper)ÚContent)Úmcp_toolÚasync_mcp_toolÚmcp_contentÚmcp_messageÚmcp_resource_to_contentÚmcp_resource_to_fileÚUnsupportedMCPValueError>   ú	image/gifú	image/pngú
image/jpegú
image/webpc                  ó   — e Zd ZdZy)Ú_TaggedDictzçA dict subclass that can carry a ``_stainless_helper`` attribute.

    Behaves identically to a regular dict for serialization and isinstance checks,
    but allows attaching tracking metadata that won't appear in JSON output.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú]/var/www/html/content_generation/venv/lib/python3.12/site-packages/anthropic/lib/tools/mcp.pyr.   r.   J   s   „ òr5   r.   c                  ó   — e Zd ZdZy)Ú_TaggedTuplezBA tuple subclass that can carry a ``_stainless_helper`` attribute.Nr/   r4   r5   r6   r8   r8   R   s   „ ÚLr5   r8   c                ó   — | t         v S ©N)Ú_SUPPORTED_IMAGE_TYPES©Ú	mime_types    r6   Ú_is_supported_image_typer>   V   s   € ØÔ.Ð.Ð.r5   c                óX   — | d u xs% | j                  d«      xs | dk(  xs t        | «      S )Nútext/úapplication/pdf)Ú
startswithr>   r<   s    r6   Ú _is_supported_resource_mime_typerC   Z   s?   € à�TÐò 	/Ø×Ñ Ó(ò	/àÐ)Ñ)ò	/ô $ IÓ.ð	r5   c                  ó   — e Zd ZdZy)r(   zURaised when an MCP value cannot be converted to a format supported by the Claude API.Nr/   r4   r5   r6   r(   r(   h   s   „ Ú_r5   r(   ©Úcache_controlc               ó&  — t        | t        «      r-t        d| j                  dœ«      }|�||d<   t	        |d«       |S t        | t
        «      rpt        | j                  «      st        d| j                  › �«      ‚t        dt        d| j                  | j                  ¬«      d	œ«      }|�||d<   t	        |d«       |S t        | t        «      rt        | j                  |¬
«      S t        | dt        | «      j                   «      }t        d|› �«      ‚)zÕConvert a single MCP content block to an Anthropic content block.

    Handles text, image, and embedded resource content types.
    Raises :class:`UnsupportedMCPValueError` for audio and resource_link types.
    Útext)ÚtyperH   rF   r$   zUnsupported image MIME type: ÚimageÚbase64©rI   ÚdataÚ
media_type©rI   ÚsourcerE   rI   zUnsupported MCP content type: )Ú
isinstancer	   r.   rH   r    r   r>   ÚmimeTyper(   r   rM   r   Ú_resource_contents_to_blockÚresourceÚgetattrrI   r0   )ÚcontentrF   ÚblockÚimage_blockÚcontent_types        r6   r$   r$   q   s  € ô �'œ;Ô'Ü V°W·\±\ÑBÓCˆØÐ$Ø%2ˆE�/Ñ"Ü�5˜-Ô(Øˆä�'œ<Ô(Ü'¨×(8Ñ(8Ô9Ü*Ð-JÈ7×K[ÑK[ÐJ\Ð+]Ó^Ð^Ü!àÜ4Ø!Ø Ÿ™Ø&×/Ñ/ôñó	
ˆð Ð$Ø+8ˆK˜Ñ(Ü�; Ô.ØÐä�'Ô+Ô,Ü*¨7×+;Ñ+;È=ÔYÐYô ˜7 F¬D°«M×,BÑ,BÓC€LÜ
"Ð%CÀLÀ>Ð#RÓ
SÐSr5   c               ó  — | j                   }|�lt        |«      rat        | t        «      st	        d| j
                  › �«      ‚t        dt        d| j                  |¬«      dœ«      }|�||d<   t        |d«       |S |dk(  rat        | t        «      st	        d	| j
                  › �«      ‚t        d
t        d| j                  d¬«      dœ«      }|�||d<   t        |d«       |S |�|j                  d«      rzt        | t        «      r| j                  }n.t        j                  | j                  «      j!                  d«      }t        d
t#        d|d¬«      dœ«      }|�||d<   t        |d«       |S t	        d|› d| j
                  › �«      ‚)z<Convert MCP resource contents to an Anthropic content block.z3Image resource must have blob data, not text. URI: rJ   rK   rL   rO   rF   r&   rA   z1PDF resource must have blob data, not text. URI: Údocumentr@   úutf-8rH   z
text/plainzUnsupported MIME type "z" for resource: )rR   r>   rQ   r   r(   Úurir.   r   Úblobr    r   rB   r   rH   rK   Ú	b64decodeÚdecoder   )rT   rF   r=   rX   Ú	pdf_blockrM   Ú
text_blocks          r6   rS   rS   œ   sº  € ð ×!Ñ!€Ið ÐÔ!9¸)Ô!DÜ˜(Ô$8Ô9Ü*Ð-`Ðai×amÑamÐ`nÐ+oÓpÐpÜ!àÜ4Ø!Ø!Ÿ™Ø(ôñó	
ˆð Ð$Ø+8ˆK˜Ñ(Ü�;Ð 9Ô:ØÐð Ð%Ò%Ü˜(Ô$8Ô9Ü*Ð-^Ð_g×_kÑ_kÐ^lÐ+mÓnÐnÜà"Ü2Ø!Ø!Ÿ™Ø0ôñó	
ˆ	ð Ð$Ø)6ˆI�oÑ&Ü�9Ð7Ô8ØÐð Ð˜I×0Ñ0°Ô9Ü�hÔ 4Ô5Ø—=‘=‰Dä×#Ñ# H§M¡MÓ2×9Ñ9¸'ÓBˆDÜ à"Ü2ØØØ+ôñó	
ˆ
ð Ð$Ø*7ˆJ�Ñ'Ü�:Ð8Ô9ØÐä
"Ð%<¸Y¸KÐGWÐX`×XdÑXdÐWeÐ#fÓ
gÐgr5   c               óz   — t        | j                  t        | j                  |¬«      gdœ«      }t	        |d«       |S )zCConvert an MCP prompt message to an Anthropic ``BetaMessageParam``.rE   )ÚrolerV   r%   )r.   rd   r$   rV   r    )ÚmessagerF   Úresults      r6   r%   r%   ç   s<   € ô à—L‘LÜ# G§O¡OÀ=ÔQÐRñ	
ó€Fô ˆv�}Ô%Ø€Mr5   c               ó,  — | j                   st        d«      ‚t        d„ | j                   D «       d«      }|€M| j                   D �cg c]  }|j                  €Œ|j                  ‘Œ }}t        ddj	                  |«      › �«      ‚t        ||¬«      S c c}w )z£Convert MCP resource contents to an Anthropic content block.

    Finds the first resource with a supported MIME type from the result's
    ``contents`` list.
    ú6Resource contents array must contain at least one itemc              3  óL   K  — | ]  }t        |j                  «      sŒ|–— Œ y ­wr:   )rC   rR   )Ú.0Úcs     r6   Ú	<genexpr>z*mcp_resource_to_content.<locals>.<genexpr>
  s   è ø€ ÐT‘OˆqÔ'GÈÏ
É
Õ'SŒ‘Oùs   ‚$�$Nz>No supported MIME type found in resource contents. Available: z, rE   )Úcontentsr(   ÚnextrR   ÚjoinrS   )rf   rF   Ú	supportedrk   Ú
mime_typess        r6   r&   r&   ü   s”   € ð �?Š?Ü&Ð'_Ó`Ð`äÙT�F—O’OÓTØó€Ið ÐØ*0¯/ª/ÓT©/ Q¸Q¿Z¹ZÑ=S�a—j“j¨/ˆ
ÐTÜ&ØLÈTÏYÉYÐWaÓMbÐLcÐdó
ð 	
ô ' yÀÔNÐNùò Us   ÁBÁBc                ó¶  — | j                   st        d«      ‚| j                   d   }t        |j                  «      }t	        |«      j
                  }|r|j                  dd«      d   nd}t        |t        «      r t        j                  |j                  «      }n|j                  j                  d«      }t        |||j                  f«      }t!        |d«       |S )	zµConvert MCP resource contents to a file tuple for ``files.upload()``.

    Returns a ``(filename, content_bytes, mime_type)`` tuple compatible with
    the SDK's ``FileTypes``.
    rh   r   Ú/r   éÿÿÿÿNr\   r'   )rm   r(   Ústrr]   r   ÚpathÚrsplitrQ   r   rK   r_   r^   rH   Úencoder8   rR   r    )rf   rT   Úuri_strrv   ÚnameÚcontent_bytesÚ
file_tuples          r6   r'   r'     s»   € ð �?Š?Ü&Ð'_Ó`Ð`à�‰˜qÑ!€HÜ�(—,‘,Ó€Gô �GÓ×!Ñ!€DÙ&*ˆ4�;‰;�s˜AÓ˜rÒ"°€Dô �(Ô0Ô1Ü×(Ñ(¨¯©Ó7‰à Ÿ™×,Ñ,¨WÓ5ˆä˜t ]°H×4EÑ4EÐFÓG€JÜˆzÐ1Ô2ØÐr5   c                ó:  — | j                   r,t        | j                  D �cg c]  }t        |«      ‘Œ c}«      ‚| j                  s+| j                  �t        j                  | j                  «      S | j                  D �cg c]  }t        |«      ‘Œ c}S c c}w c c}w )zQConvert MCP ``CallToolResult`` to a value suitable for returning from ``call()``.)ÚisErrorr   rV   r$   ÚstructuredContentÚjsonÚdumps)rf   Úitems     r6   Ú_convert_tool_resultrƒ   8  s~   € à‡~‚~Ü°v·~²~ÓF±~¨tœ TÕ*°~ÑFÓGÐGð �>Š>˜f×6Ñ6ÐBÜ�z‰z˜&×2Ñ2Ó3Ð3à*0¯.ª.Ó9©. $ŒK˜Õ¨.Ñ9Ð9ùò Gùò :s    BÁ>B)rF   Údefer_loadingÚallowed_callersÚeager_input_streamingÚinput_examplesÚstrictc               ó¦   ‡‡
‡— ddl Š
| j                  Šdˆ
ˆˆfd„}t        |‰| j                  | j                  ||||||¬«
      }	t        |	d«       |	S )a  Convert an MCP tool to a sync runnable tool for ``tool_runner()``.

    Example::

        from anthropic.lib.tools.mcp import mcp_tool

        tools_result = await mcp_client.list_tools()
        runner = client.beta.messages.tool_runner(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            tools=[mcp_tool(t, mcp_client) for t in tools_result.tools],
            messages=[{"role": "user", "content": "Use the available tools"}],
        )

    Args:
        tool: An MCP tool definition from ``client.list_tools()``.
        client: The MCP ``ClientSession`` used to call the tool.
        cache_control: Cache control configuration.
        defer_loading: If true, tool will not be included in initial system prompt.
        allowed_callers: Which callers may use this tool.
        eager_input_streaming: Enable eager input streaming for this tool.
        input_examples: Example inputs for the tool.
        strict: When true, guarantees schema validation on tool names and inputs.
    r   Nc                 óh   •— ‰j                   j                  ‰j                  ‰| «      }t        |«      S r:   )Úfrom_threadÚrunÚ	call_toolrƒ   )Úkwargsrf   ÚanyioÚclientÚ	tool_names     €€€r6   Úcall_mcpzmcp_tool.<locals>.call_mcps  s.   ø€ Ø×"Ñ"×&Ñ& v×'7Ñ'7¸ÀFÓKˆÜ# FÓ+Ð+r5   ©	rz   ÚdescriptionÚinput_schemarF   r„   r…   r†   r‡   rˆ   r"   ©rŽ   r   Úreturnr   )Úanyio.from_threadrz   r   r”   ÚinputSchemar    )Útoolr�   rF   r„   r…   r†   r‡   rˆ   r’   rf   r�   r‘   s    `        @@r6   r"   r"   I  s^   ú€ óL à—	‘	€I÷,ô ØØØ×$Ñ$Ø×%Ñ%Ø#Ø#Ø'Ø3Ø%Øô€Fô ˆv�zÔ"Ø€Mr5   c               óš   ‡‡
— | j                   Š
dˆˆ
fd„}t        |‰
| j                  | j                  ||||||¬«
      }	t	        |	d«       |	S )a  Convert an MCP tool to an async runnable tool for ``tool_runner()``.

    Example::

        from anthropic.lib.tools.mcp import async_mcp_tool

        tools_result = await mcp_client.list_tools()
        runner = await client.beta.messages.tool_runner(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            tools=[async_mcp_tool(t, mcp_client) for t in tools_result.tools],
            messages=[{"role": "user", "content": "Use the available tools"}],
        )

    Args:
        tool: An MCP tool definition from ``client.list_tools()``.
        client: The MCP ``ClientSession`` used to call the tool.
        cache_control: Cache control configuration.
        defer_loading: If true, tool will not be included in initial system prompt.
        allowed_callers: Which callers may use this tool.
        eager_input_streaming: Enable eager input streaming for this tool.
        input_examples: Example inputs for the tool.
        strict: When true, guarantees schema validation on tool names and inputs.
    c               ›  ó\   •K  — ‰j                  ‰| ¬«      ƒ d {  –—† }t        |«      S 7 Œ­w)N)rz   Ú	arguments)r�   rƒ   )rŽ   rf   r�   r‘   s     €€r6   r’   z async_mcp_tool.<locals>.call_mcp¯  s0   øè ø€ Ø×'Ñ'¨YÀ&Ð'ÓI×IˆÜ# FÓ+Ð+ð Jús   ƒ,š*›,r“   r"   r–   )rz   r   r”   r™   r    )rš   r�   rF   r„   r…   r†   r‡   rˆ   r’   rf   r‘   s    `        @r6   r#   r#   ‡  s[   ù€ ðL —	‘	€Iö,ô ØØØ×$Ñ$Ø×%Ñ%Ø#Ø#Ø'Ø3Ø%Øô€Fô ˆv�zÔ"Ø€Mr5   )r=   ru   r—   Úbool)r=   z
str | Noner—   rž   )rV   r
   rF   ú%BetaCacheControlEphemeralParam | Noner—   ÚBetaContent)rT   z+TextResourceContents | BlobResourceContentsrF   rŸ   r—   r    )re   r   rF   rŸ   r—   zdict[str, Any])rf   r   rF   rŸ   r—   r    )rf   r   r—   z$tuple[str | None, bytes, str | None])rf   r   r—   r   )rš   r   r�   r   rF   rŸ   r„   úbool | Noner…   úolist[Literal['direct', 'code_execution_20250825', 'code_execution_20260120', 'code_execution_20260521']] | Noner†   r¡   r‡   ú"Iterable[dict[str, object]] | Nonerˆ   r¡   r—   zBetaFunctionTool[Any])rš   r   r�   r   rF   rŸ   r„   r¡   r…   r¢   r†   r¡   r‡   r£   rˆ   r¡   r—   zBetaAsyncFunctionTool[Any])?r3   Ú
__future__r   r€   rK   Útypingr   r   Úurllib.parser   Útyping_extensionsr   Ú	mcp.typesr   r	   r
   r   r   r   r   r   r   r   Úmcp.client.sessionr   ÚImportErrorÚ_errÚ
types.betar   r   r   r   Ú_beta_functionsr   r   r   r   r   r   Ú_stainless_helpersr    Ú'types.beta.beta_tool_result_block_paramr!   r    Ú__all__Ú	frozensetr;   Údictr.   Útupler8   r>   rC   Ú	Exceptionr(   r$   rS   r%   r&   r'   rƒ   r"   r#   r4   r5   r6   Ú<module>rµ      sq  ðñ	õ #ã Û ß  Ý !Ý %ð÷÷ ÷ õ 1÷ó ÷÷ õ ,Ý Mò€ñ #Ò#YÓZÐ ô�$ô ôM�5ô Mó/óô`˜yô `ð <@ñ(TØð(Tð 9ð(Tð ó	(Tð\ <@ñChØ9ðChð 9ðChð ó	Chð\ <@ñØðð 9ðð ó	ð0 <@ñOØðOð 9ðOð ó	Oð4Øðà)óóD	:ð* <@Ø!%ð Ø)-Ø9=Øñ;Ø
ð;àð;ð 9ð	;ð
 ð;ðð;ð 'ð;ð 7ð;ð ð;ð ó;ðD <@Ø!%ð Ø)-Ø9=Øñ9Ø
ð9àð9ð 9ð	9ð
 ð9ðð9ð 'ð9ð 7ð9ð ð9ð  ô9øðI ò Ù
ð 	Ióàðûðús   ¦D ÄD-Ä	D(Ä(D-