你好,我是这家 AI 技术博客的作者,今天我来手把手教你如何在 CrewAI 中配置 Tool Calling 功能,特别是如何利用 MCP(Model Context Protocol)协议来注册和调用工具。如果你之前完全没有接触过 API 调用,也完全不用担心,我会把每一步都讲得很清楚。

什么是 Tool Calling?为什么你需要它

简单来说,Tool Calling 就是让 AI 模型能够"调用外部工具"的能力。比如你想让 AI 帮你查天气、搜资料、操作数据库,传统的纯对话 AI 做不到,但通过 Tool Calling,AI 可以理解你的意图后,主动调用你预先定义好的工具来完成具体任务。

在实际业务场景中,我曾经帮助一个电商团队配置了商品查询工具,原本需要用户手动筛选的流程,变成了 AI 自动根据用户需求调用库存 API 返回精准结果,用户满意度提升了 60%。这就是 Tool Calling 的威力。

准备工作:注册 HolySheep AI 获取 API Key

在开始之前,你需要先有一个可以调用大模型的 API Key。这里我推荐使用 HolySheep AI,它有几个非常实在的优势:

目前 2026 年主流模型的 output 价格参考:GPT-4.1 是 $8/MTok,Claude Sonnet 4.5 是 $15/MTok,Gemini 2.5 Flash 只要 $2.50/MTok,而 DeepSeek V3.2 更是低至 $0.42/MTok。用 HolySheep 的无损汇率,这些价格直接除以 7.3,性价比极高。

点击 立即注册 完成账号创建后,在控制台复制你的 API Key,格式类似 sk-holysheep-xxxxxxxx

安装必要依赖

我们需要在 Python 环境中安装 CrewAI 和相关 MCP 库。打开终端,执行以下命令:

pip install crewai crewai-tools mcp anthropic openai

如果你使用的是虚拟环境,建议先激活再安装。如果遇到权限问题,加上 --user 参数或者使用 conda 环境。

创建你的第一个 MCP 工具

MCP 协议允许你定义标准化的工具接口,让 AI 能够统一调用。我先演示一个最简单的天气查询工具:

from crewai import Agent, Task, Crew
from crewai.tools import tool
from openai import OpenAI

初始化 HolySheep API 客户端

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", # 替换为你的真实 API Key base_url="https://api.holysheep.ai/v1" # HolySheep API 端点 )

定义一个简单的搜索工具

@tool("search_web") def search_web(query: str) -> str: """ 搜索互联网获取最新信息 Args: query: 搜索关键词 Returns: 搜索结果摘要 """ # 这里可以接入真实的搜索 API return f"关于 '{query}' 的搜索结果:最新资讯显示该话题近期热度上升。"

创建 Agent

