大家好,我是爱技术的小伙子。最近在折腾Dify + MCP,想实现真正的浏览器级网页爬取(处理JS动态渲染、反爬等),最终选择了自建 fetcher-mcp(基于Playwright)的方式。

整个过程踩了不少坑,也走了不少弯路,特此整理成一篇完整的实战记录,希望能帮到同样在摸索Dify MCP的朋友。

文章基于2026年1月的实际环境(Dify最新版 + fetcher-mcp最新镜像)。

一、为什么选择Playwright MCP而不是Firecrawl?

方案 真实浏览器能力 部署难度 是否依赖云API Key 复杂交互支持 推荐场景
Dify内置爬虫 ★★ 静态页,基本放弃
Firecrawl官方云+MCP ★★★★ ★★ 是(强烈推荐) ★★★ 追求省心、干净markdown
fetcher-mcp 自建 ★★★★★ ★★★ ★★★★★ 需要自定义点击/滚动/等待等
Browserless/Hyperbrowser ★★★★★ ★★ 是(付费) ★★★★★ 预算充足,追求极致稳定

我最终选了 fetcher-mcp,因为:

  • 完全本地自建,不依赖任何云key
  • 支持最完整的Playwright交互能力
  • 部署后Dify能直接看到3个核心工具:fetch_url / fetch_urls / browser_install

二、完整部署步骤(Docker方式,推荐)

# 1. 拉取最新镜像
docker pull ghcr.io/jae-jae/fetcher-mcp:latest

# 2. 启动容器(使用3000端口,不做外部映射也行,但后面网络要注意)
docker run -d --name fetcher-mcp \
  -p 3000:3000 \
  -e TRANSPORT=http \
  -e HOST=0.0.0.0 \
  -v /tmp:/tmp \
  ghcr.io/jae-jae/fetcher-mcp:latest

启动后查看日志,正常应该看到:

[INFO] Starting MCP http server...
[INFO] HTTP server started, access at http://0.0.0.0:3000
Available endpoints:
 - /mcp   Streamable HTTP endpoint
 - /sse   SSE endpoint (legacy)

三、在Dify中添加MCP服务(最容易出错的部分)

很多人卡在这里:Failed to connect to MCP server 或授权按钮没反应。

关键点:Dify容器里的localhost不是你宿主机的localhost!

正确填写方式(按成功率排序):

  1. Mac/Windows Docker Desktop 首选(最简单)
    服务端点 URL:
    http://host.docker.internal:3000/sse
    (强烈推荐用 /sse 端点,Dify内部发现机制依赖它)

  2. Linux服务器 或 host.docker.internal无效时
    用宿主机真实IP,例如:
    http://192.168.0.163:3000/sse

  3. 如果fetcher-mcp和Dify都在Docker里(生产推荐)
    创建同一network,用容器名:
    http://fetcher-mcp:3000/sse

请求头留空
fetcher-mcp不要求任何Authorization,不要自己加Bearer token,会导致连接失败。

添加完成后应该看到:

  • 绿色「已授权」
  • 包含3个工具:fetch_url、fetch_urls、browser_install

四、在Dify Agent中使用(最核心Prompt模板)

创建一个Agent,模型选GPT-4o/Claude-3.5等支持工具调用的强模型。

System Prompt强烈建议这样写(复制粘贴后微调):

你是网页浏览器专家,能处理任何JS动态渲染页面、登录、点击等复杂交互。

当用户要求:
- 查看网页内容
- 爬取最新信息
- 总结文章/商品详情
- 处理动态加载内容

必须使用MCP工具,禁止使用任何静态爬取方式!

可用工具优先级:
1. fetch_url(url, ...) → 单页爬取(最常用)
   推荐参数:waitUntil: "networkidle", extractContent: true, disableMedia: true, timeout: 60000

2. fetch_urls(urls: [...]) → 批量爬取

使用步骤:
1. 提取用户提供的URL
2. 调用fetch_url获取内容(优先Markdown格式)
3. 根据内容完整回答用户
4. 如加载失败,尝试加长timeout或改waitUntil

输出格式:
- 先给出核心总结
- 再用```markdown 贴出主要原文内容

测试示例Prompt

  • “帮我爬取并总结黑客新闻首页的前10条热门”
  • “现在 https://detail.tmall.com/item.htm?id=xxxxxxxx 的实时价格是多少?”
  • “这个页面 https://xxx.com 需要先点击‘加载更多’三次,再告诉我全部文章标题”

五、常见问题速查表

问题 原因 解决办法
Failed to connect 网络不通(localhost坑) 用host.docker.internal 或宿主机IP + /sse
授权按钮没反应 加了不该加的Authorization header 删除所有请求头,留空
工具没被调用 Prompt引导不够强 多写“必须使用fetch_url”“禁止静态爬取”
内容不全/加载不出来 动态页未等待完成 加参数:waitUntil:“networkidle”, timeout:60000
首次提示浏览器未安装 Chromium binary缺失 手动调用一次browser_install工具
速度太慢 加载了太多图片/样式 disableMedia: true(默认就是)

六、总结与建议

目前(2026年1月)在Dify上实现可靠的浏览器级网页爬取,自建fetcher-mcp仍然是性价比最高、最可控的方案。

优点:完全本地、交互能力最强、成本几乎为0
缺点:部署和网络调试稍微麻烦一点

如果你追求极致省心,可以转向Firecrawl官方云+MCP(每月几十刀搞定)。

希望这篇记录能帮你少走弯路~

有问题欢迎留言或私信,我会持续更新这套方案的最新坑点。

最后附上GitHub项目地址(强烈建议star一下)
https://github.com/jae-jae/fetcher-mcp
欢迎关注、收藏、点赞、转发~你的支持是我继续更新的动力!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