🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

CrewAI + Scrapeless: 为您的代理团队提供实时网络数据

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

21-Jul-2026

CrewAI团队的效用仅取决于其代理能够访问的工具。给一个研究代理仅提供一个语言模型,它将自信地描述一个它从未打开过的页面。

将该团队连接到Scrapeless MCP服务器修复了输入端:代理获得浏览器控制、页面抓取、Google搜索和Google趋势作为普通的CrewAI工具,而渲染、代理路由和反检测则留在服务器上。本指南将端到端运行连接,并展示工具列表、参数模式,以及真实调用返回的Markdown内容。

此设置为您的团队提供的功能

您的代理通过一次连接获得21个可调用工具。Scrapeless MCP服务器通过可流式传输的HTTP公开这些工具,而crewai-tools将每一个工具转化为任何代理都可以持有的标准CrewAI BaseTool

这些工具分为三组:

  • 页面检索scrape_markdownscrape_htmlscrape_screenshot获取一个URL并以您要求的格式返回。
  • 实时浏览器控制 — 十六个browser_*工具创建一个会话,然后在其中点击、输入、滚动、导航、等待和快照。
  • 搜索表面google_searchgoogle_trends

由于工作发生在服务器端,团队流程保持简小。没有本地浏览器需要安装,没有代理池需要管理,也没有驱动版本需要与Chrome版本保持一致。

为什么选择Scrapeless MCP服务器

模型上下文协议规范定义了客户端如何发现和调用服务器上的工具,这使得一次连接比手工编写的封装更有价值:工具列表、参数模式及结果信封都来自服务器,而不是硬编码在您的项目中。调用以JSON-RPC 2.0消息的形式进行,因此请求和响应格式是一个发布的标准,而不是供应商约定。

Scrapeless发布了一个托管端点,因此无需运行服务器。传输是可流式传输的HTTP,协议的HTTP机制,认证是单个头部。CrewAI代理所需的一切是一个字典。相同的密钥也支持Scrapeless抓取浏览器,这是browser_*工具驱动的云浏览器,每个工具的参数引用存放在Scrapeless文档中。

先决条件

  • Python 3.10或更高版本。crewaicrewai-tools目前都声明为>=3.10,<3.14
  • 来自仪表板的Scrapeless API密钥。
  • 您的团队运行的任何LLM的模型提供者密钥。CrewAI默认为OpenAI并读取OPENAI_API_KEY

注意:以下示例是在没有模型提供者密钥的情况下使用Scrapeless密钥执行的。MCP连接、工具发现、参数模式、工具调用和代理附加都实时运行。最终的crew.kickoff()调用是一个先决条件缺口——它需要一个模型密钥,文章标记了该步骤,而不是显示虚构的输出。

安装

bash Copy
pip install "crewai==1.15.4" "crewai-tools[mcp]==1.15.4"

[mcp]额外拉入mcp客户端库和mcpadapt,这是将MCP工具定义转换为框架本地工具的层。

如果您的环境已经携带OpenTelemetry栈,请像下面一样一起安装这两个包,而不是一个一个安装。crewai锁定opentelemetry-sdk~=1.42,部分升级的导出器集在您的代码运行之前会导致导入错误。

在您的shell中设置密钥:

bash Copy
export SCRAPELESS_API_KEY="your_api_key_here"

通过可流式传输的HTTP连接

MCPServerAdapter接受一个描述服务器的字典。headers条目携带Scrapeless API密钥:

python Copy
import os
from crewai_tools import MCPServerAdapter

