通过 Stdio(标准输入/输出)传输机制,实现 CrewAI 与本地 MCP 服务器的连接

Stdio 传输(Stdio Transport)内容总结

该文档聚焦于如何通过 Stdio(标准输入/输出)传输机制,实现 CrewAI 与本地 MCP 服务器的连接,核心内容可分为概述、核心概念、连接方法及注意事项四部分,具体如下:

一、概述

Stdio 传输是专为 本地 MCP 服务器 设计的通信方式,通过进程间的标准输入(stdin)和输出(stdout)流实现数据交互,适用于 MCP 服务器为脚本或可执行文件、且与 CrewAI 应用运行在 同一台机器 的场景。

二、核心概念

  1. 本地执行(Local Execution):Stdio 传输会管理本地运行的 MCP 服务器进程,所有通信均在本地完成,无需网络传输。
  2. StdioServerParameters 类 :来自 mcp 库的配置类,用于定义启动本地 MCP 服务器的关键参数,包括:
    • command:启动服务器的命令(如 python3);
    • args:命令参数(如服务器脚本路径 ["servers/your_stdio_server.py"]);
    • env:服务器进程的环境变量(如指定 Python 版本 {"UV_PYTHON": "3.12"},或配置 PYTHONPATH)。

三、两种 Stdio 连接方式

文档提供了两种管理 MCP 服务器连接生命周期的方法,分别适用于不同需求场景:

1. 完全托管连接(推荐)

通过 Python 上下文管理器(with 语句) 自动管理连接,无需手动启动/停止服务器进程,安全性和便捷性更高,是大多数场景的首选。

核心逻辑
  • 进入 with 块时:自动启动 MCP 服务器进程,建立连接并加载工具;
  • 退出 with 块时:自动停止服务器进程,释放资源。
关键代码示例
python 复制代码
from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
import os

# 1. 配置本地 MCP 服务器参数
server_params = StdioServerParameters(
    command="python3",  # 启动命令
    args=["servers/your_stdio_server.py"],  # 服务器脚本路径
    env={"UV_PYTHON": "3.12", **os.environ}  # 环境变量
)

# 2. 上下文管理器托管连接,自动启停服务器
with MCPServerAdapter(server_params) as tools:
    # 3. 创建智能体、任务和团队,使用本地 MCP 工具
    research_agent = Agent(
        role="本地数据处理器",
        goal="通过本地 Stdio 工具处理数据",
        backstory="利用本地脚本完成专项任务的 AI",
        tools=tools,  # 加载 MCP 服务器工具
        reasoning=True,
        verbose=True
    )
    processing_task = Task(
        description="处理 data.txt 文件并总结内容",
        expected_output="数据处理总结",
        agent=research_agent,
        markdown=True
    )
    data_crew = Crew(agents=[research_agent], tasks=[processing_task], process=Process.sequential)
    result = data_crew.kickoff()  # 执行任务

2. 手动管理连接生命周期

适用于需要 精细控制服务器启停时机 的场景(如自定义启动条件、复杂错误处理),但需手动调用 API 管理进程,风险较高(需确保资源释放)。

核心要求
  • 必须调用 mcp_server_adapter.stop() 终止服务器进程,避免资源泄漏;
  • 推荐使用 try...finally 块,确保异常场景下仍能停止进程。
关键代码示例
python 复制代码
from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
import os

# 1. 配置服务器参数
stdio_params = StdioServerParameters(
    command="python3",
    args=["servers/your_stdio_server.py"],
    env={"UV_PYTHON": "3.12", **os.environ}
)

mcp_server_adapter = MCPServerAdapter(server_params=stdio_params)

try:
    # 2. 手动启动服务器和连接
    mcp_server_adapter.start()
    tools = mcp_server_adapter.tools  # 加载工具
    
    # 3. 配置智能体、任务并执行
    manual_agent = Agent(role="本地任务执行器", goal="执行手动管理的 Stdio 工具", tools=tools, verbose=True)
    manual_task = Task(description="通过 Stdio 工具执行 perform_analysis 命令", agent=manual_agent)
    manual_crew = Crew(agents=[manual_agent], tasks=[manual_task], process=Process.sequential)
    result = manual_crew.kickoff()

except Exception as e:
    print(f"手动连接出错:{e}")

finally:
    # 4. 无论是否异常,均手动停止服务器(关键步骤)
    if mcp_server_adapter and mcp_server_adapter.is_connected:
        mcp_server_adapter.stop()
        print("手动停止 Stdio MCP 服务器")

四、重要注意事项

  1. 替换占位符 :需将代码中的 servers/your_stdio_server.py 等占位路径/命令,替换为实际的本地 MCP 服务器脚本路径和启动命令;
  2. 环境变量配置StdioServerParametersenv 参数可用于传递服务器所需的配置(如 API 密钥、路径变量),灵活控制服务器行为;
  3. 资源释放优先 :手动管理连接时,stop() 是核心操作,必须在进程结束前调用,否则可能导致僵尸进程占用资源。
相关推荐
Guheyunyi3 分钟前
安全风险监测系统核心技术
运维·网络·人工智能·安全
adnyting39 分钟前
【Linux日新月异(四)】CentOS 7进程管理深度指南:掌控系统生命线
linux·运维·centos
2301_780789662 小时前
WAF如何应对金融领域的网络威胁和黑客攻击
服务器·网络·安全·web安全·金融
未来之窗软件服务2 小时前
幽冥大陆(十七)手机摄像头注册到电脑——东方仙盟炼气期
服务器·智能手机·电脑·服务器运维·东方仙盟·东方仙盟sdk
9ilk2 小时前
【基于one-loop-per-thread的高并发服务器】--- 项目测试
运维·服务器·c++·后端·中间件
property-2 小时前
服务器开荒:安装宝塔面板
运维·服务器
无限进步_2 小时前
【C语言】贪吃蛇游戏设计思路深度解析:从零开始理解每个模块
c语言·开发语言·c++·git·游戏·github·visual studio
艾迪的技术之路2 小时前
linux上gitlab runner部署文档
java·github
教练、我想打篮球3 小时前
05 2个路由器配置dhcp服务器+dhcp中继器配置两个子网的dhcp服务
运维·服务器
adnyting3 小时前
【Linux日新月异(二)】CentOS 7用户与用户组管理深度指南:保障系统安全的基石
linux·运维·centos