SuperAPI AI 工具集

fetch-guard

fetch-guard 是一个 MCP 服务器与 CLI 工具,用于抓取 URL 并返回干净、适合 LLM 使用的 Markdown,同时附带元数据与多层提示注入防御。它内置专门的提取流水线,可对 HTML 进行净化、提取结构化元数据、检测提示注入尝试,并处理机器人拦截、付费墙、登录墙、非 HTML 内容类型以及需要 JavaScript 渲染的页面等边缘情况。其注入防御分为三层:提取前净化隐藏元素与不可见 Unicode,四阶段模式扫描(含多语言、同形字、编码与 ROT13 检测),以及每次调用生成随机盐值的内容边界包裹。工具提供单一 fetch 工具,支持超时、字数限制、JS 渲染和链接提取等参数配置。

访问官网

工具介绍

用途

fetch-guard 解决的核心问题是:LLM 需要网页内容,但原始 HTML 既嘈杂又可能带有敌意。抓取的页面可能包含隐藏文本、不可见 Unicode、屏幕外元素,甚至内容本身嵌入的提示注入尝试。该流水线在内容到达模型之前会剥离所有这些内容。

它是一个 MCP 服务器和 CLI 工具,用于抓取 URL 并返回干净、适合 LLM 使用的 Markdown,同时附带元数据与多层提示注入防御。

主要能力

三层注入防御

  1. 提取前净化:移除隐藏元素(display:none、visibility:hidden、opacity:0、font-size:0、transform:scale(0)、clip:rect(0,0,0,0)、零高度溢出容器,以及前景色与背景色匹配的元素)、通过 <style> 标签中 CSS 类/ID 规则隐藏的元素、屏幕外定位内容、aria-hidden 元素、<noscript> 和 <template> 标签,以及 26 类非打印 Unicode 字符(包括双向隔离符和 Unicode Tags)。此步骤在内容提取之前执行,因此 trafilatura 不会看到攻击向量。

  2. 模式扫描:对提取的文本和元数据字段运行四阶段扫描。第一阶段应用 50 个编译正则模式,覆盖系统提示覆盖、忽略先前指令、角色注入、伪造对话标签和隐藏指令标记,支持英语、西班牙语、法语、德语、日语、简体中文和葡萄牙语。第二阶段通过 NFKC 和易混淆字符映射规范化文本,然后重新扫描以捕获同形字绕过(例如用西里尔字母或数学 Unicode 字符替换拉丁字母)。第三阶段查找 base64、十六进制编码和 URL 百分号编码块,解码后针对高严重性模式扫描。第四阶段用 ROT13 解码整个文档并针对高严重性模式扫描。元数据字段(title、description、og:title 等)独立扫描,匹配结果按来源字段命名空间化。

  3. 会话加盐输出包裹:每次调用生成随机 8 字符十六进制盐值,并将正文包裹在 <fetch-content-{salt}> 标签中。由于盐值不可预测,注入内容无法伪造包裹边界。

单一工具 MCP 服务器

这是一个单工具 MCP 服务器,只暴露一个工具——fetch——在一致的接口后运行完整提取流水线。无需工具选择、路由或多步工作流。一个 URL 输入,一个结构化结果输出,可通过参数配置。

流水线 13 步序列

