关于 ScrapeCheck
ScrapeCheck 是一个 MCP 服务,会重新抓取来源页面以核验采集到的值。它为决定是否使用数据的 Agent 返回签名判定,并提供离线签名验证工具。
主要功能
- 01重新抓取来源页面核对声明
- 02使用 LLM 判定完整字段
- 03仅检查值是否存在
- 04Ed25519 签名判定
- 05离线验证判定结果
适用场景
- 01使用前核对采集到的价格
- 02Agent 采取行动前验证提取字段
- 03无需联网验证判定签名
MCP 相关
通过可流式 HTTP 向 MCP 客户端提供 `verify_web_field`、`verify_presence` 和 `get_verifier_info`。超出免费额度的调用通过带内 x402 支付。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://scrapecheck-mcp.fly.dev/mcpclaude mcp add --transport http scrapecheck https://scrapecheck-mcp.fly.dev/mcp{"mcpServers":{"scrapecheck":{"type":"http","url":"https://scrapecheck-mcp.fly.dev/mcp"}}}在 Cursor 中打开{"servers":{"scrapecheck":{"type":"http","url":"https://scrapecheck-mcp.fly.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"scrapecheck":{"type":"http","url":"https://scrapecheck-mcp.fly.dev/mcp"}}}{"mcpServers":{"scrapecheck":{"serverUrl":"https://scrapecheck-mcp.fly.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
3| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 声明所抓取自的源页面 URL |
| claim | object | 是 | 要与实时页面核对的抓取字段,例如 {"price": "£51.77", "in_stock": true} |
| asked | string | 是 | 要求抓取器提取的内容,例如 "get the current price and stock status" |
详细介绍
ScrapeCheck MCP:为 Agent 的支出流程增加验证环节
来找离线验证器? 就在这个仓库中:
tools/verify-verdict.mjs— 单文件,无 依赖,无需联网即可验证任何 ScrapeCheck 判定。 了解如何使用 →
如今,Agent 会找到服务提供方,通过 x402 付款,接收数据,然后据此采取行动。整个流程中,没有任何环节会询问数据是否真实。此服务补上了缺失的验证环节。在 Agent 根据获取或付费购买的值采取行动之前,它会发送来源 URL、该值以及查询内容;ScrapeCheck 会从自己的基础设施重新获取页面,并返回一个由 ed25519 签名的判定:pass、fail 或 unverifiable。绝不猜测,任何未经确认的结果都是 unverifiable,绝不会是 pass。
一行命令即可安装,Agent 可通过它已经用于消费的同一 x402 通道按次付费验证:无需 API 密钥,无需注册;在需要付款前提供免费额度;每个判定都可通过我们公布的密钥离线验证。
想在安装任何东西之前先看看判定结果?可在浏览器中前往 scrapecheck.fly.dev 免费运行一次检查。
四种集成方式(MCP、x402 原生集成、Apify、普通 HTTP),每种都附有经过测试的代码片段:scrapecheck.fly.dev/integrations
端点: https://scrapecheck-mcp.fly.dev/mcp(可流式传输的 HTTP)
付款: 带内 x402(Base 上的 USDC)——无需 API 密钥,无需注册。每个客户端身份都可先使用免费额度,之后才需要付款。
自行检查——你可以检验的三项内容: 离线验证任意判定 · 实时运行统计,包括未命中情况 · 基准测试及其局限
工具
verify_web_field— $0.01 — 完整验证:值存在于重新获取的实时页面中,页面由实时提供,并且独立的大模型评审器确认该值回答了所问的问题。正向判定:pass。verify_presence— $0.002 — 仅检查是否存在——不会确认该值是否回答了问题。正向判定:present,绝不会是pass。get_verifier_info— 免费 — 信任凭证:公钥、基准测试摘要、范围、端点。
它在 Agent 支出流程中的位置
支付通道回答的是谁在谁的授权下支付了什么。收据本身无误,但收据不包含有关数据的任何证据。此工具是接收数据与采取行动之间的步骤:Agent 即将信任每个值之前,都调用一次;价格与数据本身的成本同为几美分。
信任保障来自结构,而非统计
只有当 ScrapeCheck 独立重新获取页面并在页面上自行找到所声称的值时,才会认证该声明;如果评审器对声明的复述与实际声明不符,其投票会在机制上作废。缺失内容无法通过验证,替换内容也无法通过验证。任何未经确认的情况——跳过检查、获取失败、评审器出错——都会返回 unverifiable,绝不会是 pass。
基准测试提供了佐证(仅限完整验证):在 67 个冻结的标注案例中,没有一次错误通过(其中 26 个案例未参与任何校准,包括所声称的值出现在页面上、但实际指代错误内容的对抗性陷阱);在 21 个实时网页案例中也没有一次错误通过,其中包括 9 个对抗性陷阱。这只是对结构性防护措施的小样本佐证,并非总体准确率声明。
为什么要相信此服务自己的说法?
因为你不必相信。每个判定都基于除 signature 以外的所有字段,按键排序并规范化为 JSON 后进行 ed25519 签名;公钥通过 /pubkey 提供,也会通过 get_verifier_info 随响应一并返回;每个判定还携带一个引擎摘要,用于准确标识生成该判定的提示词和校准数据。你可以离线验证,无需信任传输渠道、门店或我们。
实时、未经筛选的运行统计——包括未通过的结果: scrapecheck.fly.dev/stats。只展示通过结果的验证器,什么也说明不了。
付款流程(带内 x402)
标准的 @x402/mcp v2 流程:超过免费额度后,未付款的调用会在工具结果中返回 PaymentRequired 挑战;使用任意 x402 v2 客户端付款(例如使用 EVM 签名者,通过 @x402/mcp 的 wrapMCPClientWithPaymentFromConfig),重试调用后会返回判定以及 _meta["x402/payment-response"] 中的链上结算信息。付款被拒绝或失败时,不会返回判定;若未能生成判定,也不会结算——只有工作完成后才会向你收费。
集成说明
- 完整的已签名判定对象位于线路上的
structuredContent中(在content[0].text中也以 JSON 形式逐字节保持一致)。注意:@x402/mcp的付费客户端便捷结果只会转发content——在那里解析content[0].text,或者使用普通 MCP 客户端读取structuredContent。 - 输入约定(固定):
{ url, claim, asked }——claim是一个字段值对象,例如{"price": "£51.77", "in_stock": true}。 - 范围(v1):服务器渲染的页面。客户端渲染(仅 JS)的内容会返回
unverifiable——绝不会错误地判定为fail或pass。 - 验证只针对当时的情况:判定通过意味着抓取页面时,页面上存在所声明的值,并不意味着页面本身是最新的。如果页面确实包含所声明的值,即使带有过时信号,仍可能通过。
- 同一引擎还以原始 x402 HTTP API 的形式提供(
https://scrapecheck.fly.dev/verify),也可作为 Scrape QA Apify actor 用于批量数据集验证。同一引擎、同一签名密钥、同一持久日志。
自行验证判定(离线)
此仓库提供了一个零依赖验证器——无需信任我们、传输渠道或此服务,即可检查任何 ScrapeCheck 判定:
$ node tools/verify-verdict.mjs examples/verdict.json
(2 keys fetched from https://scrapecheck.fly.dev/pubkey — pass --pubkey to verify fully offline)
VALID: signature verifies (signed by k2, active)
verdict: pass (confidence 0.97)
verdict_id: 17aa1a39-0e3f-42a7-a3f4-3cbf664f9786
check_type: web_field_v1
engine: web_field_v1/0.2.1+6739b7f9ebf8
key_id: k2 (envelope claim matches the verifying key)
issuer: https://scrapecheck.fly.dev (embedded pointer; keys were checked against the pinned origin, never the embedded URL)
source_hash: sha256:b2025003076927098d4aaeeb2d7f41554299a8d6d68f060745b18a0527749bf8 — fingerprint of the normalized page text this verdict judged. Comparable between verdicts with the same engine digest; not independently recomputable today.
$ echo $?
0
# flip a single field — "verdict": "pass" -> "fail" — and run it again
$ node tools/verify-verdict.mjs tampered.json
(2 keys fetched from https://scrapecheck.fly.dev/pubkey — pass --pubkey to verify fully offline)
INVALID: signature does not verify against any of the 2 published keys — the verdict was altered, or was not signed by this service
$ echo $?
1
省略 --pubkey 可从 /pubkey 获取当前密钥;传入该密钥(ed25519:… 字符串或已保存的 /pubkey 响应)即可完全离线验证。
examples/verdict.json 是一个真实的生产判定——更改任何字段都会导致验证失败。当且仅当该判定的 ed25519 签名通过对除 signature 外所有字段的规范化(递归按键排序)JSON 验证时,它才有效。采用 MIT 许可证——欢迎将约 40 行相关代码自由集成到你自己的工作流中。
2026 年 8 月新增的信封字段
新判定会携带三个额外的已签名字段。key_id 标识 /pubkey 归档中用于签署判定的密钥;此字段仅供参考——签名要么通过已发布的密钥验证,要么无法通过验证;如果声明与用于验证的密钥不匹配,则会显示警告。
verifier_url 是查询 /pubkey 和 /verdicts 的规范来源;它只是指向验证器主页的指针,绝不是信任根——验证器不得从文档本身提供的 URL 获取密钥,因此我们的验证器会固定使用已知来源,而嵌入的值仅用于显示和不匹配警告。
source_hash 是判定实际评估的规范化页面文本的 SHA-256 值,用于标识 refetched_at 时刻的页面状态。只有携带相同引擎摘要的判定之间,哈希相等才有意义;跨不同摘要时只能作为尽力而为的比较,并且目前只能进行判定之间的比较,无法独立重新计算。对于这些字段出现前签发的判定,验证方式与之前完全相同。
密钥轮换,2026 年 8 月
2026 年 8 月 6 日,ed25519 签名密钥被视为已泄露:一次操作失误将凭据文件放入了外部聊天频道。根据我们的原则——密钥一旦进入不可信频道,无论是否有人使用,都视为已泄露——我们在当天轮换了密钥。
没有任何判定结果受到影响。签名覆盖判定载荷,因此轮换前签发的判定结果保持不变,仍可用已退役密钥验证;该密钥作为 k1 永久发布在
/pubkey。之后签发的判定结果使用 k2 签名。离线验证器会尝试所有已发布的密钥,并报告匹配的是哪一个。
如果你持有由 k1 签名的判定结果,请确认其真伪。 来自已退役密钥的有效签名只能证明该密钥签署了判定结果,而不能证明这是我们签发的,因为任何持有已泄露私钥的人都能签署任意内容,包括重用真实 verdict_id 的伪造内容。因此,我们发布了签发记录:
GET https://scrapecheck.fly.dev/verdicts/<verdict_id>
该接口会返回我们是否签发了该 id;如果有相应记录,还会返回 signature_sha256——我们为该判定结果签发的签名的 SHA-256。ed25519 是确定性的,因此,对你副本中的签名进行哈希并进行比对,即可将你所持判定结果的确切内容与我们的记录绑定。匹配表示这就是我们签发的判定结果——签名内容完全相同。不匹配则表示有人在真实 id 下伪造了内容。该接口不会返回判定结果内容、客户端数据,也不会提供任何可枚举的信息。不带 --pubkey 运行验证器时,它会自动为任何由 k1 签名的判定结果执行此检查。
一个坦诚说明的限制。 2026 年 8 月 6 日之前没有记录签名哈希,因此对于大多数轮换前的判定结果,我们可以确认其签发事实,但无法绑定内容;这些记录会返回 content_binding: "unavailable_legacy",验证器也会报告 PARTIAL,而非确认通过。如果某个轮换前的判定结果可以通过曝光前发布的材料进行内容绑定——例如本仓库中的示例判定结果,其签名固定在公开的 Git 历史中,伪造者无法改写——记录会明确说明这一点并标注来源。通过我们仅私下保留的材料恢复的绑定会标记为 available_backfilled,因为绑定的可靠程度取决于其所依据材料的来源。所有轮换前的判定结果都是签发给我们自己的;没有外部客户持有此类判定结果。
随之而来的一项承诺。 由于签发记录是公开的,已记录的判定结果永远不能删除。若对我们确实签发过的判定结果报告 issued: false,就是在歪曲我们自己的历史,因此,保留记录如今已成为信任约定的一部分,而不再只是运营偏好。
此次泄露意味着:持有旧私钥的人可以生成能够通过旧公钥验证的伪造判定结果。他们无法更改任何已签发的判定结果,而且该密钥无法访问服务、日志或任何资金。目前尚未发现伪造的判定结果。
这是按设计运行的流程。我们将此事记录在这里,因为隐瞒自身事件的验证器,不配称为验证器。
关于此仓库
此仓库仅包含精简的 MCP 门面——传输、付款处理和工具注册。验证引擎(锚定重取、透镜、裁决器、签名密钥和基准测试样例)运行于 ScrapeCheck 源站,不属于此代码库。
更新日志
- 2026-08-13 — 实时统计页面曾将我们自己的测试流量计入总数;现在会分别统计自身、爬虫和外部流量。
/stats新增了一个traffic部分,公布这两项数字——包括external_paid,本次更改时该项为零,并会作为永久保留的指标名称。自身流量一直在持久化日志中标明;现在公开页面也会说明这一点。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。