CrewAI 接入 MCP 服务器前如何评估可信度并防范工具元数据提示注入
发布时间:2026/9/10 18:43:31 锦皓数字建站

CrewAI 接入 MCP 服务器前如何评估可信度并防范工具元数据提示注入【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI在 CrewAI 中给 Agent 接入 MCPModel Context Protocol服务器后服务器暴露的工具可能执行代码、访问数据或代表你的 Agent 发起请求。CrewAI 官方安全文档的第一条结论是MCP 安全最关键的一点是信任只应连接你完全信任的 MCP 服务器见 MCP Security Considerations。本文解决的问题是在把某个 MCP 服务器配置进 Agent 之前如何按文档逐项评估它的可信度以及如何防范通过工具元数据名称、描述、参数说明发起的提示注入攻击。适用于本地 Stdio 服务器和远程 SSE / Streamable HTTP 服务器两种接入方式。接入前先回答三个信任问题安全文档给出的评估清单是三个问题security.mdxWho operates the server?它是知名可信的服务还是你自己控制的内网服务器What tools does it expose?这些工具如果被攻击者控制、或者服务器本身恶意能被滥用成什么样What data does it access or process?是否有敏感信息会被发给或交由该 MCP 服务器处理文档列出的具体风险有四类可作为评估时的对照项在 Agent 运行所在的机器上执行任意代码尤其当使用Stdio传输且服务器能控制被执行命令时暴露你的 Agent 或其环境中的敏感数据以你未预期的方式操纵 Agent 行为包括代表你发起未授权的 API 调用通过精巧的提示注入技术劫持 Agent 的推理过程。如果 Agent 处理敏感任务或数据文档明确要求避免连接未知或未经验证的 MCP 服务器。理解Model Control Protocol风险元数据注入的攻击路径这是本文要防范的核心攻击文档描述的完整链条是CrewAI Agent 连接 MCP 服务器后通常会请求一份可用工具列表服务器返回每个工具的元数据包括名称、描述和参数描述Agent 底层的 LLM 依赖这份元数据来判断何时、如何使用工具元数据通常会被并入 LLM 的 system prompt 或上下文恶意服务器可以在工具元数据中埋入隐藏或明示的指令构成提示注入诱导 LLM 泄露敏感信息或执行恶意动作。文档特别强调的一点是攻击可以在仅仅连接并列出工具时发生即使 Agent 从未真正调用其中任何一个工具。仅仅暴露给恶意元数据就足以破坏 Agent 行为。因此文档给出的缓解措施也只有一条且被标注为最重要对不可信服务器保持极端谨慎——不要连接你不完全信任的 MCP 服务器。文档没有提供客户端侧过滤元数据的技术手段这条路径上的防御就是接入前的信任评估本身。接入后限制工具暴露面并核对实际加载的工具信任评估通过后仍然建议把 Agent 实际能用的工具收窄到任务需要的最小集合。CrewAI 提供三层控制均来自 MCP overview用#语法只引用指定工具字符串引用方式from crewai import Agent agent Agent( roleResearch Analyst, goalResearch and analyze information, backstoryExpert researcher with access to external tools, mcps[ https://mcp.exa.ai/mcp?api_keyyour_key, # 整台服务器暴露全部工具 https://api.weather.com/mcp#get_forecast, # 只暴露该服务器上的 get_forecast ] )mcps中不带#的地址会拉取服务器全部工具带上#工具名只取指定工具。DSL 集成文档把尽量使用具体工具列为最佳实践理由是获取全部工具效率更低。注意your_key需替换为你自己的 API 密钥文档还建议将密钥放入环境变量而非硬编码import os exa_key os.getenv(EXA_API_KEY) exa_profile os.getenv(EXA_PROFILE) agent Agent( roleSecure Agent, goalUse MCP tools securely, backstorySecurity-conscious agent, mcps[fhttps://mcp.exa.ai/mcp?api_key{exa_key}profile{exa_profile}] )用tool_filter做白名单/黑名单过滤结构化配置方式from crewai import Agent from crewai.mcp import MCPServerStdio from crewai.mcp.filters import create_static_tool_filter agent Agent( roleAdvanced Research Analyst, goalResearch with full control over MCP connections, backstoryExpert researcher with advanced tool access, mcps[ MCPServerStdio( commandnpx, args[-y, modelcontextprotocol/server-filesystem], env{API_KEY: your_key}, tool_filtercreate_static_tool_filter( allowed_tool_names[read_file, list_directory] ), cache_tools_listTrue, ), ] )create_static_tool_filter支持allowed_tool_names白名单与blocked_tool_names黑名单实现位于 filters.py。需要注意两个行为细节allowed_tool_names为None时全部工具放行除非被 block黑名单优先于白名单即同时配置时 blocked 命中即剔除。args、env、工具名需按你自己服务器的实际内容替换。也可以传入动态过滤函数create_dynamic_tool_filter按 Agent 角色等上下文决定是否放行某个工具例如文档示例中对 role 为 Code Reviewer 的 Agent 屏蔽名称含 delete 的工具。先列出实际加载的工具再交给 Agent在正式跑任务前可以先用MCPServerAdapter打印加载到的工具核对是否与预期一致your_server.py、your_token等需替换为你的实际值from crewai_tools import MCPServerAdapter from mcp import StdioServerParameters import os server_params StdioServerParameters( commandpython3, args[servers/your_server.py], env{UV_PYTHON: 3.12, **os.environ}, ) with MCPServerAdapter(server_params, connect_timeout60) as mcp_tools: print(fAvailable tools: {[tool.name for tool in mcp_tools]})也可以用构造参数按名称只取部分工具MCPServerAdapter(server_params, tool_name)。connect_timeout是建立连接的最长等待秒数不指定时默认 30 秒。结合上一节的攻击路径这一步的意义有两面一是核对工具面是否符合预期有没有多出的危险工具二是对未通过信任评估的服务器不要做这一步——因为按文档描述列出工具列表这一动作本身就可能让 LLM 暴露给恶意元数据。按传输方式做对应的安全加固Stdio本地服务器Stdio用于运行在与 CrewAI 应用同机的本地脚本或可执行文件。文档给出的三项要求security.mdx进程隔离确认StdioServerParameters执行的脚本或命令来自可信来源且文件权限适当。恶意的本地 Stdio 脚本同样能伤害本地系统输入净化如果脚本接收来自 Agent 交互的复杂输入脚本自身必须做净化防止命令注入等漏洞资源限制本地 Stdio 进程会消耗本机 CPU/内存确认它不会耗尽系统资源。SSE 与 Streamable HTTP远程服务器必须使用 HTTPS远程 MCP 服务器的 URL 一律使用 HTTPS 加密传输防窃听与中间人攻击。MCPServerAdapter会遵循 URL 中给定的 schemehttp或https防 DNS Rebinding文档将此标为 Critical 级别。攻击者控制的网站可利用 DNS rebinding 绕过同源策略从浏览器环境请求本地网络如localhost或内网上的服务器。缓解措施服务器端校验Origin和/或Host请求头本地开发用的 MCP 服务器绑定127.0.0.1而不是0.0.0.0对服务器启用认证。这一点在 SSE 文档中再次给出同样三条要求认证与最小权限服务器若提供敏感工具或私有数据访问必须实现强认证API key、OAuth token 等MCPServerAdapter使用的凭据应只持有访问所需工具的最小权限通过headers传入例如from crewai.mcp import MCPServerHTTP mcps[ MCPServerHTTP( urlhttps://api.example.com/mcp, headers{Authorization: Bearer your_token}, streamableTrue, cache_tools_listTrue, ), ]留意 OAuth 代理场景Confused Deputy 问题如果某个 MCP 服务器是第三方服务如日历、代码托管平台的代理且对下游使用单一静态client_id攻击者可能利用你浏览器中已有的同意 cookie 跳过再次授权把授权码转给攻击者。作为 CrewAI 用户文档给出的判断依据是当 MCP 服务器多次要求 OAuth 认证、认证出乎意料或索取权限过宽时保持警惕优先选择能清晰区分自身身份与其代理的第三方服务身份的服务器。避免 Token Passthrough服务端若把你发给它的 token可能属于另一个服务不经校验直接透传给下游 API会绕过限流和细粒度权限、破坏审计链。服务器必须校验 token 的 audience 是否就是为它签发的。这条主要是给服务器开发者的约束但对用户而言是筛选服务器实现质量的一条标准。验证接入结果与排查按文档描述接入后的验证与异常判断依据如下overview.mdx、dsl-integration.mdx上一步的print(fAvailable tools: ...)输出即验证手段核对工具名列表是否符合你的白名单预期连接失败被记录为 warningAgent 会继续使用其余可用工具不会崩溃或挂起超时DSL 集成的连接超时为 10 秒、工具执行超时 30 秒、发现discovery超时 15 秒MCPServerAdapter路径默认connect_timeout为 30 秒可通过参数调整未发现任何工具检查服务器 URL 与认证参数确认服务器正在运行且可访问认证失败核对 API key/凭据、查询参数是否正确 URL 编码配置错误无效配置在 Agent 创建时就会抛出验证错误此时不需要等运行阶段才能发现。限制与边界元数据提示注入在文档中没有客户端侧的技术缓解手段唯一给出的缓解是不连接不可信服务器。工具过滤tool_filter、#语法限制的是 Agent 能使用的工具不改变连接时元数据已被暴露这一事实MCPServerAdapter目前只适配 MCP 的tools原语prompts、resources不通过该 adapter 集成工具输出通常按主文本输出.content[0].text处理多模态或复杂输出可能需要自定义处理。完成信任评估、收窄工具面并通过工具列表核对后即可按 Stdio、SSE 或 Streamable HTTP 各篇文档把工具正式交给 Agent 执行任务若使用多个服务器聚合工具可参考 多服务器连接聚合后同样建议先打印核对全部加载的工具名。【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。