3.4 Exa / Tavily / Firecrawl:三种搜索抓取路线
三个都是一等公民,但路线不同
这三个在 2026 年搜索量榜单上都进了前 25(Firecrawl 约 7.2k 排 21)。它们都围绕“从互联网取内容”,但设计哲学不同:
| Exa | Tavily | Firecrawl | |
|---|---|---|---|
| 核心 | 语义 / 神经搜索 | 实时搜索 + 抽取 | 抓取 + 爬取 + 抽取 |
| 仓库 | exa-labs/exa-mcp-server ★5158 |
tavily-ai/tavily-mcp ★2452 |
firecrawl/firecrawl-mcp-server ★7666 |
| npm 包 | exa-mcp-server 3.4.2 |
tavily-mcp 0.2.22 |
firecrawl-mcp 3.33.4 |
| 需要 API key | 是 | 是 | 是 |
| 远程端点 | https://mcp.exa.ai/mcp |
— | — |
| 一句话 | 按意思找页面 | 按时效找答案 | 按结构抓数据 |
选型决策
你要什么?
├─ 按语义找相关页面("找几篇讲 X 的好文章")
│ └─ Exa
├─ 要最新事实 / 新闻("今天发生了什么")
│ └─ Tavily
├─ 把整个站点或一批 URL 变成干净数据
│ └─ Firecrawl
└─ 只是读一个已知 URL
└─ 回 2.4 fetch,别用这三个
Exa
官方描述:Exa MCP for web search and web crawling(用于网页搜索与爬取的 Exa MCP)。社区对它的评价是“semantic web search built for agents”(为 agent 构建的语义网页搜索)。
支持两种接法:
本地 stdio:
- insert:
- id: exa
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: exa
transport: stdio
command: npx
args: ["-y", "exa-mcp-server"]
env:
EXA_API_KEY: !!js process.env.EXA_API_KEY
cwd: !!js process.cwd()
远程 HTTP(官方端点):
transport: streamable-http
url: https://mcp.exa.ai/mcp
远程端点走 OAuth,不用在本地放 key,适合不想在配置里碰密钥的场景(详见 1.3 远程服务器)。
典型用法:
用 exa 搜索"postgres 索引选择 实践",
找 5 篇高质量文章,返回标题、URL、摘要。
Tavily
官方描述:Production ready MCP server with real-time search, extract, crawl(生产可用的 MCP 服务器,提供实时搜索、抽取、爬取)。
它和 Exa 的最大差异是时效性。需要“今天的数据”时选它。
- insert:
- id: tavily
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: tavily
transport: stdio
command: npx
args: ["-y", "tavily-mcp"]
env:
TAVILY_API_KEY: !!js process.env.TAVILY_API_KEY
cwd: !!js process.cwd()
典型用法:
用 tavily 搜索过去 7 天关于"AI agent 框架"的新闻,
按日期列标题、来源、要点。
Firecrawl
官方描述:Official Firecrawl MCP server, the context API for AI agents(官方 Firecrawl MCP 服务器,面向 AI agent 的上下文 API)。能力是抓取、爬取、抽取结构化数据、搜索网页。
它是三者里唯一主打批量结构化抽取的。
- insert:
- id: firecrawl
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: firecrawl
transport: stdio
command: npx
args: ["-y", "firecrawl-mcp"]
env:
FIRECRAWL_API_KEY: !!js process.env.FIRECRAWL_API_KEY
cwd: !!js process.cwd()
典型用法:
用 firecrawl 抓取 https://example.com/blog 列表页与前 10 篇文章,
抽取标题、作者、发布日期、正文前 300 字,输出 JSON。
一个共同前提:都要 API key
三个都需注册拿 key。对使用者有两个现实提醒:
- 注意额度与计费,三个都是按量计费的云服务,先用免费额度试。
- 密钥写法统一:放进
config.env,用!!js process.env.XXX读取,不要写明文进 YAML。
排错
| 现象 | 原因 |
|---|---|
| 401 | key 未设或写错了环境变量名 |
| 返回结果为空 | 查询太窄,放宽关键词 |
| 抓取被拒 | 目标站反爬,换服务或换目标 |
| 超出配额 | 免费额度用尽,需升级 |
小结
- 三个都需 API key,路线不同:Exa 语义搜索、Tavily 实时搜索、Firecrawl 批量抽取。
- 只是读一个已知 URL 时,回到 fetch 更轻。
- 密钥一律
config.env+!!js,不写明文。
延伸阅读
- 本章其余小节:3.3 Context7、3.5 Desktop Commander
- 轻量替代:2.4 fetch
- 密钥管理:1.4 持久化、密钥与验证排错
