Agent-payable web data over x402: 18 keyless services an agent pays per call.
io.github.mercuryx402/mercury-x402-mcp (MCP) Server
The io.github.mercuryx402/mercury-x402-mcp server provides agent-payable web data over x402. It exposes 18 keyless services that an agent pays per call, aligning with Model Context Protocol (MCP) usage for integrating tool-based web data access into agent workflows.
π οΈ Key Features
Agent-payable web data delivery over x402
18 keyless services
Per-call payment model for agents
π Use Cases
Agent payments tied to web data retrieval over x402
Building MCP-based systems that integrate web-scraping/provenance-oriented data access
β‘ Developer Benefits
Clear mapping to MCP: βmodel-context-protocolβ support in the tooling
Tool discovery via a fixed set of 18 services
β οΈ Limitations
Scope limited to web data over x402 and the 18 listed keyless services
VERIFIABLE keyless web-read for autonomous agents. Every result ships a cryptographically SIGNED provenance receipt (EIP-191 over sha256(text)+url+status+time) β the wedge a free scraper structurally CANNOT match: Jina r.jina.ai is free+keyless too, but its bytes are HEARSAY (no proof of what/where/when). MERCURY's `attestation` is ecrecoverable OFFLINE, forever, by you OR any downstream agent you forward the bytes to β proving the content is genuine + untampered (key pinned at /.well-known/mercury-attestation). For RAG, trading and agent-to-agent commerce that need provenance, that is the gap between data and evidence. Beyond that it's the keyless web-read primitive β NO API key, NO signup, NO account, NO monthly plan, the one fetch SKU a fresh agent can onboard to by itself instead of stopping to ask a human for a key. Give a ?url= and get back clean readable page text + title + status. Agent-native extras (opt-in): ?format=markdown for structure-preserving markdown, ?links=1 for an outbound-link graph (crawl frontier), and the headline wedge β STRUCTURED EXTRACT: ?extract=title,price,author,publishedAt returns a clean JSON record { title, price, author, publishedAt }, an LLM-ready row not a wall of text. That is Firecrawl's paid 'JSON mode' (they need an LLM call + an API key for it) done here DETERMINISTICALLY from the page's own JSON-LD/OpenGraph/meta/microdata β keyless, no LLM, $0.003. (?extract=1 still returns the legacy description + wordCount.) The extracted record is folded into the SIGNED attestation too, so a buyer can prove the FIELDS β not just the raw bytes β are exactly what MERCURY resolved. You pay in-band over HTTP 402 (x402, USDC on Base mainnet) β the wedge those tools can't match: they ALL gate behind a human-created API key + a credit-card plan, so an agent can't onboard itself. This one an agent finds in the x402 Bazaar and pays with zero human in the loop. Honest charge-per-ATTEMPT: every call returns a structured result (success OR an ok:false failure with a reason) β never a silent charge-then-500. Follows redirects, SSRF-guarded, 5s timeout, 10MB cap. Pure data, no mint β delivers in prod. β $0.003/call
Parameters4
url
string
required
the page to fetch (http/https)
format
string
optional
text (default) or structure-preserving markdown
links
string
optional
1 = also return the outbound-link graph (crawl frontier)
extract
string
optional
1 = page description + wordCount; OR a comma-list of field names (e.g. title,price,author,publishedAt) to get a structured JSON record under `extract`
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to fetch (http/https)"
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"description": "text (default) or structure-preserving markdown"
},
"links": {
"type": "string",
"enum": [
"0",
"1"
],
"description": "1 = also return the outbound-link graph (crawl frontier)"
},
"extract": {
"type": "string",
"maxLength": 256,
"description": "1 = page description + wordCount; OR a comma-list of field names (e.g. title,price,author,publishedAt) to get a structured JSON record under `extract`"
}
},
"required": [
"url"
],
"additionalProperties": false
}
extract
TYPED structured extract for autonomous agents β URL + schema β a clean, type-safe JSON record. Where /buy/fetch returns page TEXT (and ?extract= returns string-only fields), THIS returns the schema-conformant object an LLM/RAG/trading pipeline actually consumes: pass ?url=β¦&schema=title,price:number,rating:number,inStock:boolean and get back { title:"β¦", price:19.99, rating:4.5, inStock:true } β numbers as numbers, booleans as booleans, absent fields null (honest). `schema` accepts the URL-friendly compact form (field[:type], type in string|number|integer|boolean) OR a Firecrawl/OpenAI-style JSON-Schema object ({"properties":{"price":{"type":"number"}}}). That is Firecrawl's paid 'JSON mode' headline guarantee β type-safety, 'numbers as numbers not strings' β done DETERMINISTICALLY from the page's own JSON-LD/OpenGraph/meta/microdata: keyless, NO LLM call, NO API key, NO signup, $0.004/call, paid in-band over HTTP 402 (x402, USDC on Base mainnet). The typed record is folded into the SIGNED provenance attestation too (EIP-191, ecrecoverable OFFLINE), so a buyer can prove the EXTRACTED FIELDS β not just raw bytes β are exactly what MERCURY resolved. Honest charge-per-ATTEMPT: every call returns a structured result (success OR an ok:false reason). Same SSRF guard, 5s timeout, 10MB cap, no mint. β $0.004/call
Parameters3
url
string
required
the page to extract from (http/https)
schema
string
required
fields to extract. COMPACT: comma list of field[:type] (type in string|number|integer|boolean, default string), e.g. title,price:number,rating:number,inStock:boolean. OR a JSON-Schema string ({"properties":{"price":{"type":"number"}}}). Resolved from JSON-LD/OpenGraph/meta/microdata.
format
string
optional
optional: text (default) or markdown for the page-text field
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to extract from (http/https)"
},
"schema": {
"type": "string",
"maxLength": 1024,
"description": "fields to extract. COMPACT: comma list of field[:type] (type in string|number|integer|boolean, default string), e.g. title,price:number,rating:number,inStock:boolean. OR a JSON-Schema string ({\"properties\":{\"price\":{\"type\":\"number\"}}}). Resolved from JSON-LD/OpenGraph/meta/microdata."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"description": "optional: text (default) or markdown for the page-text field"
}
},
"required": [
"url",
"schema"
],
"additionalProperties": false
}
markdown
URL β clean, LLM-ready markdown (boilerplate/nav/ads stripped, headings + lists + links preserved) with a signed provenance receipt pinning the markdown to its source β the RAG-ingest primitive. Deterministic (no LLM): same URL + same source bytes β byte-identical markdown. β $0.005/call
Parameters1
url
string
required
the page to convert to markdown (http/https)
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to convert to markdown (http/https)"
}
},
"required": [
"url"
],
"additionalProperties": false
}
metadata
URL β one typed, SIGNED metadata record (JSON-LD + OpenGraph + Twitter-card + standard <meta> + canonical + title), by source. Deterministic, keyless, no LLM β the social-card/SEO/schema.org record an agent can PROVE. β $0.006/call
Parameters1
url
string
required
the page to read metadata from (http/https)
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to read metadata from (http/https)"
}
},
"required": [
"url"
],
"additionalProperties": false
}
links
URL β a SIGNED outbound/internal link graph: every <a href> as an absolute URL + anchor text, classified internal vs external against the page origin, grouped by origin with a third-party-origin histogram (privacy-audit) and same/cross-origin counts (SEO). Deterministic β same page bytes β byte-identical graph; no LLM. Covers <a> hyperlinks only (not rel/asset tags). Receipt = EIP-191 over the graph. β $0.005/call
Domain β signed, timestamped per-AI-crawler allow/block audit from robots.txt + llms.txt + ai.txt (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Bytespider, β¦). Deterministic, no LLM. EU-AI-Act / TDM opt-out evidence: the signed verdict proves the crawler policy as it stood at fetch time. β $0.005/call
Parameters2
domain
string
required
domain or URL to audit (e.g. example.com or https://example.com/page); only the origin is used
path
string
optional
optional path to evaluate the verdict for (default '/', the whole-site question)
Raw schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"maxLength": 2048,
"description": "domain or URL to audit (e.g. example.com or https://example.com/page); only the origin is used"
},
"path": {
"type": "string",
"maxLength": 1024,
"description": "optional path to evaluate the verdict for (default '/', the whole-site question)"
}
},
"required": [
"domain"
],
"additionalProperties": false
}
diff
URL + prior content-hash (or prior text) -> refetch, deterministic change-proof: changed? + a NEW signed receipt binding fromHash->toHash. Stateless; receipts chain into a tamper-evident audit trail of a page's evolution. Keyless x402, Base mainnet USDC. β $0.006/call
Parameters4
url
string
required
the page to re-fetch + diff (http/https)
prevHash
string
optional
prior content hash (0x + 64 hex sha256) from an earlier MERCURY fetch/diff receipt. Gives a hash-only change-proof (changed? true/false). Use this OR prevText.
prevText
string
optional
prior page text to diff against. Gives a full deterministic line-level diff (added/removed counts + unified-style hunk) on top of the change-proof. Use this OR prevHash.
format
string
optional
compare cleaned text (default) or structure-preserving markdown
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to re-fetch + diff (http/https)"
},
"prevHash": {
"type": "string",
"maxLength": 66,
"description": "prior content hash (0x + 64 hex sha256) from an earlier MERCURY fetch/diff receipt. Gives a hash-only change-proof (changed? true/false). Use this OR prevText."
},
"prevText": {
"type": "string",
"maxLength": 262144,
"description": "prior page text to diff against. Gives a full deterministic line-level diff (added/removed counts + unified-style hunk) on top of the change-proof. Use this OR prevHash."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"description": "compare cleaned text (default) or structure-preserving markdown"
}
},
"required": [
"url"
],
"additionalProperties": false
}
notarize
Notarize any content (inline ?content= or a fetched ?url=) into a signed, offline-verifiable provenance receipt β sha256 contentHash + witnessed timestamp, attested by Mercury's pinned key. Deterministic, keyless, no LLM. The signed receipt is the product: it witnesses that these exact bytes existed in this exact form at this time (the one thing your own sha256() can't β a third-party witness). β $0.008/call
Parameters2
url
string
optional
a page (http/https) to fetch + notarize its cleaned text. Provide EITHER url OR content, not both.
content
string
optional
inline content (UTF-8, β€256KB) to notarize directly β bytes you already hold. Provide EITHER url OR content, not both.
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "a page (http/https) to fetch + notarize its cleaned text. Provide EITHER url OR content, not both."
},
"content": {
"type": "string",
"maxLength": 262144,
"description": "inline content (UTF-8, β€256KB) to notarize directly β bytes you already hold. Provide EITHER url OR content, not both."
}
},
"required": [],
"additionalProperties": false
}
headers
URL β a deterministic HTTP security-headers audit (HSTS, CSP, X-Frame, X-Content-Type, Referrer-Policy, Permissions-Policy + more) with a letter grade and concrete findings, wrapped in a signed, offline-verifiable provenance receipt. Keyless, no LLM, no signup. β $0.005/call
URL in β the page's main HTML <table>(s) parsed into typed, header-keyed rows (JSON) + clean RFC-4180 CSV, with a signed provenance receipt over the exact extracted grid. Deterministic, keyless, no LLM β x402, USDC on Base mainnet. β $0.006/call
Parameters3
url
string
required
the page to extract tables from (http/https)
table
string
optional
optional: 0-based index of a SINGLE table to return (document order). Omit to return ALL tables found (up to the cap).
format
string
optional
optional: which serialisations to include in `data` (default: both).
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to extract tables from (http/https)"
},
"table": {
"type": "string",
"maxLength": 8,
"description": "optional: 0-based index of a SINGLE table to return (document order). Omit to return ALL tables found (up to the cap)."
},
"format": {
"type": "string",
"enum": [
"both",
"json",
"csv"
],
"description": "optional: which serialisations to include in `data` (default: both)."
}
},
"required": [
"url"
],
"additionalProperties": false
}
feed
RSS/Atom feed URL β a SIGNED, normalized item list [{title,link,published,summary}] unified across RSS 2.0/RDF + Atom 1.0: CDATA unwrapped, HTML stripped, entities decoded, dates β ISO-8601 (publishedRaw kept verbatim, never fabricated). Deterministic β same feed bytes β byte-identical items; no LLM. Core 4 fields only (not full-content/media/author). Receipt = EIP-191 over the canonical item list. β $0.005/call
URL β a signed uptime/status probe: up/down, HTTP status + class, reachability reason, final URL after redirects, and a measured responseMs β wrapped in an offline-verifiable provenance receipt that makes "it was up/down at T" provable SLA evidence. Deterministic verdict (responseMs is telemetry, not signed). Keyless, no LLM, no signup. β $0.005/call
Parameters1
url
string
required
the endpoint/page to probe for availability (http/https)
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the endpoint/page to probe for availability (http/https)"
}
},
"required": [
"url"
],
"additionalProperties": false
}
validate
URL (a JSON/API endpoint) + a JSON Schema in β a deterministic pass/fail with per-field errors (missing/wrong-type/enum/range/pattern), plus a signed provenance receipt binding the verdict to the exact response bytes AND the exact schema. Deterministic, keyless, no LLM β x402, USDC on Base mainnet. β $0.005/call
Parameters3
url
string
required
the JSON/API endpoint to fetch + validate (http/https)
schema
string
required
the JSON Schema to validate against. THREE accepted forms: (1) COMPACT URL-native comma list of field[:type] (type in string|number|integer|boolean|array|object|null; default string), e.g. id:integer,name,price:number,inStock:boolean β every field becomes a REQUIRED typed property; (2) a JSON-Schema string (Draft-07 core subset: type/required/properties/items/enum/const/min*/max*/pattern/format/additionalProperties/nullable/anyOf/oneOf/allOf/not); (3) a shorthand-map string {"id":"integer","name":"string"}.
pointer
string
optional
optional JSON-Pointer (e.g. /data or /result/0) to validate a SUB-DOCUMENT of the response instead of the whole body (for APIs that wrap the payload).
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the JSON/API endpoint to fetch + validate (http/https)"
},
"schema": {
"type": "string",
"maxLength": 16384,
"description": "the JSON Schema to validate against. THREE accepted forms: (1) COMPACT URL-native comma list of field[:type] (type in string|number|integer|boolean|array|object|null; default string), e.g. id:integer,name,price:number,inStock:boolean β every field becomes a REQUIRED typed property; (2) a JSON-Schema string (Draft-07 core subset: type/required/properties/items/enum/const/min*/max*/pattern/format/additionalProperties/nullable/anyOf/oneOf/allOf/not); (3) a shorthand-map string {\"id\":\"integer\",\"name\":\"string\"}."
},
"pointer": {
"type": "string",
"maxLength": 256,
"description": "optional JSON-Pointer (e.g. /data or /result/0) to validate a SUB-DOCUMENT of the response instead of the whole body (for APIs that wrap the payload)."
}
},
"required": [
"url",
"schema"
],
"additionalProperties": false
}
batch
List of URLs (β€20) β clean content for each + ONE signed receipt committing to a MERKLE ROOT over every page's contentHash. Tamper-evident multi-page snapshot with per-page membership proofs (selective disclosure). Deterministic (no LLM): same URL set + same source bytes β byte-identical root + proofs. SSRF-guarded per url; keyless x402, USDC on Base mainnet. β $0.02/call
Parameters2
urls
string
required
comma- OR newline-separated list of pages to snapshot (http/https), β€20 (deduped, capped). Each is fetched through the shared SSRF-guarded engine and becomes one Merkle leaf.
format
string
optional
clean text (default) or structure-preserving markdown for every page
Raw schema
{
"type": "object",
"properties": {
"urls": {
"type": "string",
"maxLength": 65536,
"description": "comma- OR newline-separated list of pages to snapshot (http/https), β€20 (deduped, capped). Each is fetched through the shared SSRF-guarded engine and becomes one Merkle leaf."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"description": "clean text (default) or structure-preserving markdown for every page"
}
},
"required": [
"urls"
],
"additionalProperties": false
}
sitemap
Domain/URL β a SIGNED snapshot of the site's PUBLISHED sitemap: discovers the sitemap via robots.txt Sitemap: lines then /sitemap.xml fallback, parses <urlset> + <sitemapindex> (follows up to 5 child sitemaps), returns a deduped, bounded (β€2000) URL inventory with lastmod/changefreq/priority. The receipt signs the DECLARED URL list (deterministic β same sitemap bytes β byte-identical list). Optional ?fetch=N (β€10) adds a HARD-BOUNDED same-domain liveness probe (title+status+bytes per URL) β that probe is the ONLY non-deterministic part and is NOT covered by the signature. SSRF-guarded; the crawl is bounded at every axis. β $0.01/call
Parameters3
url
string
required
a domain (example.com) or any URL on the site β only its origin is used
fetch
string
optional
optional N (0β10): also shallow-fetch the first N same-domain sitemap URLs and report each one's live title + HTTP status + byte size (liveness sample). NOT covered by the signed receipt (it can change between calls). Default 0 = off.
limit
string
optional
optional cap on URLs returned (1β2000); default returns all up to 2000
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "a domain (example.com) or any URL on the site β only its origin is used"
},
"fetch": {
"type": "string",
"maxLength": 3,
"description": "optional N (0β10): also shallow-fetch the first N same-domain sitemap URLs and report each one's live title + HTTP status + byte size (liveness sample). NOT covered by the signed receipt (it can change between calls). Default 0 = off."
},
"limit": {
"type": "string",
"maxLength": 4,
"description": "optional cap on URLs returned (1β2000); default returns all up to 2000"
}
},
"required": [
"url"
],
"additionalProperties": false
}
dns
Domain β a SIGNED, timestamped DNS snapshot (A, AAAA, MX, NS, TXT, CNAME, SOA), normalised + sorted into a byte-stable record set with an offline-verifiable provenance receipt β proving exactly what the zone resolved to at that moment. Keyless, no LLM, no signup. (Normalisation is deterministic; DNS itself is mutable across time/TTL/geo β which is the very reason the snapshot is timestamped + signed.) β $0.006/call
Parameters2
domain
string
optional
the domain to resolve (e.g. example.com). A full URL is also accepted; its hostname is used.
url
string
optional
alternative to ?domain= β any http/https URL; the registrable hostname is resolved.
Raw schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"description": "the domain to resolve (e.g. example.com). A full URL is also accepted; its hostname is used."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "alternative to ?domain= β any http/https URL; the registrable hostname is resolved."
}
},
"additionalProperties": false
}
readability
URL β a clean ARTICLE record { title, byline, publishedAt, article text } with boilerplate (nav/header/footer/sidebar/ads/share-bars/comment-forms) stripped via deterministic DOM density heuristics, plus a signed provenance receipt pinning the cleaned article to its source β the clean-citation primitive distinct from raw markdown. Deterministic (no LLM): same URL + same source bytes β byte-identical output. β $0.005/call
URL β a SIGNED redirect/canonical resolution: the full hop chain [{url,status}] from the link you have to where it ACTUALLY lands, the final resolved URL + status, the page's <link rel=canonical>, hop count, cross-origin flag and distinct origins traversed (affiliate-cloak / link-safety signal). Deterministic β same redirects β byte-identical resolution; no LLM. Follows HTTP 3xx only (no JS/meta-refresh execution β meta-refresh target surfaced un-followed). Receipt = EIP-191 over the resolved chain. β $0.005/call
Parameters1
url
string
required
the link/URL to resolve (http/https) β e.g. a shortlink or affiliate URL
Raw schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the link/URL to resolve (http/https) β e.g. a shortlink or affiliate URL"
}
},
"required": [
"url"
],
"additionalProperties": false
}