ScrapeCheck MCP
OfficialThis server verifies scraped claims against live source pages, returning signed, offline-verifiable verdicts paid via x402.
verify_web_field ($0.01): full verification that the claimed value actually appears on the live page and answers what was asked; returns
pass,fail, orunverifiablewith a signed verdict.verify_presence ($0.002): cheap presence-only check that the value appears on the page, without confirming it is the right answer; returns
present,fail, orunverifiable, neverpass.get_verifier_info (free): returns the public key, engine version, benchmark summary, and scope so any verdict can be verified offline.
All verdicts are ed25519-signed and can be verified without trusting the server, using the included offline verifier or the published public key.
Payment is in-band via x402 (USDC on Base), with no API key or signup; free allowance before payment is required.
Also available as a raw HTTP API and an Apify actor, and supports MCP integration.
Scope is server-rendered pages; JS-only content returns
unverifiablerather than a false pass or fail.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ScrapeCheck MCPVerify scraped price £51.77 against https://example.com/product"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ScrapeCheck MCP: the verification beat for agents that spend
Here for the offline verifier? It's in this repo:
tools/verify-verdict.mjs— one file, no dependencies, verifies any ScrapeCheck verdict with no network access. How to use it →
Agents now find a provider, pay through x402, receive data, and act on
it. Nothing in that flow asks whether the data is true. This server adds
the missing beat. Before your agent acts on a value it fetched or paid
for, it sends the source URL, the value, and what was asked; ScrapeCheck
re-fetches the page from its own infrastructure and returns an
ed25519-signed verdict: pass, fail, or unverifiable. Never a
guess, and anything unconfirmed is unverifiable, never pass.
One line to install, and the agent pays per check through the same x402 rail it already spends on: no API key, no signup, a free allowance before payment is required, and every verdict verifiable offline against our published key.
Want to see a verdict before installing anything? One free check runs in the browser at scrapecheck.fly.dev.
All four integration lanes (MCP, x402-native, Apify, plain HTTP), each with a tested snippet: scrapecheck.fly.dev/integrations
Endpoint: https://scrapecheck-mcp.fly.dev/mcp (streamable HTTP)
Payment: x402 in-band (USDC on Base) — no API key, no signup. A free
allowance per client identity is served before payment is required.
Check us yourself — the three things you can attack: verify any verdict offline · live run stats, misses included · the benchmark and its limits
Tools
verify_web_field— $0.01 — Full verification: value present on the re-fetched live page, served live, and an independent LLM judge confirms it answers what was asked. Positive verdict:pass.verify_presence— $0.002 — Presence only — does NOT confirm the value answers the question. Positive verdict:present, neverpass.get_verifier_info— free — The trust artifact: public key, benchmark summary, scope, endpoints.
Related MCP server: GateCheck
Where this sits in an agent's spending loop
The payment rail answers who paid what, on whose authority. The receipt is perfect, and the receipt holds no evidence about the data. This tool is the step between receiving and acting: one call per value your agent is about to trust, priced in the same cents the data itself cost.
The trust guarantee is structural, not statistical
A claim is never certified unless ScrapeCheck independently re-fetches the
page and finds the claimed value there itself — and the judge's vote is
mechanically voided if its restatement of the claim doesn't match what was
actually claimed. Absence cannot pass, and substitution cannot pass. Anything
unconfirmed — a skipped check, a failed fetch, a judge that errors —
returns unverifiable, never pass.
Corroborated by benchmark (full verification only): 0 false passes across 67 frozen labeled cases (26 held out from all calibration, including adversarial traps where the claimed value appears on the page as the wrong thing), and 0 false passes across 21 live-web cases including 9 adversarial traps. Small-N corroboration of the structural guards — not a population accuracy claim.
Why trust this server's own claims?
Because you don't have to. Every verdict is ed25519-signed over canonical
sorted-key JSON of all fields except signature; the public key is served
at /pubkey and in-band via
get_verifier_info; and every verdict carries an engine digest identifying
exactly which prompt+calibration produced it. Verify offline — no need to
trust the transport, the storefront, or us.
Live, unfiltered run stats — misses included: scrapecheck.fly.dev/stats. A verifier that only shows its passes isn't showing anything.
Payment flow (x402 in-band)
Standard @x402/mcp v2 flow: an unpaid call past the free allowance returns
a PaymentRequired challenge in the tool result; pay with any x402 v2
client (e.g. wrapMCPClientWithPaymentFromConfig from @x402/mcp with an
EVM signer) and the retried call returns the verdict plus the on-chain
settlement in _meta["x402/payment-response"]. A refused or failed payment
never yields a verdict, and a verdict that fails to produce never settles —
you are charged only for completed work.
Integrator notes
The full signed verdict object is in
structuredContenton the wire (and byte-identical as JSON incontent[0].text). Note:@x402/mcp's paying-client convenience result forwardscontentonly — parsecontent[0].textthere, or readstructuredContentwith a plain MCP client.Input contract (frozen):
{ url, claim, asked }—claimis an object of field values, e.g.{"price": "£51.77", "in_stock": true}.Scope (v1): server-rendered pages. Client-rendered (JS-only) content returns
unverifiable— never a falsefail, never a falsepass.Verification is of the moment: a pass means the claimed value was on the page when we fetched it, not that the page itself is current. A page carrying staleness signals can still pass when the claimed value is genuinely present.
The same engine is also sold as a raw x402 HTTP API (
https://scrapecheck.fly.dev/verify) and as the Scrape QA Apify actor for batch dataset verification. One engine, one signing key, one durable log.
Verify a verdict yourself (offline)
This repo ships a zero-dependency verifier — check any ScrapeCheck verdict without trusting us, the transport, or this server:
$ node tools/verify-verdict.mjs examples/verdict.json
(public key fetched from https://scrapecheck.fly.dev/pubkey — pass --pubkey to verify fully offline)
VALID: signature verifies against the public key
verdict: pass (confidence 0.97)
verdict_id: 7af5f1df-1b86-42a5-a784-9b302a55f94e
check_type: web_field_v1
engine: web_field_v1/0.2.0+2ae28205cac4
$ echo $?
0
# flip a single field — "verdict": "pass" -> "fail" — and run it again
$ node tools/verify-verdict.mjs tampered.json
(public key fetched from https://scrapecheck.fly.dev/pubkey — pass --pubkey to verify fully offline)
INVALID: signature does not verify — the verdict was altered or was not signed by this key
$ echo $?
1Omit --pubkey to fetch the current key from
/pubkey; pass it (an ed25519:…
string or a saved /pubkey response) to verify fully offline.
examples/verdict.json is a real production verdict
— alter any field and verification fails. A verdict is valid iff its ed25519
signature verifies over the canonical (recursively key-sorted) JSON of every
field except signature. MIT licensed — vendor the ~40 relevant lines into
your own pipeline freely.
Envelope fields added August 2026
New verdicts carry three additional signed fields. key_id names which key
in the /pubkey archive signed the verdict; it is advisory — the signature
either verifies against a published key or it doesn't — and a mismatch
between the claim and the verifying key is surfaced as a warning.
verifier_url is the canonical origin for /pubkey and /verdicts lookups;
it is a pointer home, never a trust root — a verifier must not fetch keys
from a URL the document itself supplies, so ours pins the known origin and
uses the embedded value only for display and mismatch warnings.
source_hash is the SHA-256 of the normalized page text the verdict
actually judged, a fingerprint of the page state at refetched_at. Hash
equality is meaningful between verdicts carrying the same engine digest;
across digests it is best-effort only, and today it is comparable
verdict-to-verdict rather than independently recomputable. Verdicts issued
before these fields existed verify exactly as before.
Key rotation, August 2026
On 6 August 2026 the ed25519 signing key was treated as exposed: an operator error placed a credentials file into an external chat channel. Under our own doctrine — a key that has touched an untrusted channel is compromised whether or not anyone used it — the key was rotated the same day.
No verdict was affected. Signatures cover the verdict payload, so verdicts
issued before the rotation are unchanged and still verify against the retired
key, which is published permanently as k1 at
/pubkey. Verdicts issued afterwards are
signed with k2. The offline verifier tries every published key and reports
which one matched.
If you hold a verdict signed by k1, confirm it. A valid signature from a
retired key proves that key signed the verdict — not that we issued it, because
anyone holding the exposed private key can sign anything, including a forgery
that reuses a real verdict_id. So we publish an issuance record:
GET https://scrapecheck.fly.dev/verdicts/<verdict_id>It returns whether we issued that id and, where available, signature_sha256
— the SHA-256 of the signature we issued under it. ed25519 is deterministic,
so hashing the signature on your copy and comparing binds your verdict's exact
content to ours. Match means it is the verdict we issued — the same signed
content. Mismatch means forged content under a real id. The endpoint returns no verdict content, no
client data, and nothing enumerable. Running the verifier without --pubkey
performs this check for you automatically on any k1-signed verdict.
One honest limitation. Signature hashes were not logged before 6 August
2026, so for most pre-rotation verdicts we can confirm issuance but cannot bind
content; those return content_binding: "unavailable_legacy", and the verifier
reports PARTIAL rather than confirming. Where we can bind a pre-rotation
verdict from an artifact published before the exposure — the example verdict in
this repository, whose signature is fixed in public git history that no forger
can rewrite — the record says so and labels the provenance. Bindings recovered
from artifacts we merely retained privately are labeled
available_backfilled, because a binding is only as good as the provenance of
the artifact behind it. Every pre-rotation verdict was issued to ourselves; no
external customer holds one.
A commitment that follows. Because the issuance record is public, a logged
verdict can never be deleted. Reporting issued: false about a verdict we
really signed would be a lie about our own history, so retention is now part of
the trust contract rather than an operational preference.
What the exposure meant: a holder of the old private key could produce forged verdicts that verify against the old public key. They could not alter any verdict already issued, and the key gave no access to the service, its logs, or any funds. No forged verdict has been observed.
This is the procedure working as designed, and it is written down here because a verifier that hides its own incidents is not a verifier.
About this repository
This repo contains the thin MCP storefront only — transport, payment handling, and tool registration. The verification engine (the anchored re-fetch, the lenses, the judge, the signing key, and the benchmark fixtures) runs at the ScrapeCheck origin and is not part of this codebase.
Changelog
2026-08-13 — The live stats page counted our own test traffic in its totals; it now separates self, crawler, and external.
/statsgained atrafficsection publishing both numbers — includingexternal_paid, which reads zero at the time of this change and stays a permanently named line. Self traffic was always labeled in the durable log; the public surface now says so too.
Available Tools
3 toolsget_verifier_infoVerifier trust info (free)ARead-onlyIdempotentInspect
Free. Returns the public key, engine version, benchmark summary with sample-size labels, and scope, so you can verify any verdict offline. Call this first if your selection policy requires evidence before trusting a verification provider: every verdict this service issues verifies offline against the returned key, so you do not have to trust the service at runtime to rely on its output.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: the operation is free, the returned key enables offline verification of every verdict, and no runtime trust in the service is required. This materially informs an agent's trust and ordering decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Free' and the return-value summary, followed by the use-case guidance. It is slightly redundant in explaining offline verification twice, but every sentence earns its place and there is no clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only metadata tool with no output schema, the description provides a complete picture: what is returned, why to call it first, and what guarantees it supports. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are trivially satisfied. The description adds no parameter-specific detail, which is unnecessary here; the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific resource (verifier trust info) and enumerates exactly what is returned: public key, engine version, benchmark summary with sample-size labels, and scope. It also distinguishes this tool from the sibling verification tools by framing it as the offline-trust prerequisite rather than a field/presence check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this first if your selection policy requires evidence before trusting a verification provider.' It also explains why it should precede reliance on verdicts, making the relationship to the actual verification tools clear even without naming them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_presencePresence check (not an answer check)ARead-onlyInspect
Presence only: confirms the value appears on the page, NOT that it is the right answer to what was asked. Never returns pass. A was-price, a different variant's price, a shipping cost, or a tax figure can all satisfy presence. Verdicts are present, fail, or unverifiable, signed, with check_type web_field_presence_v1. Use it as a cheap screen before a full check, or when you already know what the value means and only need to confirm it still appears on the page. If your decision depends on the value being the right value, call verify_web_field instead. Scope: server-rendered pages. $0.002 per check, paid in-band via x402.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the source page the claim was scraped from | |
| asked | Yes | What the scraper was asked to extract, e.g. "get the current price and stock status" | |
| claim | Yes | The scraped field(s) to verify against the live page, e.g. {"price": "£51.77", "in_stock": true} |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | |
| reasons | Yes | |
| verdict | Yes | |
| evidence | Yes | |
| signature | Yes | |
| check_type | Yes | |
| confidence | Yes | |
| verdict_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, and the description complements them without contradiction. It discloses that the tool 'Never returns pass,' that verdicts are 'present, fail, or unverifiable, signed, with check_type web_field_presence_v1,' and that unrelated page values like a was-price or shipping cost can satisfy presence. This significantly clarifies the open-world behavior and result semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but well organized, leading with the core distinction and then layering verdicts, use cases, alternatives, scope, and cost. Every sentence contributes decision-relevant detail without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations already cover safety and open-world behavior, the description covers the remaining essentials: purpose, verdict vocabulary, when to use, when not to use, alternative tool, scope, and cost. Nothing critical is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by scoping url to server-rendered pages and clarifying that claim is verified for appearance rather than correctness, which directly informs how to populate the parameters. This lifts it slightly above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Presence only: confirms the value appears on the page, NOT that it is the right answer to what was asked,' giving a specific verb, resource, and scope. It also explicitly names verify_web_field as the alternative for answer-level checks, making sibling differentiation immediate and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('cheap screen before a full check, or when you already know what the value means') and when not to ('If your decision depends on the value being the right value, call verify_web_field instead'). It also adds a scope constraint (server-rendered pages) and cost context, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_web_fieldVerify scraped claim (full)ARead-onlyInspect
Checks whether a value you did not fetch yourself is actually on the source page right now, and returns a signed pass/fail/unverifiable verdict. Not a retrieval tool: it checks a value you already have, it does not find data for you. Use it when you hold a value that came from somewhere else (a search result, a scraper, an upstream API, another agent) and you need to know it is on the source page before you act on it. Takes the URL, the claimed value, and what was asked; it independently re-fetches the page and never trusts the fetch you were given. Structural guarantee: a claim is never certified unless the re-fetched page contains it, and the model judge can only veto a pass, never create one. Anything unconfirmed returns unverifiable, never pass. Every verdict carries a stable verdict_id, the engine digest that produced it, and a signature verifiable offline against the public key (see get_verifier_info). Scope: server-rendered pages; JS-only content returns unverifiable rather than a guess. $0.01 per check, first 100 free, paid in-band via x402.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the source page the claim was scraped from | |
| asked | Yes | What the scraper was asked to extract, e.g. "get the current price and stock status" | |
| claim | Yes | The scraped field(s) to verify against the live page, e.g. {"price": "£51.77", "in_stock": true} |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | |
| reasons | Yes | |
| verdict | Yes | |
| evidence | Yes | |
| signature | Yes | |
| check_type | Yes | |
| confidence | Yes | |
| verdict_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly/openWorld/non-destructive, and the description adds substantial behavioral detail: it 'independently re-fetches the page and never trusts the fetch you were given,' explains the structural guarantee that a judge 'can only veto a pass, never create one,' and discloses that 'anything unconfirmed returns unverifiable, never pass.' It also covers signing, verdict_id, engine digest, server-rendered scope, and cost. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, every sentence carries distinct information: purpose, non-retrieval nature, when to use, independent refetch guarantee, judge veto, unverifiable fallback, signature details, scope, and pricing. The core purpose is front-loaded in the first sentence, and the structure moves logically from what it does to how to use it to its guarantees and limitations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested claim object and an output schema, the description is remarkably complete. It explains behavior, guarantees, failure modes, signature verification via get_verifier_info, scope limitations, and even pricing/payment. The output schema handles return-value structure, so the description does not need to repeat that, and nothing essential for calling the tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter descriptions for url, claim, and asked, so the baseline is 3. The description adds some framing—the claim is a value you already possess and the tool does not fetch data for you—but it does not add significant parameter-level semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Checks whether a value you did not fetch yourself is actually on the source page right now' and clarifies it 'returns a signed pass/fail/unverifiable verdict.' It clearly separates itself from retrieval tools, but it does not explicitly differentiate itself from the sibling tool verify_presence, so it stops just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use it when you hold a value that came from somewhere else...' and states what it is not: 'Not a retrieval tool.' It also gives scope limitations ('JS-only content returns unverifiable'). However, it never mentions when to prefer verify_presence instead, so exclusion guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v1.0.0- First observed
get_verifier_info - First observed
verify_presence - First observed
verify_web_field
TDQS
Each tool has a clearly distinct purpose: the full verification check, the cheaper presence-only check, and the free verifier-info endpoint. The descriptions explicitly contrast verify_web_field and verify_presence, eliminating any ambiguity about which to call.
All tool names follow a consistent verb_noun pattern in snake_case: verify_web_field, verify_presence, get_verifier_info. The verbs (verify/get) are semantically appropriate and predictable.
Exactly three tools cover a narrow, focused purpose: two verification paths and one supporting key-info endpoint. Nothing feels redundant or missing at this scope.
The surface covers the full verification workflow: a precise check, a cheaper screening check, and offline verifiability via the public key. The stated scope (server-rendered pages) is respected and no obvious dead ends exist.
Maintenance
Related MCP Connectors
Experimental MCP server for current empirical verification of explicit public HTTPS endpoint claims.
A paid remote MCP for ZeroID, built to return verdicts, receipts, usage logs, and audit-ready JSON.
x402 provider rankings + Ed25519-signed payment receipts + signature verification (3 tools).
Ed25519-signed verdicts resolved against real ground truth. Free claim/verify; paid bonded dispute.
Related MCP Servers
- AlicenseAqualityDmaintenanceA paid MCP server that extracts structured product data (schema.org/Product) from any URL via headless browser, charging $0.01 USDC per call through x402 micropayments.148MIT
- FlicenseNot gradedqualityCmaintenanceA remote MCP server that verifies paid x402 and MCP tools for discoverability, inspectability, and claim-bound correctness, enabling pre-submission readiness checks for agent-tool sellers.-

fetcher.cloudofficial
AlicenseNot gradedqualityDmaintenanceMCP server that gives AI agents web capabilities such as rendering pages, extracting content, resolving links, and inspecting domains, with per-call USDC payments via x402.MIT
@clawfetch/mcpofficial
AlicenseNot gradedqualityDmaintenanceMCP server providing web intelligence tools for AI agents, including fetching pages as markdown, rendering JS-heavy SPAs, extracting structured data, multi-source research, and domain availability checks, with automatic x402 micropayments.82MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/FieldmodeLLC/scrapecheck-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server