网页内容提取服务

一款无需API密钥的网页内容提取工具,能够从多种网站(如Twitter、YouTube、arXiv、PDF、Wikipedia、GitHub等)获取并转换为干净的Markdown格式。

  • by bighippoman
  • TypeScript
  • 本地部署
  • 9 星标
  • 更新于
在 GitHub 查看 bighippoman/intercept-mcp

使用说明

拦截mcp

赋予你的人工智能阅读网络的能力。一个命令,不需要API密钥。

没有它,你的AI会点击一个URL,得到一个403、一堵墙或一堵原始HTML墙。通过拦截,它几乎总是能得到内容——干净的标记,随时可用。

处理推文、YouTube视频(有文字记录时)、arXiv论文、PDF、维基百科文章和GitHub仓库。如果第一个策略失败,它会在放弃之前再尝试14次。

适用于任何MCP客户端:Claude Code、Claude Desktop、Codex、Cursor、Windsurf、Cline等。

安装

克劳德代码

claude mcp add intercept -s user -- npx -y intercept-mcp

法典

codex mcp add intercept -- npx -y intercept-mcp

光标

设置→ MCP → 添加服务器:

{
  "mcpServers": {
    "intercept": {
      "command": "npx",
      "args": ["-y", "intercept-mcp"]
    }
  }
}

帆板运动

设置→ MCP → 添加服务器→ 与上述JSON配置相同。

克劳德桌面版

添加到您的 claude_desktop_config.json:

{
  "mcpServers": {
    "intercept": {
      "command": "npx",
      "args": ["-y", "intercept-mcp"]
    }
  }
}

其他MCP客户端

任何支持stdio MCP服务器的客户端都可以运行 npx -y intercept-mcp.

不需要API密钥 fetch 工具。

