关于 Intercept
Intercept 是一个 MCP 服务,可将网页抓取为整洁的 Markdown,并结合专用处理器与回退抓取策略。它适合需要搜索、读取或提取网页内容的 AI 客户端,也支持特定媒体和文档链接。
主要功能
- 01将网址抓取为 Markdown
- 02搜索与研究工具
- 03批量抓取最多 10 个网址
- 04提取字段和表格
- 05网站专用处理器
- 06内存与共享缓存
适用场景
- 01在 AI 客户端中阅读网页
- 02根据搜索结果研究主题
- 03并行抓取多个页面
- 04提取指定页面字段或表格
MCP 相关
Intercept 向 MCP 客户端提供抓取、搜索、研究、批量抓取和提取工具,以及近期会话资源和研究提示词。它适用于支持 stdio MCP 服务的客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 要获取的 URL |
| maxTier | integer | 否 | 在此层级停止(1-5,默认值为 5)。値越低,速度越快,但回退选项越少。 |
| maxLength | integer | 否 | 返回的最大字符数(默认值为 50000) |
| startIndex | integer | 否 | 起始字符偏移量,用于对长内容分页(默认值为 0) |
| noCache | boolean | 否 | 跳过会话缓存和共享缓存,获取实时内容 |
详细介绍
intercept-mcp
让你的 AI 能够阅读网页。一条命令即可,无需 API 密钥。
没有它,你的 AI 访问 URL 时会遇到 403、访问墙或一大堆原始 HTML。使用 intercept 后,它几乎总能获取内容——干净的 Markdown,可直接使用。
支持推文、YouTube 视频(有字幕时提供转录文本)、arXiv 论文、PDF、维基百科文章和 GitHub 仓库。如果第一种策略失败,还会再尝试最多 14 种策略才放弃。
适用于任何 MCP 客户端:Claude Code、Claude Desktop、Codex、Cursor、Windsurf、Cline 等。
安装
Claude Code
claude mcp add intercept -s user -- npx -y intercept-mcp
Codex
codex mcp add intercept -- npx -y intercept-mcp
Cursor
设置 → MCP → 添加服务:
{
"mcpServers": {
"intercept": {
"command": "npx",
"args": ["-y", "intercept-mcp"]
}
}
}
Windsurf
设置 → MCP → 添加服务 → 使用上方相同的 JSON 配置。
Claude Desktop
添加到你的 claude_desktop_config.json:
{
"mcpServers": {
"intercept": {
"command": "npx",
"args": ["-y", "intercept-mcp"]
}
}
}
其他 MCP 客户端
任何支持 stdio MCP 服务的客户端都可以运行 npx -y intercept-mcp。
fetch 工具无需 API 密钥。
工作原理
URL 会经过四个阶段处理:
1. 网站专用处理器
已知的 URL 模式会在进入回退流程之前,路由到专用处理器:
| 模式 | 处理器 | 获取内容 |
|---|---|---|
twitter.com/*/status/*、x.com/*/status/* | Twitter/X | 推文文本、作者、媒体、互动数据(通过第三方 API) |
youtube.com/watch?v=*、youtu.be/* | YouTube | 标题、频道、时长、观看次数、描述、转录文本(有字幕时提供) |
arxiv.org/abs/*、arxiv.org/pdf/* | arXiv | 论文元数据、作者、摘要、分类 |
*.pdf | 提取的文本(仅限带文本层的 PDF) | |
*.wikipedia.org/wiki/* | Wikipedia | 通过 Wikimedia REST API 获取的纯净文章内容 |
github.com/{owner}/{repo} | GitHub | 原始 README.md 内容 |
github.com/{o}/{r}/blob/{ref}/{path} | GitHub | 原始文件内容,按语言添加代码围栏 |
github.com/{o}/{r}/issues/{n}、/pull/{n} | GitHub | Issue/PR 标题、状态、正文、差异统计、评论(通过 GitHub API) |
github.com/{o}/{r}/releases/tag/{t}、/releases/latest | GitHub | 发布说明(通过 GitHub API) |
GitHub API 端点无需身份验证即可使用(每小时 60 次请求)。设置 GITHUB_TOKEN 可提高上限。
2. 共享缓存(agentsweb.org)
在调用任何抓取器之前,每个请求都会先检查 agentsweb.org——这是一个面向 AI Agent 的全局共享 Markdown 缓存,由 9 个来源组成的并行抓取流程提供支持,并具备 JS/SPA 渲染能力(通过 Cloudflare Browser Run 支持 React、Vue、Angular)。如果其他 Agent 已经抓取过此 URL,你可以在 50 ms 内获取结果。
每次成功抓取都会自动回馈缓存。条目通过自我修复的共识模型建立信任:当互相独立的实例抓取同一 URL 并确认内容一致时,可信度就会提高。
设置 INTERCEPT_SHARED_CACHE=false 可完全退出;设置 INTERCEPT_CACHE_READ_ONLY=true 可使用只读模式(可以读取,但不会贡献内容)。
agentsweb.org API
agentsweb.org 还提供可直接使用的独立端点:
/web?q=— 搜索网页/research?q=— 一次调用完成搜索、抓取和缓存/fetch?url=— 按需抓取并自动缓存
完整 API 文档请参阅 agentsweb.org/docs。
3. 回退流水线
如果没有匹配的处理器(或处理器未返回内容),URL 将进入多层流水线:
| 层级 | 获取器 | 策略 |
|---|---|---|
| 0 | agentsweb.org | 全局共享 Markdown 缓存——如果其他 Agent 已获取此 URL,则可立即返回 |
| 1 | Cloudflare Browser Run | JS/SPA 渲染 + Markdown 提取——也为 agentsweb.org 提供支持(可选,需要 API 令牌) |
| 1 | Jina Reader | 简洁的 Markdown 提取服务 |
| 2 | Wayback Machine | 来自 archive.org 的存档版本 |
| 2 | Arquivo.pt | 葡萄牙网络档案(覆盖广泛的国际内容) |
| 2 | Common Crawl | 从 Common Crawl 的索引和 S3 读取 PB 级网络档案——不受源站速率限制、机器人检测或付费墙影响 |
| 2 | Codetabs | CORS 代理 |
| 3 | Markdown endpoint | 请求网站提供原生 Markdown 版本(<path>.md + Accept: text/markdown) |
| 3 | archive.ph | 通过 timemap API + 隐身 TLS 获取存档快照 |
| 3 | Raw fetch | 使用浏览器请求头直接 GET + Turndown Markdown 转换 |
| 3 | Stealth fetch | 通过 got-scraping 模拟浏览器 TLS 指纹(可选启用,见下文) |
| 3 | FlareSolverr | 针对 Cloudflare/DDoS-Guard 的真实浏览器挑战求解器(可选启用,需要 FlareSolverr 实例) |
| 3 | Web unlocker | 商业解锁 API——住宅代理轮换 + 渲染 + CAPTCHA(可选启用,需自备密钥,按请求付费) |
| 4 | RSS、CrossRef、Semantic Scholar、HN、Reddit | 元数据/讨论回退 |
| 5 | OG Meta | Open Graph 标签(保证可用的回退方案) |
第 2 层的获取器会并行运行。多个获取器成功时,采用质量最高的结果。其他层级则按顺序运行。
所有获取器都会通过 Turndown 返回规范的 Markdown(标题、链接、粗体、表格、代码块),而非纯文本。
4. 缓存
结果会以 TTL 缓存在内存中(成功结果为 60 分钟,失败结果为 5 分钟)。最多缓存 250 条,采用 LRU 淘汰。失败的 URL 也会被缓存,以避免重试已知无效的 URL。三个配置项均可通过 INTERCEPT_CACHE_TTL_MS、INTERCEPT_CACHE_FAILURE_TTL_MS 和 INTERCEPT_CACHE_SIZE 设置。
工具
fetch
获取 URL 并将其内容作为简洁的 Markdown 返回。
url(字符串,必填)——要获取的 URLmaxTier(数字,可选,1-5)——为对速度敏感的场景指定停止层级maxLength(数字,可选,默认值为 50000)——返回的最大字符数startIndex(数字,可选,默认值为 0)——长内容分页时的字符偏移量noCache(布尔值,可选)——跳过会话缓存和共享缓存,实时获取
长页面会在达到 maxLength 时截断,并提示 Agent 使用哪个 startIndex 继续读取内容。结构化输出会提供 source、quality、contentLength、truncated、nextStartIndex 和 cacheAgeSeconds,以便 Agent 据此进行程序化处理。
直接图片 URL(.png、.jpg、.gif、.webp,最大 5 MB)会作为 MCP 图像块而非文本返回,因此 Agent 自身的视觉模型可以读取图表、示意图、屏幕截图和扫描文档。结构化输出会提供 source: "image"、mimeType 和 bytes。
fetch_batch
并行获取最多 10 个 URL,每个 URL 都经过相同的处理器/回退链。
urls(字符串数组,必填,1-10)——要获取的 URLmaxTier、noCache——与fetch相同maxLength(数字,可选,默认值为 20000)——每个 URL 的字符数限制
research
一次调用即可搜索网络并获取排名靠前的结果——无需先搜索再多次获取。
query(字符串,必填)——搜索查询count(数字,可选,1-5,默认值为 3)——要获取的结果数maxLength(数字,可选,默认值为 20000)——每个结果的字符数限制site(字符串,可选)——限定到某个域名freshness(字符串,可选)——day、week、month或year
search
搜索网页并返回结果。
query(字符串,必填)——搜索查询count(数字,可选,1-20,默认 5)——结果数量site(字符串,可选)——将结果限制在某个域名内freshness(字符串,可选)——day、week、month或yearpage(数字,可选,1-10)——分页的结果页码
如果设置了 BRAVE_API_KEY,则使用 Brave Search API;否则,如果设置了 SEARXNG_URL,则使用 SearXNG;最后才使用不可靠的 DuckDuckGo。DuckDuckGo 回退方案会忽略 freshness 和 page。
extract
将页面中的特定值提取为 JSON,而非 Markdown 正文——适用于只需要特定数据,而非整个页面的情况。支持按域名配置身份验证和代理。
url(字符串,必填)——要从中提取内容的 URLselectors(对象,可选)——字段名称 → CSS 选择器的映射。每个值可以是选择器字符串(返回第一个匹配项的文本),也可以是{ selector, attr?, all? }——attr用于提取属性(例如href),all: true则以数组形式返回所有匹配项。tables(布尔值,可选)——将每个 HTML 表格转换为行对象数组(未提供selectors时默认为 true)。
{
"url": "https://shop.example.com/item",
"selectors": {
"title": "h1",
"price": ".price",
"images": { "selector": "img.gallery", "attr": "src", "all": true }
}
}
以结构化输出的形式返回提取出的 fields 和/或 tables。
资源
intercept://session/recent
本次会话中已获取并缓存的 URL 的 Markdown 列表,按最近获取的顺序排列。重新获取其中任何 URL 都会即时完成。
提示词
research-topic
搜索某个主题并获取排名靠前的结果,以生成多来源摘要。
topic(字符串)——要研究的主题depth(字符串,默认值 "3")——要获取的排名靠前的结果数量
extract-article
获取 URL 并从内容中提取要点。
url(字符串)——要获取并总结的 URL
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
BRAVE_API_KEY | 否 | 用于搜索的 Brave Search API 密钥 |
SEARXNG_URL | 否 | 可自托管的 SearXNG 实例 URL(推荐) |
GITHUB_TOKEN | 否 | GitHub 令牌,可提高 issue/PR/release 处理程序的 API 速率限制 |
INTERCEPT_AUTH | 否 | 域名 → 标头/ Cookie 的 JSON 映射,用于获取已登录后才能查看的内容(参见按域名进行身份验证) |
CF_API_TOKEN | 否 | 具有“Browser Rendering - Edit”权限的 Cloudflare API 令牌 |
CF_ACCOUNT_ID | 否 | Cloudflare 账户 ID(设置 CF_API_TOKEN 后必填) |
USE_STEALTH_FETCH | 否 | 设置为 true 以启用隐身抓取器(参见下方警告) |
FLARESOLVERR_URL | 否 | FlareSolverr 实例的 URL(例如 http://localhost:8191),用于解决 Cloudflare/DDoS-Guard 挑战 |
WEB_UNLOCKER_URL | 否 | 商业网页解锁服务(如 ScrapingBee/ScraperAPI/ZenRows)的 GET 模板(包含 {url} 占位符和你的 API 密钥)——用于最难抓取的网站,作为付费的最后手段 |
INTERCEPT_SHARED_CACHE | 否 | 设置为 false 以禁用 agentsweb.org 共享缓存 |
INTERCEPT_CACHE_READ_ONLY | 否 | 设置为 true 以使用共享缓存,但不向其中写入内容 |
INTERCEPT_CACHE_TTL_MS | 否 | 成功抓取结果的内存缓存 TTL,单位为毫秒(默认值 3600000 = 60 分钟) |
INTERCEPT_CACHE_FAILURE_TTL_MS | 否 | 抓取失败结果的内存缓存 TTL,单位为毫秒(默认值 300000 = 5 分钟) |
INTERCEPT_CACHE_SIZE | 否 | 内存缓存条目的最大数量(默认值 250) |
HTTPS_PROXY / HTTP_PROXY | 否 | 标准代理透传——通过代理路由所有出站抓取(包括隐身抓取)。遵循 NO_PROXY。 |
INTERCEPT_PROXIES | 否 | 以逗号或空格分隔的 HTTP(S) 代理列表,可在这些代理间轮换;遇到受阻响应时会自动重试下一个代理。优先级高于 HTTPS_PROXY。 |
**搜索:**提供 DuckDuckGo 回退选项,但它有速率限制且不可靠。生产环境中,请自行托管 SearXNG 并设置 SEARXNG_URL(见下文),或获取 Brave Search API 密钥。
**抓取:**无需任何密钥即可使用。设置 CF_API_TOKEN 和 CF_ACCOUNT_ID,即可为 JavaScript 密集型页面(SPA、React 网站)启用 Cloudflare Browser Run(原 Browser Rendering)。
隐身抓取(USE_STEALTH_FETCH)
**使用风险自负。**启用后,此功能会使用 got-scraping 添加一个抓取器,仿冒真实浏览器的 TLS 指纹(Chrome/Firefox 加密套件、HTTP/2 设置、标头顺序)。它可以绕过网站上的机器人检测和 CAPTCHA 触发机制,否则这些网站会阻止自动化请求。
此抓取器在常规原始抓取之后,作为第 3 层运行。如果原始抓取被阻止(CAPTCHA、Cloudflare 挑战、403),隐身抓取器会使用浏览器仿冒方式重试。
**这可能违反某些网站的服务条款。**intercept-mcp 的作者对本功能的使用方式概不负责。本功能默认禁用,必须明确选择启用。
挑战解决(FLARESOLVERR_URL)
隐身抓取器会仿冒浏览器的 TLS 指纹,但无法 执行 JavaScript 挑战——因此,受 Cloudflare“正在检查您的浏览器”/DDoS-Guard 拦截页保护的网站仍会阻止它。FlareSolverr 会运行真实的无头浏览器来解决挑战,并返回页面 HTML。
运行方式(Docker):
docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest
然后设置 FLARESOLVERR_URL=http://localhost:8191。设置此变量后,它会作为最后手段在第 3 层运行,在原始抓取器和隐身抓取器之后启用。解决挑战可能需要 30–60 秒,因此这是最慢的抓取器,但它可以恢复其他方式都无法获取的页面。
商业网页解锁器(WEB_UNLOCKER_URL)
对于最难处理的目标网站——需要同时使用住宅 IP 轮换、真实浏览器渲染和 CAPTCHA 处理的网站——商业解锁器是务实之选。intercept-mcp 支持任何提供“获取此 URL 并返回 HTML”接口的解锁器,只需使用包含 {url} 占位符的模板,该占位符中存放你的 API 密钥:
# ScrapingBee
WEB_UNLOCKER_URL='https://app.scrapingbee.com/api/v1/?api_key=KEY&render_js=true&url={url}'
# ScraperAPI
WEB_UNLOCKER_URL='https://api.scraperapi.com/?api_key=KEY&render=true&url={url}'
# ZenRows
WEB_UNLOCKER_URL='https://api.zenrows.com/v1/?apikey=KEY&js_render=true&url={url}'
intercept 会将目标 URL(经过 URL 编码)替换到 {url} 中,并将返回的 HTML(或封装 HTML 的 JSON)转换为 Markdown。它在第 3 层运行,是免费抓取器之后的付费兜底方案,且仅在设置了此变量时运行——模板中的凭据只会发送给解锁器,绝不会发送给目标网站。Bright Data 基于代理的 Web Unlocker 只是一个经过身份验证的代理,因此请改用 HTTPS_PROXY / INTERCEPT_PROXIES。每次请求都会产生费用。
使用自己的代理(HTTPS_PROXY)
如果原始抓取开始遭到拦截,通常最有效的解决办法是使用干净的出站 IP,而不是更复杂的指纹。intercept-mcp 支持标准的 HTTPS_PROXY / HTTP_PROXY / NO_PROXY 环境变量,因此你可以通过现有的任意代理路由所有出站流量:
HTTPS_PROXY=http://user:[email protected]:8080 npx intercept-mcp
此方法适用于任何 HTTP(S) 代理——自托管的 Squid、Tailscale 出口节点、运行 3proxy 的 5 美元 VPS,或商业住宅代理(Bright Data、Oxylabs 等)。隐身抓取器和 got-scraping 调用也会自动使用这些代理。
代理轮换(INTERCEPT_PROXIES)
单个代理仍会呈现单个 IP,在高负载下本身也可能遭到拦截。将 INTERCEPT_PROXIES 设置为以逗号或空格分隔的列表后,intercept-mcp 会按轮询方式使用这些代理;当请求被拦截(HTTP 403、429、451、503)或出错时,会自动通过下一个代理重试:
INTERCEPT_PROXIES="http://user:[email protected]:8080,http://user:[email protected]:8080,http://p3.example.com:8080" npx intercept-mcp
请求会分散到列表中的代理;遇到被拦截的响应时,会改用不同的出口重试(最多 3 次),之后才会放弃。因此,少量廉价代理或在列表中重复列出的轮换住宅代理端点,都能形成一个代理池。INTERCEPT_PROXIES 优先于 HTTPS_PROXY,按请求生效(因此隐身抓取和 archive.ph 的 got-scraping 调用也会轮换代理),并接受 HTTP(S) 代理。无效条目会被忽略。
按域名进行身份验证(INTERCEPT_AUTH)
大多数网站都需要登录。INTERCEPT_AUTH 允许你为特定源站的请求附加自定义标头或 Cookie,以便抓取工具读取你已合法登录的内容——例如付费订阅、私人控制面板、内网或经过身份验证的 API。
这是一个 JSON 对象,将域名映射到标头映射。域名也会匹配其子域名:
INTERCEPT_AUTH='{
"nytimes.com": { "Cookie": "nyt-s=...; nyt-a=..." },
"api.acme.com": { "Authorization": "Bearer eyJ..." }
}' npx intercept-mcp
获取 Cookie 的方法:登录网站,打开 DevTools → Network,然后从该域名的任意请求中复制 Cookie 请求标头。
安全模型 — 使用前请先阅读
- 凭据只会发送到配置的源站。 请求头以实际连接的主机为键。当 intercept 通过 Jina、网页存档、CORS 代理、FlareSolverr 或共享缓存获取页面时,这些中间服务会连接到其他主机,因此绝不会向它们发送你的 Cookie/令牌——只有直接获取源站内容时才会携带凭据。
- 经过身份验证的响应绝不会触及共享缓存。 当请求匹配某个
INTERCEPT_AUTH条目时,intercept 不会从 agentsweb.org 公共缓存中读取该 URL 的内容,也不会向其中写入内容——因此你的私人/付费内容绝不会被公开,你也始终会看到你自己的已验证视图,而不是陌生人看到的匿名副本。(进程内会话缓存仍然适用。) - 请将该值视为机密。 其中包含有效的会话令牌。环境变量对进程及其子进程可见,也可能被记录在 Shell 历史记录或进程列表中——建议使用密钥管理器或不提交到版本库的环境文件,切勿提交该值。Cookie 会过期,因此你需要定期刷新。
- 你有责任确保使用获得授权。 仅提供你拥有或获准使用的账户凭据,并遵守各网站的服务条款。intercept 只会转发你提供的请求头。
自托管 SearXNG
为确保搜索可靠,请使用 Docker 自托管 SearXNG。配置文件已包含在仓库中:
git clone https://github.com/bighippoman/intercept-mcp.git
cd intercept-mcp/searxng && docker compose up -d
然后设置 SEARXNG_URL=http://localhost:8888。没有速率限制,也没有 CAPTCHA,并可聚合 Google、Bing、DuckDuckGo、Wikipedia 和 Brave 的内容。
或者使用任何现有的 SearXNG 实例——只需将 SEARXNG_URL 设置为其实例 URL。
URL 规范化
系统会自动清理传入的 URL:
- 移除 60 多种跟踪参数(UTM、点击 ID、分析、A/B 测试等)
- 移除哈希片段
- 升级为 HTTPS
- 清理 AMP 相关内容
- 保留功能性参数(
ref、format、page、offset、limit)
SSRF 防护
Agent 会传入取自不可信网页内容的 URL,因此抓取工具会拒绝任何指向本地或内部基础设施的 URL:回环地址和私有 IPv4/IPv6 地址段、链路本地地址(包括云元数据端点 169.254.169.254)、CGNAT、多播/保留地址段以及本地主机名(localhost、*.local、*.internal、*.home.arpa)。系统会检查字面 IP 地址,包括经 URL 解析器规范化的其他表示形式(十进制、十六进制);但不会解析 DNS,因此无法拦截指向私有 IP 的公共主机名。
内容质量检测
系统会对每个抓取器的结果进行质量评分。出现以下情况时会自动判定失败:
- CAPTCHA/Cloudflare 验证
- 登录墙
- 正文包含 HTTP 错误页面
- 内容少于 200 个字符
要求
- Node.js >= 20
- 基本使用无需 API 密钥
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。