
    ~hi                     f   U d Z ddlmZmZmZmZ ddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZmZ eeeeeedZeeef   ed	<    G d
 de      Zedk(  rQddlmZ ddlmZ  e edddg       e             5 Z ee        eed   j?                  d             ddd       yy# 1 sw Y   yxY w)zThis module implements the CrewAI adapter.

CrewAI tools support only sync functions for their tools.

Example Usage:
>>> with MCPAdapt(StdioServerParameters(command="uv", args=["run", "src/echo.py"]), CrewAIAdapter()) as tools:
>>>     print(tools)
    )AnyCallable	CoroutineTypeN)BaseTool)	BaseModel)ToolAdapter)create_model_from_json_schemaresolve_refs_and_remove_defs)stringnumberintegerbooleanobjectarrayjson_type_mappingc                      e Zd ZdZdeedz  gej                  j                  f   dej                  j                  de
fdZdeedz  geeeej                  j                  f   f   dej                  j                  defdZy)	CrewAIAdaptera  Adapter for `crewai`.

    Note that `crewai` support only sync tools so we write adapt for sync tools only.

    Warning: if the mcp tool name is a python keyword, starts with digits or contains
    dashes, the tool name will be sanitized to become a valid python function name.

    funcNmcp_toolreturnc                     t        j                        _        t        j                         G fddt              } |       S )zAdapt a MCP tool to a CrewAI tool.

        Args:
            func: The function to adapt.
            mcp_tool: The MCP tool to adapt.

        Returns:
            A CrewAI tool.
        c                       e Zd ZU W j                  Zeed<   W j                  xs dZeed<   W  Zee	   ed<   de
de
de
ffdZd	 Zy
)*CrewAIAdapter.adapt.<locals>.CrewAIMCPToolname descriptionargs_schemaargskwargsr   c                 j   i }	j                   j                  di       }|j                         D ]c  \  }}|W||v rS||   }t        |j                  d      t              rd|d   v s8|||<   >d|v sCt        d |d   D              sY|||<   _|||<   e  |      j                  d   j                  S )N
propertiestypenullanyOfc              3   D   K   | ]  }|j                  d       dk(    yw)r#   r$   N)get).0opts     S/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/mcpadapt/crewai_adapter.py	<genexpr>zBCrewAIAdapter.adapt.<locals>.CrewAIMCPTool._run.<locals>.<genexpr>P   s%      #$' !$6 9#s    r   )inputSchemar'   items
isinstancelistanycontenttext)
selfr   r    filtered_kwargsschema_propertieskeyvalueprop_schemar   r   s
           r*   _runz/CrewAIAdapter.adapt.<locals>.CrewAIMCPTool._runA   s    24$,$8$8$<$<\2$N!"(,,. 5JC}0A)A&7&< &koof&=tD%V)<<7< 4$3" #+6w+?#   8= 4 05,#5& O,44Q7<<<    c                     t        j                  | j                  j                               j	                         D ci c]  \  }}|dk7  r|| }}}d| j
                   d| d| j                   | _        y c c}}w )Nz$defszTool Name: z
Tool Arguments: z
Tool Description: )jsonrefreplace_refsr   model_json_schemar-   r   r   )r3   kvr   s       r*   _generate_descriptionz@CrewAIAdapter.adapt.<locals>.CrewAIMCPTool._generate_description[   s     !( 4 4((::<!eg	1 G|	 qD  &1;Mk]Znosoo  oA  $B s   A9N)__name__
__module____qualname__r   str__annotations__r   r   r   r   r   r9   rA   )	ToolInputr   r   s   r*   CrewAIMCPToolr   <   sT     D#%'339rK9+4Ki4=# = = =4Br:   rH   )r   r,   r
   r   )r3   r   r   rH   rG   s    `` @r*   adaptzCrewAIAdapter.adapt+   sG      <H<P<PQ1(2F2FG	'	B '	BH '	BR r:   afuncc                     K   t        d      w)Nz/async is not supported by the CrewAI framework.)NotImplementedError)r3   rJ   r   s      r*   async_adaptzCrewAIAdapter.async_adaptg   s     
 ""STTs   )rB   rC   rD   __doc__r   dictmcptypesCallToolResultToolr   rI   r   r   rM    r:   r*   r   r   !   s    :t}cii&>&>>?: ))..: 
	:xUyc399;S;S1S'TTUU ))..U 
	Ur:   r   __main__)StdioServerParameters)MCPAdaptuvrunzsrc/echo.py)commandr   hello)r2   ) rN   typingr   r   r   r   r<   rP   crewai.toolsr   pydanticr   mcpadapt.corer	   mcpadapt.utils.modelingr
   r   rE   floatintboolrO   r/   r   rF   r   rB   rV   rW   toolsprintrY   rT   r:   r*   <module>rf      s    2 1  
 !  % & 4T	? KUK KU\ z)&	d%1GH
 * 
eeAhlll()* * 
* *s   9$B''B0