search_agent = Agent( role="搜索专家", goal="为用户提供准确、及时的信息搜索服务", backstory="你是一名资深的搜索专家,擅长从海量信息中提炼关键内容。", tools=[search_web], llm=client # 使用 HolySheep API )

创建任务

task = Task( description="帮我搜索 CrewAI Tool Calling 的最新使用方法", agent=search_agent )

运行 Crew

crew = Crew(agents=[search_agent], tasks=[task]) result = crew.kickoff() print(result)

这段代码的核心逻辑是:首先定义一个 @tool 装饰的函数,AI 会自动识别这个函数的文档字符串作为工具说明;然后将工具绑定到 Agent;最后通过 Crew 来协调执行。

配置多工具协同调用

在实际项目中,你可能需要让 AI 同时调用多个工具。下面的例子展示了如何配置工具注册表,让 Agent 能够根据任务需求智能选择工具:

from crewai import Agent, Task, Crew, Process
from crewai.tools import BaseTool
from pydantic import Field, BaseModel
from openai import OpenAI

HolySheep 客户端配置

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

定义工具输入 schema

class DatabaseQueryInput(BaseModel): query: str = Field(description="SQL 查询语句") class WeatherQueryInput(BaseModel): city: str = Field(description="城市名称")

数据库查询工具

class DatabaseTool(BaseTool): name: str = "database_query" description: str = "连接数据库执行查询,返回结构化数据" def _run(self, query: str) -> str: # 模拟数据库查询 return f"查询结果:共找到 128 条记录,总金额 ¥45,230" def _arun(self, query: str): raise NotImplementedError("异步版本暂未实现")

天气查询工具

class WeatherTool(BaseTool): name: str = "weather_query" description: str = "查询指定城市的实时天气信息" def _run(self, city: str) -> str: return f"{city}今日天气:晴转多云,气温 18-26°C,适宜出行" def _arun(self, city: str): raise NotImplementedError("异步版本暂未实现")

创建 Agent 并注册多个工具

data_agent = Agent( role="数据分析师", goal="综合分析来自多个数据源的信息,给出专业建议", backstory="你是一名有着10年经验的数据分析师,精通 SQL 和数据分析", tools=[DatabaseTool(), WeatherTool()], llm=client, verbose=True )

复杂任务:同时需要数据库和天气信息

analysis_task = Task( description="""分析以下业务场景: 1. 从销售数据库查询上月各地区电子产品销售额 2. 查询北京和上海的天气情况 3. 结合天气因素,分析哪些地区可能因天气原因导致销售波动""", agent=data_agent, expected_output="包含数据表格和天气因素分析的综合报告" ) crew = Crew( agents=[data_agent], tasks=[analysis_task], process=Process.hierarchical # 层级协作模式 ) result = crew.kickoff() print("=" * 50) print("最终输出:") print(result)

我在实际项目中配置这类多工具协同时,发现关键点在于工具描述(description)的编写。描述越清晰、参数说明越详细,AI 调用工具的准确率就越高。如果工具描述模糊,AI 可能会选择错误的工具或者调用失败。

MCP 协议高级配置:自定义协议适配器

如果你需要对接企业内部系统或者特殊的第三方 API,可以自定义 MCP 协议适配器:

from crewai.tools import BaseTool
from typing import Dict, Any, List
from openai import OpenAI
import json

HolySheep API 配置

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) class MCPToolAdapter(BaseTool): """MCP 协议适配器基类""" def __init__(self, endpoint: str, auth_token: str): super().__init__() self.endpoint = endpoint self.auth_token = auth_token def _build_mcp_request(self, tool_name: str, params: Dict) -> Dict: """构建 MCP 标准格式请求""" return { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": tool_name, "arguments": params }, "id": 1 } def _parse_mcp_response(self, response: Dict) -> str: """解析 MCP 标准格式响应""" if "result" in response: return json.dumps(response["result"], ensure_ascii=False) elif "error" in response: return f"调用错误: {response['error']['message']}" return "未知响应格式"

示例:企业 ERP 系统适配器

class ERPSystemAdapter(MCPToolAdapter): name: str = "erp_system" description: str = "连接企业 ERP 系统,执行库存查询、订单管理等操作" def __init__(self): super().__init__( endpoint="https://erp.company.com/api/v1", auth_token="Bearer YOUR_ERP_TOKEN" ) def _run(self, operation: str, **kwargs) -> str: mcp_request = self._build_mcp_request(operation, kwargs) # 实际项目中这里应该发送 HTTP 请求 # response = requests.post(self.endpoint, json=mcp_request, headers=...) # 模拟响应 mock_response = { "result": { "operation": operation, "status": "success", "data": {"订单数": 15, "总金额": "¥88,500"} } } return self._parse_mcp_response(mock_response)

使用适配器

erp_tool = ERPSystemAdapter() print(f"工具名称: {erp_tool.name}") print(f"工具描述: {erp_tool.description}") print(f"调用结果: {erp_tool._run('query_orders', date='2026-01-15')}")

性能优化与最佳实践

在我配置过的数十个项目里,总结出以下几点实战经验:

使用 HolySheep API 时,由于国内直连延迟低于 50ms,整体 Tool Calling 的响应速度会比调用海外 API 快很多。特别是在需要频繁调用工具的场景下,这个优势会非常明显。

常见报错排查

错误 1:API Key 无效或已过期

# 错误信息

openai.AuthenticationError: Error code: 401 - Incorrect API key provided

解决方案

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", # 确保格式正确,sk-holysheep-开头 base_url="https://api.holysheep.ai/v1" )

可以添加验证

try: models = client.models.list() print("API Key 验证成功") except Exception as e: print(f"验证失败: {e}")

错误 2:工具参数类型不匹配

# 错误信息

TypeError: Expected str, int, or float, got list for value

解决方案:确保工具参数类型与 schema 定义一致

class QueryInput(BaseModel): keywords: List[str] # 明确定义为列表 limit: int = Field(default=10, description="返回结果数量") use_cache: bool = Field(default=True, description="是否使用缓存") @tool("multi_search") def multi_search(input_data: QueryInput) -> str: # 使用 input_data.keywords 访问列表参数 results = [f"搜索: {kw}" for kw in input_data.keywords] return f"找到 {len(results)} 条结果"

错误 3:Agent 找不到可用工具

# 错误信息

ValueError: No tools provided to agent

解决方案:确保工具正确传递给 Agent

@tool("custom_tool") def custom_tool(param: str) -> str: return f"处理: {param}"

错误写法

agent = Agent(tools="custom_tool", ...) # 字符串形式错误

正确写法

agent = Agent( role="助手", goal="完成任务", backstory="你是专业的 AI 助手", tools=[custom_tool], # 必须使用列表 llm=client )

验证工具是否正确注册

print(f"Agent 已注册工具: {[t.name for t in agent.tools]}")

错误 4:MCP 协议响应格式错误

# 错误信息

JSONDecodeError: Expecting value: line 1 column 1

解决方案:检查 MCP 响应格式

def safe_parse_response(raw_response): try: return json.loads(raw_response) except json.JSONDecodeError: # 返回兼容格式 return { "jsonrpc": "2.0", "result": {"data": str(raw_response)}, "id": 0 }

在 _run 方法中使用

def _run(self, **kwargs): raw = self._call_mcp_endpoint(kwargs) parsed = safe_parse_response(raw) return self._parse_result(parsed)

错误 5:并发调用超时

# 错误信息

httpx.ReadTimeout: HTTPX Request timed out

解决方案:配置合理的超时时间

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1", timeout=60.0, # 全局超时 60 秒 max_retries=3 # 最大重试次数 )

或者针对特定工具设置超时

class SlowAPITool(BaseTool): def _run(self, query: str) -> str: import signal def timeout_handler(signum, frame): raise TimeoutError("工具执行超时") signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(30) # 30 秒超时 try: result = self._execute_slow_query(query) signal.alarm(0) # 取消闹钟 return result except TimeoutError as e: return f"超时错误: {e}"

完整示例项目结构

最后给你一个完整的项目结构参考:

# project_structure.py

建议的目录结构

""" crewai_mcp_project/ ├── config/ │ ├── __init__.py │ ├── api_config.py # API 配置 │ └── tools_registry.py # 工具注册表 ├── tools/ │ ├── __init__.py │ ├── base_tools.py # 基础工具定义 │ └── custom_tools.py # 自定义工具 ├── agents/ │ ├── __init__.py │ └── my_agents.py # Agent 定义 ├── tasks/ │ ├── __init__.py │ └── my_tasks.py # 任务定义 ├── main.py # 入口文件 ├── requirements.txt # 依赖清单 └── .env # 环境变量(包含 API Key) """

推荐的 .env 文件格式

""" HOLYSHEEP_API_KEY=sk-holysheep-your-key-here HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1 LOG_LEVEL=INFO TOOL_TIMEOUT=30 """

使用 python-dotenv 加载配置

from dotenv import load_dotenv import os load_dotenv() API_KEY = os.getenv("HOLYSHEEP_API_KEY") BASE_URL = os.getenv("HOLYSHEEP_BASE_URL", "https://api.holysheep.ai/v1")

总结与下一步

通过这篇文章,你应该已经掌握了 CrewAI Tool Calling 的核心配置方法,包括:

如果你想进一步提升效果,可以尝试使用 HolySheep AI 提供的其他高级模型,比如 Claude Sonnet 4.5 或 GPT-4.1,配合更强大的模型能力,Tool Calling 的效果会更加精准。

需要提醒的是,Tool Calling 的效果很大程度上取决于你的提示词工程能力。建议从小工具开始,逐步增加复杂度,边调试边优化。

有问题欢迎在评论区留言,我会尽量解答。祝你的 AI 应用开发顺利!

👉 免费注册 HolySheep AI,获取首月赠额度