2525from pyagentspec .adapters .crewai ._types import (
2626 CrewAIAgent ,
2727 CrewAIBaseTool ,
28+ CrewAIHTTPTransport ,
2829 CrewAILlm ,
30+ CrewAIMCPClient ,
31+ CrewAIMCPNativeTool ,
32+ CrewAISSETransport ,
33+ CrewAIStdioTransport ,
2934 CrewAIStructuredTool ,
3035 CrewAITool ,
3136)
3944)
4045from pyagentspec .llms .openaiconfig import OpenAiConfig as AgentSpecOpenAiConfig
4146from pyagentspec .llms .vllmconfig import VllmConfig as AgentSpecVllmModel
47+ from pyagentspec .mcp .clienttransport import ClientTransport as AgentSpecClientTransport
48+ from pyagentspec .mcp .clienttransport import SSETransport as AgentSpecSSETransport
49+ from pyagentspec .mcp .clienttransport import StdioTransport as AgentSpecStdioTransport
50+ from pyagentspec .mcp .clienttransport import (
51+ StreamableHTTPTransport as AgentSpecStreamableHTTPTransport ,
52+ )
53+ from pyagentspec .mcp .tools import MCPTool as AgentSpecMCPTool
4254from pyagentspec .property import Property as AgentSpecProperty
4355from pyagentspec .tools import ServerTool as AgentSpecServerTool
4456from pyagentspec .tools import Tool as AgentSpecTool
@@ -119,6 +131,10 @@ def convert(
119131 agentspec_component = self ._agent_convert_to_agentspec (
120132 crewai_component , referenced_objects
121133 )
134+ elif isinstance (crewai_component , CrewAIMCPClient ):
135+ agentspec_component = self ._mcp_client_convert_to_agentspec (
136+ crewai_component , referenced_objects
137+ )
122138 elif isinstance (crewai_component , CrewAIBaseTool ):
123139 agentspec_component = self ._tool_convert_to_agentspec (
124140 crewai_component , referenced_objects
@@ -175,6 +191,35 @@ def _llm_convert_to_agentspec(
175191
176192 raise ValueError (f"Unsupported type of LLM in Agent Spec: { model_provider } " )
177193
194+ def _mcp_client_convert_to_agentspec (
195+ self , crewai_mcp_client : CrewAIMCPClient , referenced_objects : Dict [str , Any ]
196+ ) -> AgentSpecClientTransport :
197+ crewai_transport = crewai_mcp_client .transport
198+ server_name , server_url , _ = crewai_mcp_client ._get_server_info ()
199+ if isinstance (crewai_transport , CrewAIStdioTransport ):
200+ return AgentSpecStdioTransport (
201+ name = server_name ,
202+ command = crewai_transport .command ,
203+ args = crewai_transport .args ,
204+ env = crewai_transport .env ,
205+ )
206+ elif isinstance (crewai_transport , CrewAIHTTPTransport ):
207+ return AgentSpecStreamableHTTPTransport (
208+ name = server_name ,
209+ url = server_url or "" ,
210+ headers = crewai_transport .headers ,
211+ )
212+ elif isinstance (crewai_transport , CrewAISSETransport ):
213+ return AgentSpecSSETransport (
214+ name = server_name ,
215+ url = server_url or "" ,
216+ headers = crewai_transport .headers ,
217+ )
218+
219+ raise ValueError (
220+ f"Transports of type { type (crewai_transport )} are not yet supported for translation to AgentSpec"
221+ )
222+
178223 def _tool_convert_to_agentspec (
179224 self , crewai_tool : CrewAIBaseTool , referenced_objects : Dict [str , Any ]
180225 ) -> AgentSpecTool :
@@ -189,17 +234,35 @@ def _tool_convert_to_agentspec(
189234 output_json_schema = _get_return_type_json_schema_from_function_reference (
190235 crewai_tool ._run
191236 )
192- # There seem to be no counterparts for client tools and remote tools in CrewAI at the moment
193- return AgentSpecServerTool (
194- name = crewai_tool .name ,
195- description = crewai_tool .description ,
196- inputs = _pydantic_model_to_properties_list (crewai_tool .args_schema ),
197- outputs = [AgentSpecProperty (title = "result" , json_schema = output_json_schema )],
198- )
237+ if isinstance (crewai_tool , CrewAIMCPNativeTool ):
238+ return AgentSpecMCPTool (
239+ name = crewai_tool .original_tool_name ,
240+ description = crewai_tool .description .split ("Tool Description: " )[1 ],
241+ inputs = _pydantic_model_to_properties_list (crewai_tool .args_schema ),
242+ outputs = [AgentSpecProperty (title = "result" , json_schema = output_json_schema )],
243+ client_transport = cast (
244+ AgentSpecClientTransport ,
245+ self .convert (
246+ crewai_tool .mcp_client ,
247+ referenced_objects = referenced_objects ,
248+ ),
249+ ),
250+ )
251+ else :
252+ # There seem to be no counterparts for client tools and remote tools in CrewAI at the moment
253+ return AgentSpecServerTool (
254+ name = crewai_tool .name ,
255+ description = crewai_tool .description ,
256+ inputs = _pydantic_model_to_properties_list (crewai_tool .args_schema ),
257+ outputs = [AgentSpecProperty (title = "result" , json_schema = output_json_schema )],
258+ )
199259
200260 def _agent_convert_to_agentspec (
201261 self , crewai_agent : CrewAIAgent , referenced_objects : Dict [str , Any ]
202262 ) -> AgentSpecAgent :
263+ tools = crewai_agent .tools or []
264+ if crewai_agent .mcps :
265+ tools += crewai_agent .get_mcp_tools (crewai_agent .mcps )
203266 return AgentSpecAgent (
204267 id = str (crewai_agent .id ),
205268 name = crewai_agent .role ,
@@ -214,6 +277,6 @@ def _agent_convert_to_agentspec(
214277 ),
215278 tools = [
216279 cast (AgentSpecTool , self .convert (tool , referenced_objects = referenced_objects ))
217- for tool in ( crewai_agent . tools or [])
280+ for tool in tools
218281 ],
219282 )
0 commit comments