运作原理

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 提取的文本(仅限文本层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 发布/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代理的全局共享markdown缓存,由9源并行获取管道支持,具有JS/SPA渲染(React、Vue、Angular通过Cloudflare浏览器运行)。如果另一个代理已经获取了此URL,您将在50毫秒内得到结果。

每次成功获取都会自动返回。条目通过自愈共识模型获得信任:当独立实例获取相同的URL并确认相同的内容时,信任度会提高。

选择完全退出 INTERCEPT_SHARED_CACHE=false,或使用只读模式(消费但从不贡献) INTERCEPT_CACHE_READ_ONLY=true.

agentsweb.org API

agentsweb.org还公开了独立端点供直接使用:

  • /web?q= --搜索网页
  • /research?q= --在一次调用中搜索+获取+缓存
  • /fetch?url= --按需获取,自动缓存

看 agentsweb.org/docs 获取完整的API文档。

3.回退管线

如果没有匹配的处理程序(或处理程序未返回任何内容),则URL将进入多层管道:

层级 费彻 战略
0 agentsweb.org 全局共享降价缓存--如果另一个代理已获取此URL,则立即执行
1 Cloudflare浏览器运行 JS/SPA渲染+降价提取-也支持 agentsweb.org (可选,需要API令牌)
1 Jina Reader 清洁降价提取服务
2 Wayback Machine 存档版本来自archive.org
2 Arquivo.pt 葡萄牙语网络档案(广泛的国际覆盖)
2 Common Crawl 从Common Crawle的索引+S3读取PB级web存档,不受源站速率限制、机器人检测或付费墙的约束
2 代码标签 CORS代理
3 Markdown端点 向网站请求本地Markdown版本(<path>.md + Accept: text/markdown)
3 archive.ph 通过时间映射API+隐形TLS获取的存档快照
3 原始获取 直接GET,带浏览器头+向下标记转换
3 隐形提取 通过获取抓取进行浏览器TLS指纹模拟(选择加入,见下文)
3 FlareSolverr Cloudflare/DoS Guard的真正浏览器挑战解决程序(选择加入,需要FlareSolvarr实例)
3 网络解锁器 商业解锁器API-住宅轮换+渲染+CAPTCHA(选择,BYO密钥,按请求付费)
4 RSS、CrossRef、语义学者、HN、Reddit 元数据/讨论回退
5 OG Meta Open Graph标签(保证回退)

第二层收割台并行运行。当多个成功时,最高质量的结果获胜。所有其他层都按顺序运行。

所有搬运工返回正确 标记语言 (标题、链接、粗体、表格、代码块)通过下拉菜单,而不是纯文本。

4.缓存

结果以TTL缓存在内存中(成功60分钟,失败5分钟)。LRU驱逐最多250次。缓存失败的URL以防止重新尝试已知的死URL。所有三个旋钮都可以通过以下方式配置 INTERCEPT_CACHE_TTL_MS, INTERCEPT_CACHE_FAILURE_TTL_MS,以及 INTERCEPT_CACHE_SIZE.

工具

fetch

获取一个URL并将其内容作为干净的标记返回。

  • url (字符串,必填)--要获取的URL
  • maxTier (数字,可选,1-5)——对于速度敏感的情况,请在此级别停止
  • maxLength (数字,可选,默认50000)--返回的最大字符数
  • startIndex (number,可选,默认为0)--分页长内容的字符偏移量
  • noCache (boolean,可选)--跳过会话和共享缓存并实时获取

长页面被截断为 maxLength 通知代理人 startIndex 继续内容。结构化输出报告 source, quality, contentLength, truncated, nextStartIndex,以及 cacheAgeSeconds 因此代理可以以编程方式在它们上进行分支。

直接图像URL(.png, .jpg, .gif, .webp,最多5MB)作为MCP返回 图像块 而不是文本,因此代理自己的视觉模型可以读取图表、示意图、屏幕截图和扫描的文档。结构化输出报告 source: "image", mimeType,以及 bytes.

fetch_batch

并行获取最多10个URL,每个URL都通过相同的处理程序/回退链。

  • urls (string[],必填,1-10)--要获取的URL
  • maxTier, noCache --如in 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,或 year
  • page (数字,可选,1-10)--分页结果页面

如果使用勇敢搜索API BRAVE_API_KEY 如果已设置,则SearXNG SEARXNG_URL 如果设置好,那么DuckDuckGo将成为不可靠的最后手段。 freshness 和 page 被DuckDuckGo回退忽略。

extract

从页面中提取特定值作为JSON,而不是markdown散文——当你需要特定数据时,而不是整个页面。每个域授权和代理的荣誉。

  • url (string,必填)--要从中提取的URL
  • selectors (对象,可选)--字段名称映射→ CSS选择器。每个值要么是一个选择器字符串(返回第一个匹配的文本),要么 { selector, attr?, all? } — attr 提取属性(例如。 href), all: true 将每个匹配项作为数组返回。
  • tables (boolean,可选)--将每个HTML表转换为行对象数组(否时默认为true selectors 已给出)。
{
  "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列表,最新的优先。重新取回其中任何一个都是即时的。

提示

research-topic

搜索主题并获取多源摘要的顶部结果。

  • topic (string)--要研究的主题
  • depth (字符串,默认值“3”)--要获取的顶部结果数

extract-article

获取一个URL并从内容中提取关键点。

  • url (string)--获取和汇总的URL

环境变量

变量 必填 描述
BRAVE_API_KEY 没有 勇敢搜索API 搜索关键字
SEARXNG_URL 否 自托管SearXNG实例URL(推荐)
GITHUB_TOKEN 否 GitHub令牌提高了问题/PR/发布处理程序的API速率限制
INTERCEPT_AUTH 否 域的JSON映射→ headers/cookie,用于获取您登录的内容(请参阅 每个域身份验证)
CF_API_TOKEN 无 具有“浏览器渲染-编辑”权限的Cloudflare API令牌
CF_ACCOUNT_ID 否 Cloudflare帐户ID(如果是必需的 CF_API_TOKEN 已设置)
USE_STEALTH_FETCH 否 设置为 true 启用隐形提取器(见下面的警告)
FLARESOLVERR_URL 否 URL FlareSolverr 实例(例如。 http://localhost:8191)解决Cloudflare/DoS Guard挑战
WEB_UNLOCKER_URL 无 GET模板(带 {url} 占位符和您的API密钥),用于商业网络解锁器,如ScrapingBee/SscraperAPI/ZenRows-最困难网站的付费最后手段
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 (见下文),或获取 勇敢搜索API密钥.

提取: 无需任何钥匙即可工作。集 CF_API_TOKEN + CF_ACCOUNT_ID 为JavaScript繁重的页面(SPA、React站点)启用Cloudflare浏览器运行(以前称为浏览器渲染)。

隐形获取(USE_Stealth_fetch)

使用风险自负。 启用后,这将添加一个提取器,使用以下命令模拟真实的浏览器TLS指纹(Chrome/Firefox密码套件、HTTP/2设置、标头顺序) 被刮伤了这可以绕过网站上的机器人检测和验证码触发器,否则这些触发器会阻止自动请求。

这个fetcher在常规原始fetch之后运行在第3层。如果原始获取被阻止(CAPTCHA,Cloudflare挑战,403),隐形获取器将通过浏览器模拟重试。

这可能会违反某些网站的服务条款。 拦截mcp的作者对如何使用此功能不承担任何责任。默认情况下,它处于禁用状态,必须明确选择加入。

挑战解决(FLARESOLVERR_URL)

隐形提取器模拟浏览器的TLS指纹,但它不能 执行 JavaScript挑战——因此受Cloudflare“检查您的浏览器”/DoS 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轮换的站点 和 真实浏览器渲染 和 一起处理验证码——一个商业解锁器是务实的答案。intercept-mcp支持任何解锁器,该解锁器通过带有 {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}'

拦截将(URL编码的)目标替换为 {url} 并将返回的HTML(或包装它的JSON)转换为markdown。它在第3层运行,作为免费获取者之后的最后付费手段,只有当设置了这个变量时——模板中的凭据只会发送到解锁器,而不会发送到目标。Bright Data的基于代理的Web Unlocker只是一个经过身份验证的代理,因此请使用 HTTPS_PROXY / INTERCEPT_PROXIES 取而代之的是。 此按请求计费。

带上自己的代理(HTTPS_proxy)

如果原始获取开始被标记,最有效的修复方法通常是干净的出站IP,而不是更花哨的指纹。拦截mcp符合标准 HTTPS_PROXY / HTTP_PROXY / NO_PROXY env变量,因此您可以通过已有的任何代理路由所有出站流量:

HTTPS_PROXY=http://user:pass@proxy.example.com:8080 npx intercept-mcp

这适用于任何HTTP(S)代理——一个自托管的Squid、一个Tailscale出口节点、一个运行5美元的VPS 3代理,或商业住宅代理(Bright Data、Oxylabs等)。隐形提取器和 got-scraping 电话也会自动接听。

代理旋转(INTERCEPT_PROXIES)

单个代理仍然呈现单个IP,该IP本身可以在负载下被标记。集 INTERCEPT_PROXIES 使用逗号或空格分隔的列表,拦截它们之间的mcp循环robins,当请求被阻止(HTTP 403、429、451、503)或出现错误时,自动通过下一个代理重试:

INTERCEPT_PROXIES="http://user:pass@p1.example.com:8080,http://user:pass@p2.example.com:8080,http://p3.example.com:8080" npx intercept-mcp

请求分布在列表中,被阻止的响应在放弃之前会通过不同的出口重试(最多3次尝试),因此少数廉价代理或多次列出的轮换住宅端点的行为就像一个池。 INTERCEPT_PROXIES 优先于 HTTPS_PROXY,按请求应用(因此隐身和归档.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→ 网络,复制 Cookie 对该域的任何请求的请求头。

安全模型——使用前请阅读此内容

  • 凭据只会转到配置的源。 标题被键入 正在联系的实际主机当拦截通过Jina、web存档、CORS代理、FlareSolverr或共享缓存获取页面时,这些中介会连接到 不同的 主机,因此您的cookie/令牌是 从不 发送给他们——只有直接获取来源才能携带它。
  • 经过身份验证的响应永远不会触及共享缓存。 当请求与 INTERCEPT_AUTH 入口、拦截不会对公众进行读写操作 agentsweb.org 缓存该URL——这样你的私人/付费内容就永远不会发布,你总是会得到 你的 经过身份验证的视图,而不是陌生人的匿名副本。(进程内会话缓存仍然适用。)
  • 将该值视为秘密。 它包含实时会话令牌。环境变量对进程及其子进程可见,可能会被捕获在shell历史记录或进程列表中——更喜欢机密管理器或未提交的env文件,永远不要提交。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。没有费率限制,没有验证码,聚合了谷歌+必应+DuckDuckGo+维基百科+Brave。

或者使用任何现有的SearXNG实例——只需设置 SEARXNG_URL 到其URL。

URL规范化

传入的URL会自动清理:

  • 条带60+跟踪参数(UTM、点击ID、分析、A/B测试等)
  • 删除哈希片段
  • 升级到HTTPS
  • 清除AMP伪影
  • 保留功能参数(ref, format, page, offset, limit)

SSRF保护

代理传递从不受信任的web内容中获取的URL,因此获取工具拒绝指向本地或内部基础设施的任何内容:环回和私有IPv4/IPv6范围、链接本地地址(包括 169.254.169.254 云元数据端点)、CGNAT、多播/保留范围和本地主机名(localhost, *.local, *.internal, *.home.arpa).检查文字IP,包括由URL解析器规范化的替代符号(十进制、十六进制);DNS未解析,因此指向私有IP的公共主机名不会被捕获。

内容质量检测

每一次清理结果都会根据质量进行评分。自动故障开启:

  • 验证码/Cloudflare挑战
  • 登录墙
  • 正文中的HTTP错误页
  • 200个字符以下的内容

需求

  • Node.js>=20
  • 基本使用不需要API密钥