intercept-mcp 是一个面向 AI 的网页内容抓取 MCP 服务器,目标是把网页内容转换成 AI 可直接使用的干净 Markdown,而不是原始 HTML 或错误页面。它无需 API 密钥即可使用基本功能,通过一条命令 npx -y intercept-mcp 即可在任意支持 stdio 的 MCP 客户端中运行,包括 Claude Code、Claude Desktop、Codex、Cursor、Windsurf、Cline 等。
用途
为 AI 代理提供可靠的网页读取能力,解决直接访问 URL 时常见的 403、反爬拦截或返回大量原始 HTML 的问题。
主要能力
- 多级回退链:URL 依次经过站点专用处理器、共享缓存、回退流水线。如果首个策略失败,最多尝试 14 种额外策略后才放弃。
- 站点专用处理器:针对特定 URL 模式路由到专用处理器,涵盖推文、YouTube 视频(可用时含字幕)、arXiv 论文、PDF、维基百科文章、GitHub 仓库。GitHub API 端点可在未认证下工作(每小时 60 次请求),设置 GITHUB_TOKEN 可提高限额。
- 共享缓存:每个请求先检查 agentsweb.org,这是一个面向 AI 代理的全局共享 Markdown 缓存,由 9 源并行抓取流水线及 JS/SPA 渲染支持。若其他代理已抓取过该 URL,可在 50ms 内返回结果。每次成功抓取会自动回贡献。可通过 INTERCEPT_SHARED_CACHE=false 完全退出,或通过 INTERCEPT_CACHE_READ_ONLY=true 使用只读模式。
- 回退流水线:无处理器匹配或处理器无返回时,URL 进入多级流水线。Tier 2 抓取器并行运行,多个成功时取质量最高者;其余层级顺序执行。所有抓取器通过 Turndown 返回规范的 Markdown(标题、链接、粗体、表格、代码块)。
- 内存缓存:结果按 TTL 缓存(成功 60 分钟,失败 5 分钟),最多 250 条,LRU 淘汰。失败 URL 也会缓存以防重试已知失效地址。三个参数可通过 INTERCEPT_CACHE_TTL_MS、INTERCEPT_CACHE_FAILURE_TTL_MS、INTERCEPT_CACHE_SIZE 配置。
- 结构化输出:报告 source、quality、contentLength、truncated、nextStartIndex、cacheAgeSeconds,代理可据此分支处理。
- 图片支持:直接图片 URL(.png、.jpg、.gif、.webp,最大 5 MB)以 MCP 图片块返回,而非文本,让代理自身的视觉模型读取图表、示意图、截图和扫描文档。
工具
- fetch:抓取 URL 并返回干净 Markdown。参数 url(必填)、maxTier(1-5,可选)、maxLength(默认 50000)、startIndex(默认 0,用于长内容分页)、noCache(可选,跳过缓存实时抓取)。长页面在 maxLength 处截断并告知继续的 startIndex。
- fetch_batch:并行抓取最多 10 个 URL,每个走相同的处理器/回退链。参数 urls(1-10,必填)、maxTier、noCache、maxLength(默认 20000,每个 URL 预算)。
- search_and_fetch:一次调用搜索网页并抓取顶部结果。参数 query(必填)、count(1-5,默认 3)、maxLength(默认 20000)、site(可选)、freshness(day/week/month/year)。
- search:搜索网页并返回结果。参数 count(1-20,默认 5)、site、page(1-10)。优先使用 Brave Search API(若设置 BRAVE_API_KEY),其次 SearXNG(若设置 SEARXNG_URL),最后 DuckDuckGo(不稳定,freshness 和 page 被忽略)。
- extract:以 JSON 提取页面特定值而非 Markdown 散文。参数 url(必填)、selectors(字段名到 CSS 选择器的映射,或 { selector, attr?, all? })、tables(布尔值,无选择器时默认 true)。
- 资源 intercept://session/recent:本次会话抓取并缓存的 URL 的 Markdown 列表,最近优先,重新抓取即时返回。
- 技能:research(搜索主题并抓取顶部结果做多源摘要,参数 topic、depth 默认 3);extract-article(抓取 URL 并提取要点,参数 url)。
环境变量与配置
- 搜索:DuckDuckGo 回退有速率限制且不稳定。生产环境建议自托管 SearXNG 并设置 SEARXNG_URL(仓库含 Docker 配置,运行后设 SEARXNG_URL=http://localhost:8888,无速率限制、无 CAPTCHA,聚合 Google、Bing、DuckDuckGo、Wikipedia、Brave),或获取 Brave Search API 密钥。
- 抓取:无需密钥即可工作。设置 CF_API_TOKEN + CF_ACCOUNT_ID 可启用 Cloudflare Browser Run 处理 JavaScript 重度页面(SPA、React 站点)。
- 隐身抓取(USE_STEALTH_FETCH):默认禁用,需显式开启。启用后添加一个使用 got-scraping 模拟真实浏览器 TLS 指纹(Chrome/Firefox 密码套件、HTTP/2 设置、头部顺序)的抓取器,可绕过某些站点的机器人检测和 CAPTCHA 触发。在 tier 3 运行,原始抓取被封锁时重试。可能违反某些网站服务条款,作者不承担使用责任。
- 挑战求解(FLARESOLVERR_URL):隐身抓取无法执行 JavaScript 挑战,Cloudflare 检查 / DDoS-Guard 中间页仍会拦截。可运行 FlareSolverr(Docker)并设 FLARESOLVERR_URL=http://localhost:8191。在 tier 3 作为最后手段运行,仅在设置该变量时启用,求解可能需 30-60 秒,是最慢的抓取器。
- 商业网页解锁器(WEB_UNLOCKER_URL):对需要住宅 IP 轮换、真实浏览器渲染和 CAPTCHA 处理的最难目标,支持任何暴露“GET URL 返回 HTML”端点的解锁器,通过含 {url} 占位符的模板配置 API 密钥。在 tier 3 作为付费最后手段运行,仅设置该变量时启用,凭据只发给解锁器。按请求计费。
- 自带代理(HTTPS_PROXY):遵循标准 HTTPS_PROXY / HTTP_PROXY / NO_PROXY 环境变量,可路由所有出站流量。适用于任何 HTTP(S) 代理,隐身抓取和 got-scraping 调用也会自动使用。
- 代理轮换(INTERCEPT_PROXIES):设为逗号或空格分隔列表,intercept-mcp 轮询使用,遇到封锁(HTTP 403、429、451、503)或错误时自动通过下一个代理重试(最多 3 次)。优先于 HTTPS_PROXY,按请求应用,接受 HTTP(S) 代理,无效条目忽略。
- 按域认证(INTERCEPT_AUTH):JSON 对象,将域名映射到头部映射,可附加自有头部或 Cookie 以读取合法登录内容。安全模型:凭据只发往配置的源;通过 Jina、网络档案、CORS 代理、FlareSolverr 或共享缓存抓取时,中间人连接不同主机,Cookie/token 不会发送给它们。认证响应不进入共享缓存(不读不写 agentsweb.org),会话缓存仍适用。请将值视为机密,环境变量对进程和子进程可见,可能被 shell 历史或进程列表捕获。仅对自己拥有或获准使用的账户提供凭据。
其他特性
- URL 规范化:自动清理传入 URL,去除 60 多个跟踪参数(UTM、点击 ID、分析、A/B 测试等)、移除哈希片段、升级到 HTTPS、清理 AMP 痕迹,保留功能性参数(ref、format、page、offset、limit)。
- SSRF 保护:拒绝指向本地或内部基础设施的 URL,包括回环和私有 IPv4/IPv6 范围、链路本地地址(含 169.254.169.254 云元数据端点)、CGNAT、多播/保留范围,以及本地主机名(localhost、.local、.internal、*.home.arpa)。检查字面 IP 包括 URL 解析器规范化的替代写法(十进制、十六进制);不解析 DNS,因此指向私有 IP 的公共主机名不会被捕获。
- 内容质量检测:每个抓取器结果都会评分。以下情况自动判失败:CAPTCHA / Cloudflare 挑战、正文中的 HTTP 错误页面、内容不足 200 字符。
适用场景
需要让 AI 代理可靠读取网页、论文、视频字幕、PDF、GitHub 仓库、维基百科等内容的 MCP 客户端环境;需要在单次调用中搜索并抓取多源内容;需要绕过轻度反爬或 JS 渲染页面的场景。
限制
- 基本抓取无需 API 密钥,但搜索的 DuckDuckGo 回退不稳定且有速率限制。
- 隐身抓取可能违反某些网站服务条款,默认禁用,需自行承担风险。
- FlareSolverr 求解挑战可能需 30-60 秒,是最慢选项。
- 商业解锁器按请求计费。
- 不解析 DNS,无法捕获指向私有 IP 的公共主机名。
- INTERCEPT_AUTH 中的 Cookie 会过期,需定期刷新。