注意!
摘要:随着 CrewAI v1.6+ 版本的演进,官方已移除旧的 MCPServerAdapter,全面转向更优雅的 MCP DSL (领域特定语言) 集成 方式。本文将深度解析 DSL 集成的底层原理,提供开箱即用的实战代码,并重点剖析生产环境中极易踩中的"协议兼容性"与"反爬拦截"等致命坑点,助你打造高可用的企业级 AI Agent 系统。
文章目录
- 注意!
- 一、CrewAi通过Dsl集成Mcp的基础版本导航
- 二、CrewAi通过Dsl集成Mcp的高级配置
-
- 1、Stdio模式
-
- [1.1 客户端(CrewAI)集成配置代码](#1.1 客户端(CrewAI)集成配置代码)
- [1.2 配置参数详解](#1.2 配置参数详解)
- 1.3适用场景
- 2、SSE模式
-
- [2.1 工作原理](#2.1 工作原理)
- [2.2 客户端(CrewAI)集成配置](#2.2 客户端(CrewAI)集成配置)
- [2.3 配置参数详解](#2.3 配置参数详解)
- [2.4 适用场景](#2.4 适用场景)
- [3、Streamable HTTP(双向流式 HTTP)------ 企业级远程服务的首选](#3、Streamable HTTP(双向流式 HTTP)—— 企业级远程服务的首选)
-
- [3.1 工作原理](#3.1 工作原理)
- [3.2 客户端(CrewAI)集成配置](#3.2 客户端(CrewAI)集成配置)
- [3.3 配置参数详解](#3.3 配置参数详解)
一、CrewAi通过Dsl集成Mcp的基础版本导航
二、CrewAi通过Dsl集成Mcp的高级配置
1、Stdio模式
1.1 客户端(CrewAI)集成配置代码
python
from crewai import Agent
from crewai.mcp import MCPServerStdio
agent = Agent(
role="本地数据分析师",
goal="分析本地文件并调用工具",
backstory="...",
mcps=[
MCPServerStdio(
command="python", # 启动命令
args=["server_stdio.py"], # 命令参数
env={"PYTHONUNBUFFERED": "1"}, # 环境变量(可选)
cache_tools_list=True, # 缓存工具列表
# tool_filter=... # 工具过滤(本文暂不展开)
)
]
)
1.2 配置参数详解
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| command | str | ✅ | --- | 启动服务器的命令(如 python、node、uvx) |
| args | liststr | ❌ | \[\] | 命令参数列表 |
| env | str | ❌ | {} | 传递给子进程的环境变量 |
| cache_tools_list | str | ❌ | True | 是否缓存工具列表(提升性能) |
| tool_filter | str | ❌ | None | 静态或动态工具过滤函数 |
1.3适用场景
- 文件系统操作(读取/写入本地目录)
- 本地命令行工具封装(如 git、ffmpeg、kubectl)
- 开发调试阶段(快速验证 MCP 服务逻辑)
- CI/CD 流水线中的自动化任务
- 对网络延迟极度敏感的场景
2、SSE模式
2.1 工作原理
1、客户端通过 HTTP GET 建立 SSE 长连接,服务端持续推送事件(如工具调用结果、资源更新通知)。
2、客户端如需发送请求,通常另开 HTTP POST 通道(或复用 SSE 连接的消息通道)。
3、单向推送能力强大,但双向交互相对笨重,且连接中断后需重新建立。
2.2 客户端(CrewAI)集成配置
python
from crewai import Agent
from crewai.mcp import MCPServerSSE
agent = Agent(
role="实时监控分析师",
goal="监听实时数据流并作出响应",
backstory="...",
mcps=[
MCPServerSSE(
url="http://localhost:8000/sse", # SSE 端点 URL
headers={"Authorization": "Bearer token"}, # 可选认证头
# tool_filter=...
)
]
)
2.3 配置参数详解
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| url | str | ✅ | --- | SSE 服务端点(通常为 /sse) |
| headers | dictstr, str | ❌ | {} | 自定义 HTTP 请求头(如认证信息) |
| tool_filter | Callable | ❌ | None | 工具过滤函数 |
2.4 适用场景
- 实时日志流订阅(如应用监控、错误追踪)
- 低频但需持续推送的场景(如股票价格、天气更新)
- 消息推送服务(通知 Agent 某个事件已发生)
- 需要从服务端主动推送消息给客户端(如触发 Agent 重新规划)
注意:SSE 在负载均衡、断线重连方面不如 Streamable HTTP 成熟,因此更推荐在内部网络或非关键路径中使用。
3、Streamable HTTP(双向流式 HTTP)------ 企业级远程服务的首选
3.1 工作原理
1、基于 HTTP/1.1 或 HTTP/2,客户端使用 POST 请求发送 JSON-RPC 消息,服务端在同一个 HTTP 响应中返回
结果(或分块返回流式数据)。
2、支持 双向通信:客户端可以随时发起新请求,服务端可以在响应中携带多个消息(如中间结果、进度更新)。
3、比 SSE 更灵活,比 WebSocket 更易实现负载均衡,且天然兼容 RESTful 架构。
3.2 客户端(CrewAI)集成配置
基础配置(单服务器):
python
from crewai import Agent
from crewai.mcp import MCPServerHTTP
agent = Agent(
role="高级电商营销分析师",
goal="调用远程工具生成营销报告",
backstory="...",
mcps=[
MCPServerHTTP(
url="http://localhost:8000/mcp", # MCP 端点(通常为 /mcp)
headers={
"Authorization": f"Bearer {API_KEY}",
"X-Tenant-ID": "tenant_001"
},
streamable=True, # 关键:启用 Streamable HTTP
cache_tools_list=True, # 推荐开启
# tool_filter=... # 工具过滤(见下文)
)
]
)
多服务器聚合(企业级微服务):
python
agent = Agent(
role="全能电商助手",
goal="综合使用多个远程服务完成复杂任务",
backstory="...",
mcps=[
# 搜索服务
MCPServerHTTP(
url="https://search.internal/mcp",
headers={"Authorization": f"Bearer {API_KEY}"},
streamable=True,
cache_tools_list=True,
tool_filter=create_static_tool_filter(
allowed_tool_names=["search_products", "get_product_details"]
),
),
# 合规服务
MCPServerHTTP(
url="https://compliance.internal/mcp",
headers={"Authorization": f"Bearer {API_KEY}"},
streamable=True,
cache_tools_list=True,
),
# 分析服务(带租户隔离)
MCPServerHTTP(
url="https://analytics.internal/mcp",
headers={
"Authorization": f"Bearer {API_KEY}",
"X-Tenant-ID": "tenant_001",
"X-Request-ID": "req-12345"
},
streamable=True,
cache_tools_list=True,
)
]
)
动态认证与租户隔离----补充参数(通过 headers 间接控制)
python
headers = {
"Authorization": f"Bearer {os.getenv('JWT_TOKEN')}",
"X-Tenant-ID": current_tenant_id, # 运行时动态获取
"X-User-ID": user_id,
"X-Client-Version": "2.0"
}
3.3 配置参数详解
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| url | str | ✅ | --- | MCP 服务的 HTTP 端点,FastMCP 默认 /mcp。支持 http:// 和 https://。 |
| headers | dictstr, str | ❌ | {} | 自定义请求头,常用于传递认证令牌(Bearer、API Key)、租户 ID、追踪 ID 等。支持动态计算(如从环境变量或上下文获取)。 |
| streamable | bool | ❌ | False | 必须设为 True 以启用 Streamable HTTP。开启后支持双向流式通信(服务端可主动推送中间结果)。设为 False 时回退为普通 HTTP,性能较差且无法接收流式响应。 |
| cache_tools_list | bool | ❌ | True | 启用后,工具列表将被缓存(默认 5~15 分钟),避免每次创建 Agent 都请求 tools/list,显著降低延迟和 API 成本。生产环境强烈建议开启 |
| tool_filter | Callable | ❌ | None | 工具过滤函数,支持静态过滤(create_static_tool_filter)或自定义动态过滤(基于用户角色、权限等)。过滤后的工具仅对当前 Agent 可见,实现细粒度权限控制 |