server_params = {
    "url": "https://api.scrapeless.com/mcp",
    "transport": "streamable-http",
    "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}

with MCPServerAdapter(server_params) as tools:
    names = sorted(t.name for t in tools)
    print(f"tool count: {len(names)}")
    for n in names:
        print("  -", n)

运行它会列出服务器实际提供的内容:

text Copy
tool count: 21
  - browser_click
  - browser_close
  - browser_create
  - browser_get_html
  - browser_get_text
  - browser_go_back
  - browser_go_forward
  - browser_goto
  - browser_press_key
  - browser_screenshot
  - browser_scroll
  - browser_scroll_to
  - browser_snapshot
  - browser_type
  - browser_wait
  - browser_wait_for
  - google_search
  - google_trends
  - scrape_html
  - scrape_markdown
  - scrape_screenshot

两个值得注意的细节。名称是平的——没有服务器前缀或点分命名空间,因此 scrape_markdown 是代理将调用的字面字符串。而上下文管理器很重要:它在进入时打开会话,在退出时关闭会话,这就是为什么适配器被编写成 with 块而不是裸构造函数的原因。

只赋予代理所需的工具

将所有 21 种工具交给每个代理让模型的工作变得更困难,而不是更简单。MCPServerAdapter 在服务器字典后接受工具名称,只返回那些工具:

python Copy
import os
from crewai_tools import MCPServerAdapter

server_params = {
    "url": "https://api.scrapeless.com/mcp",
    "transport": "streamable-http",
    "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}

with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
    print("过滤后的工具:", [t.name for t in tools])
    for t in tools:
        schema = getattr(t, "args_schema", None)
        fields = list(schema.model_fields) if schema else "n/a"
        print(f"  {t.name} 参数: {fields}")
text Copy
过滤后的工具: ['scrape_markdown', 'google_search']
  scrape_markdown 参数: ['url']
  google_search 参数: ['q', 'hl', 'gl']

参数模式来自服务器,因此它们是真正的合同:scrape_markdown 需要一个 url,而 google_search 需要一个查询及语言和国家代码。一个只需要读取页面和运行搜索的研究代理恰好获取两个工具,而没有浏览器会话表面可供滥用。

准备将其接入自己的团队了吗?创建一个免费的 Scrapeless 账户并用您的仪表板密钥进行连接。

将工具附加到团队

工具直接进入 Agent 构造函数,代理进入具有其任务的 Crew

python Copy
import os
from crewai import Agent, Task, Crew
from crewai_tools import MCPServerAdapter

server_params = {
    "url": "https://api.scrapeless.com/mcp",
    "transport": "streamable-http",
    "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}

with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
    analyst = Agent(
        role="网络研究分析师",
        goal="将公共页面转化为清晰的 markdown 以供后续分析。",
        backstory="与公共网络来源合作,并返回结构化笔记。",
        tools=tools,
        verbose=False,
    )
    print("代理工具:", [t.name for t in analyst.tools])

    task = Task(
        description="获取 https://quotes.toscrape.com/js/ 并总结出现的作者。",
        expected_output="在页面上找到的作者名称列表。",
        agent=analyst,
    )
    crew = Crew(agents=[analyst], tasks=[task], verbose=False)
    print("团队代理:", len(crew.agents), "| 团队任务:", len(crew.tasks))
text Copy
代理工具: ['scrape_markdown', 'google_search']
团队代理: 1 | 团队任务: 1

代理持有服务器提供的工具,团队也组建完成。到目前为止,所有内容仅依赖于 Scrapeless 密钥。

注意:crew.kickoff() 是需要模型提供者密钥的下一步。如果没有设置 OPENAI_API_KEY,CrewAI 在第一次模型调用之前会引发 ValueError: OPENAI_API_KEY is required,因此运行结果被显示为您添加的行,而不是捕获到的输出。

python Copy
    result = crew.kickoff()
    print(result)

工具调用返回的内容

直接调用工具是查看返回形状的最快方式,而无需消耗模型令牌。scrape_markdown 接收 URL 并返回 markdown:

python Copy
import os
from crewai_tools import MCPServerAdapter

server_params = {
    "url": "https://api.scrapeless.com/mcp",
    "transport": "streamable-http",
    "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}

with MCPServerAdapter(server_params, "scrape_markdown") as tools:
    tool = list(tools)[0]
    md = tool.run(url="https://quotes.toscrape.com/js/")
    text = md if isinstance(md, str) else str(md)
    print("markdown 字符数:", len(text))
    print("包含爱因斯坦:", "Einstein" in text)
    print("前 180 个字符:", text[:180].replace("\n", " "))
text Copy
markdown 字符数: 1580
包含爱因斯坦: True
前 180 个字符: 响应:  "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)\n\n“我们创造的世界是我们思维的过程。它可以

目标页面在浏览器中构建其引用列表,而不是在初始 HTML 中发送,引用仍然出现在 markdown 中——服务器在转换之前就已渲染该页面。这就是基于真实基础设施的 MCP 工具与简单 HTTP 获取之间的实际区别:代理请求一个页面,并获得用户将看到的页面。
Markdown 也是语言模型处理成本最低的格式。标题、链接和段落结构得以保留,而脚本、样式和布局标记则无法保存,因此代理可以将其上下文用于内容。

结论

将 CrewAI 连接到 Scrapeless MCP 服务器只需一个字典和一个上下文管理器。服务器提供 21 个工具及其各自的参数模式,crewai-tools 将其转换为原生 CrewAI 工具,在适配器中指定特定工具可使每个代理的表面保持足够小,以便模型能够有效使用。

值得在自己的项目中携带的部分是工具过滤器。一个由研究代理持有 scrape_markdowngoogle_search 的团队,以及一个单独的浏览代理持有 browser_* 集合,给每个模型提供了一个简短的菜单和明确的任务。

开始使用 Scrapeless 免费计划 获取密钥,在规划工作负载时查看 Scrapeless 定价,并阅读 Scrapeless MCP 服务器概述 获取完整的工具参考。

常见问题

问:CrewAI 的 Scrapeless MCP 服务器端点是什么?

托管的端点是 https://api.scrapeless.com/mcp,通过 streamable-http 传输访问,在 x-api-token 头中包含您的密钥。CrewAI 不需要本地服务器进程,因为工具在远程提供。

问:Scrapeless MCP 服务器公开了多少工具?

实时连接返回 21 个工具:十六个 browser_* 会话控制工具,三个页面检索工具(scrape_markdownscrape_htmlscrape_screenshot),以及两个搜索工具(google_searchgoogle_trends)。请在运行时检查列表,而不是假设,因为服务器可以在发布之间添加工具。

问:我可以限制代理接收哪些 MCP 工具吗?

可以。通过服务器字典后将工具名称传递给 MCPServerAdapter —— MCPServerAdapter(server_params, "scrape_markdown", "google_search") 仅返回这两个。这使模型的工具菜单保持简短,通常会提高选择的准确性。

问:CrewAI 需要 LLM 密钥才能连接到 MCP 服务器吗?

不需要。MCP 握手、工具发现和直接工具调用仅使用 Scrapeless 密钥即可工作。在您调用 crew.kickoff() 的那一刻,需要提供模型提供者的密钥,因为这是代理询问模型使用哪个工具的时刻。

问:为什么在 MCPServerAdapter 中使用上下文管理器?

with 块在入口处打开 MCP 会话,并在出口处关闭它。如果不构造一个,上下文管理器,连接将保持打开状态,而工具仅在会话存活期间有效——在会话关闭后访问它们会引发错误。

问:scrape_markdown 是否处理在浏览器中呈现的页面?

是的。通过 JavaScript 写入其内容的页面仍然会返回该内容的 markdown,因为在转换之前,渲染发生在服务器端。同一 URL 的普通 HTTP 获取请求返回的是预渲染的标记。

问:指向实时网站之前我应该检查什么?

查看网站的条款及其 /robots.txt 指令,这些指令遵循 robots 排除协议标准。将收集限制为公共页面,并给团队一个有限的任务列表,而不是无目的的爬取指令——否则代理循环可能会发出比您预期的更多请求。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录