从 URL 到结构化输出运行 13 步序列:

  1. /llms.txt 预检:在完整抓取前检查域名根目录的 /llms.txt。如果请求的 URL 是域名根且 /llms.txt 存在,该内容将完全替代常规 HTML 流水线。
  2. 抓取:通过 requests 发起静态 HTTP 请求,或设置 --js 时使用 Playwright 驱动浏览器渲染。两者之间无自动回退:--js 是显式选择加入。
  3. 边缘检测:对响应分类,识别机器人拦截(Cloudflare 挑战、带拦截签名的 403/429/503、LinkedIn 自定义 999)、付费墙(订阅提示、高级覆盖层)和登录墙(登录重定向、仅会员模式)。
  4. 自动重试:机器人拦截触发一次使用完整 Chrome User-Agent 字符串的重试,然后报告。付费墙和登录墙立即报告,不重试。
  5. 内容类型路由:非 HTML 响应走快速路径:JSON 渲染为围栏代码块,RSS/Atom 提要解析为结构化摘要,CSV 转为 Markdown 表格(上限 2,000 行),纯文本直接通过。二进制内容类型被拒绝。
  6. HTML 净化:剥离隐藏元素(包括扩展 CSS 可见性技术、颜色匹配文本和 <template> 标签)、屏幕外定位内容、aria-hidden 节点、<noscript> 标签和非打印 Unicode。返回所有移除项的统计。
  7. 内容提取:trafilatura 将净化后的 HTML 转换为保留链接的 Markdown。
  8. 元数据提取:按优先级从三个来源提取标题、作者、日期、描述、规范 URL 和图像:JSON-LD、Open Graph,然后是 meta 标签。
  9. 链接提取:两种模式:domains 返回排序的唯一外部域名列表,full 返回按域名分组的所有外部 URL 及锚文本。
  10. 注入扫描:四阶段扫描(详见上文)。每个匹配记录模式名称、严重性(高/中)和 60 字符上下文片段。
  11. 大小保护 + 截断:默认情况下,内容超过 2MB(提取前)或 20KB(提取后)会引发错误并建议 max_words 值。设置 --max-words 会禁用两个限制并改为截断。
  12. 盐值包裹:正文被包裹在会话加盐标签中,实现纵深防御。
  13. 输出格式化:CLI 生成五个纯文本部分(状态头、正文、元数据、链接、注入详情)。MCP 服务器返回具有相同数据的结构化 JSON 字典。

使用方式

安装

对于 JavaScript 渲染(可选):

配置 MCP 客户端:将以下内容添加到 MCP 客户端配置中。适用于 Claude Code、Claude Desktop、Cursor 或任何兼容 MCP 的客户端。

通过 uvx(推荐):

通过 pip install:

注意:Docker 镜像不包含 Playwright。通过 Docker 运行时 JavaScript 渲染(js: true)不可用。如需 JS 渲染,请使用 uvx 或 pip install。

验证连接

让 AI 助手抓取任意 URL。如果返回带有状态头、元数据和风险评估的结构化内容,则已连接。

Claude Code Skill

将 resources/fetch-guard/ 复制到项目中的 .claude/skills/fetch-guard/,或使用独立命令文件 resources/fetch-guard.md 作为 Claude Code 命令。

CLI 输出

五个部分打印到 stdout:

  • 状态头:URL、抓取时间戳、风险标志(OK 或 INJECTION WARNING)、净化统计、检测到的边缘情况信息
  • 正文:包裹在 <fetch-content-{salt}> 标签中的干净 Markdown
  • 元数据:包含标题、作者、日期、描述、规范 URL、图像的 JSON 块
  • 外部链接:域名列表或按域名分组的完整 URL 细分
  • 注入详情:每个匹配的模式名称、严重性和上下文片段(仅在检测到模式时出现)

严格模式

设置 --strict 且风险级别为 HIGH 时,CLI 以代码 2 退出,MCP 服务器引发错误响应。两种情况下完整结果仍然可用。

适用场景

  • 需要将网页内容安全地提供给 LLM 的应用
  • 构建 MCP 客户端(Claude Code、Claude Desktop、Cursor 等)并需要可靠网页抓取
  • 需要防御提示注入的自动化内容处理流水线
  • 需要处理机器人拦截、付费墙、登录墙等边缘情况的抓取任务

限制

  • Docker 镜像不包含 Playwright,因此通过 Docker 运行时 JavaScript 渲染(js: true)不可用。
  • 静态请求与 Playwright 渲染之间无自动回退,--js 是显式选择加入。
  • 默认情况下,内容超过 2MB(提取前)或 20KB(提取后)会引发错误;设置 --max-words 可禁用限制并改为截断。
  • 二进制内容类型被拒绝。
  • CSV 转 Markdown 表格上限为 2,000 行。

测试与 CI

测试套件分两层:

  • 单元测试(424 个,全部模拟——无网络调用):每个模块都有对应的测试文件。CI 在每次推送和 PR 时针对 Python 3.10、3.12 和 3.13 运行完整套件。
  • 实时集成测试(54 个条目,真实网络):实时套件是数据驱动的:tests/catalogs/ 中的五个 YAML 目录定义带类型断言的 URL 条目。单个参数化运行器(test_catalog.py)评估所有条目。实时测试在发布时通过单独的 live-tests.yml 工作流自动运行。

CI 通过 GitHub Actions 在推送和 PR 到 main 时运行,针对 Python 3.10、3.12 和 3.13 测试。