verified-catalog
This server lets AI agents discover, inspect, and rank pay-per-call (x402) services through three read-only MCP tools, with no API key required.
search_catalog— Browse or keyword-search the verified x402 catalog, optionally filtering by category, max advertised price, and reachability.get_service— Fetch the full published record for one exact service ID, including pricing, endpoint, tasks, quality test, latest check, and history summary.lookup— Rank x402 endpoints for a known task and max price using known-answer pass rates and paid-call receipts; can also retrieve one service’s receipts by ID or endpoint.Free lookup quota —
lookupuses the shared MCP client namevc-mcp, giving 5 free lookups per UTC day; after that it returns the HTTP 402 payment requirement and never pays.Read-only/factual behavior — Results are ungraded catalog facts; payment never changes results or placement.
Verified Pay-Per-Call Catalog
A static, machine-readable catalog of pay-per-call (x402) services for AI agents, with factual results of our own automated checks. Published by @WithGrokBot.
Discover (verdict-filtered index). GET https://api.402xagent.com/v1/discover?q=<terms>&verdict=pay|skip|recheck&limit=<n> searches 122,891 x402 endpoints from our Oct 20, 2026 crawl. This isn't a plain directory: every result comes with a pay, skip or recheck verdict, a skip reason, the price quoted in the endpoint's live 402 response during our crawl, the network, and an ed25519-signed receipt. Results are facts from an unpaid crawl probe, not endorsements. A pay older than 7 days comes back as recheck, so run the free check (each result's check_url, or the MCP tool endpoint_spot_check) right before you pay. Also available as the MCP tool discover at https://api.402xagent.com/mcp. — withgrokbot
Try it in one line
Which x402 web-search endpoint delivered on our last paid calls, at $0.01 or less? No key; 5 free lookups per client per UTC day:
curl -s "https://verified-catalog-lookup.withgrokbot.workers.dev/v1/lookup?task=web-search&max_price=0.01&ref=via-readme"const r = await (await fetch("https://verified-catalog-lookup.withgrokbot.workers.dev/v1/lookup?task=web-search&max_price=0.01&ref=via-readme")).json();Results are sorted by known-answer pass rate over our last paid calls, then price, each with its Base settlement receipts. Other tasks: /v1/tasks. Optional client=<your agent name>; ref only says where you found the link.
Related MCP server: quanta-x402-mcp
Pricing
5 free lookups per client per UTC day. The client is your
clientvalue when you send one, otherwise a salted hash of your IP (raw IPs are never stored). The counter resets at 00:00 UTC. Only/v1/lookupis metered;/v1/tasks,/openapi.jsonand the static catalog files stay free.After that, $0.02 USDC on Base per lookup via x402. The lookup answers HTTP 402 with a v2
PAYMENT-REQUIREDheader (exactscheme,eip155:8453, USDC, payTo0x37cfCC8a29e9ff9458902B29E31E42dc7B718674). Retry with aPAYMENT-SIGNATURE(orX-PAYMENT) header; the payment is verified and settled through the public PayAI x402 facilitator, and the settlement tx comes back in thePAYMENT-RESPONSEheader and the response'saccessblock.Payment never changes results, sort order or listings. It buys query access only. Free, paid and exempt lookups run the same code on the same data and get identical results; no seller can pay for placement, and no check result or known-answer outcome depends on who paid. Every lookup response repeats this in
payment_policy.
Remote MCP server (free)
https://verified-catalog-lookup.withgrokbot.workers.dev/mcp (Streamable HTTP, stateless JSON-RPC, no key). Same 3 tools and results as mcp/server.py: search_catalog, get_service and lookup. lookup uses the client name vc-mcp, so it shares that client's 5 free lookups per UTC day; after that it reports the 402 and does not pay. Registry name: io.github.withgrokbot/verified-catalog (server.json).
Always-paid endpoint (x402)
GET https://verified-catalog-lookup.withgrokbot.workers.dev/v1/lookup/paid?task=web-search&max_price=0.01 takes the same parameters and returns the same result as /v1/lookup, for $0.02 USDC on Base per call with no free quota. Its 402 carries x402 Bazaar discovery metadata (extensions.bazaar); it is also listed in /openapi.json (x-payment-info) and /.well-known/x402. Bad parameters get a 400 before anything is settled.
Products
Paid digital downloads sold via the same Worker over x402 (always paid; free lookup quota and SELF_CLIENTS do not apply):
Overnight Chief of Staff Setup Pack —
$9USDC on Base.GET https://verified-catalog-lookup.withgrokbot.workers.dev/v1/products/overnight-cos-pack(or MCP toolget_overnight_cos_pack). Unpaid calls return HTTP 402 with Bazaar discovery metadata. After payment: prompts, HTML morning-briefing template, and PDF guide.
Files
index.html,services/<id>.html,methodology.html: the site (no JavaScript, no requests to other hosts)catalog.json,services/<id>.json,llms.txt,.well-known/agent-card.json: machine-readabledata/services.json: the seed listings (source and retrieval date on each),data/site.json: brand/repo settingsresults/latest.json,results/history.jsonl,results/raw/<run>/<id>.json,results/spend_ledger.json: check results and evidencescripts/run_checks.py: run checks (free/dry-run by default) and rebuild;scripts/build_site.py: rebuild onlydata/quality_tests.json,scripts/quality.py: known-answer tests run on every paid call (pass/fail; broken services are "facts only")receipts.json: every paid call (time, charged, settlement tx with Basescan link, delivered, known-answer result)worker/: reliability lookup, a Cloudflare Worker (GET /v1/lookup?task=web-search&max_price=0.01&n=5) that readscatalog.jsonandreceipts.jsonfrom this site and counts distinct clients (seeworker/README.md)mcp/server.py: small stdio MCP server withsearch_catalog,get_service(readcatalog.json) andlookup(calls the Worker); the Worker serves the same tools remotely at/mcpserver.json: official MCP Registry entry (remote server)scripts/demand_weekly.py: weekly count of distinct lookup clients ->results/demand_weekly.json.github/workflows/daily.yml: daily free checks and commit
Run
python3 scripts/run_checks.py # free checks, no payment (default)
python3 scripts/build_site.py # rebuild pages from data/ and results/
python3 tests/run_tests.py # acceptance tests (Node 18+ for the Worker tests)Paid checks exist but are off by default. They need --pay, a wallet file outside this folder (--wallet), and pip install -r scripts/requirements-pay.txt. Hard caps: $0.10 per call, $1.00 per UTC day, $20.00 lifetime; only USDC "exact" on Base is ever signed.
We publish facts only, no grades. We hold no customer funds and are not a party to any seller transaction; lookup fees after the free tier go to our own wallet. To contest a result, open a GitHub issue (see methodology.html#contest).
License
MIT, see LICENSE.
Available Tools
3 toolsget_serviceARead-onlyIdempotentInspect
Fetch the complete catalog record for one known service id (e.g. from search_catalog or lookup results). Use search_catalog to find ids and lookup to rank services for a task; get_service has no per-call receipts, so for receipts with tx and Basescan links call lookup with endpoint=. Read-only. No auth or API key; free, no quota (reads the same catalog snapshot as search_catalog). Returns the record as published: id, name, provider, category, description, endpoint, advertised_price (USD, atomic, asset, network), sample_request, tasks, quality_test (known-answer test, facts_only flag and reason), paid_receipts (count), latest (full last check incl. x402_challenge, error, raw_log_url), history_summary and page_url. Unknown or missing id: error "no service with id ...".
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Exact, case-sensitive catalog service id as returned by search_catalog or lookup, e.g. "exa-search", "x402tap-weather", "onesource-erc20-balance". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new context: no auth/API key, free with no quota, reads the same snapshot as search_catalog, and the exact error for an unknown id. It also discloses the full shape of the returned record.
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?
Purpose and sibling routing are front-loaded in the first two sentences, and the remaining text earns its place given there is no output schema. The return-field enumeration is long and reads as a dense run-on, which slightly hurts scannability.
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?
With no output schema, the description fully compensates by enumerating the returned fields (id, provider, category, advertised_price, quality_test, paid_receipts, latest, history_summary, page_url) and the error path. Nothing an agent needs to call or interpret this tool 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?
Schema coverage is 100% and the schema already documents case-sensitivity and gives examples, so the baseline is 3. The description adds value by pointing to where ids come from (search_catalog or lookup results) and by specifying the failure mode for an unknown/missing id, which the schema does not.
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?
States a specific verb and resource ('Fetch the complete catalog record for one known service id') and immediately distinguishes itself from siblings by naming search_catalog (find ids) and lookup (rank services / receipts). An agent can route correctly without opening any schema.
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?
Explicit when-to-use routing: search_catalog to find ids, lookup to rank services, and lookup with endpoint=<id> when receipts with tx/Basescan links are needed. This is a textbook when/when-not/alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookupARead-onlyInspect
Rank x402 endpoints for a known task at or under a price: "which endpoint should I pay for task X at <= $Y?". Prefer it over search_catalog (keyword browsing, unranked) and get_service (one id's raw record). No auth or API key. Calls the hosted lookup service as client=vc-mcp; all MCP users share that client's 5 free lookups per UTC day (reset 00:00 UTC), after which the tool returns an error reporting the HTTP 402 ($0.02 USDC on Base via x402) and never pays. Returns results sorted by known-answer pass_rate over the last n paid calls, then price, each with price_usd, pass_rate, last_check_at, last_check, stale and receipts (time, tx, basescan_url, charged_usd, delivered, quality); seller-broken services come unsorted under facts_only. No match: empty results, matched 0. Needs task or endpoint; invalid params return an error. Payment never changes results.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Optional. Most recent paid receipts per service used for pass_rate and returned, 1-20 (default 5; out-of-range values are clamped). | |
| task | No | Task name from /v1/tasks, e.g. web-search, crypto-news, news, weather, token-balance, sec-filings, fx-rates, url-check. Case-insensitive; a known name matches exactly, an unknown one falls back to matching every word in service text. Required unless endpoint is given. | |
| limit | No | Optional. Maximum ranked services in results, 1-20 (default 10; clamped). facts_only is not limited. | |
| payer | No | Optional 0x wallet address (40 hex characters), recorded so a later payment from it to a returned vendor can be matched on-chain. Nothing is charged; a malformed address returns an error. | |
| endpoint | No | A catalog service id (e.g. exa-search) or endpoint URL, to get one service's receipts instead of a whole task. Required unless task is given; can be combined with task. | |
| max_price_usd | No | Optional. Only services whose listed price per call is at or below this many USD, e.g. 0.01. Negative values are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: no auth/API key needed, shared client=vc-mcp quota of 5 free lookups per UTC day with a 00:00 UTC reset, the exact failure mode afterwards (HTTP 402, $0.02 USDC on Base via x402) and the crucial guarantee that it never pays and that payment never changes results. It also discloses result ordering, staleness signaling, and the facts_only exception — rich context an agent cannot get from readOnlyHint/openWorldHint alone.
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?
Front-loads the ranked-question framing and the sibling routing in the first two sentences, then packs quota, output shape and edge cases densely with no filler. It is long and information-dense rather than tight prose, which costs it a point, but nearly every clause carries a fact.
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?
With no output schema, the description fully carries the return-value burden: sort order (pass_rate over last n paid calls, then price), the field list (price_usd, pass_rate, last_check_at, last_check, stale, receipts with tx/basescan_url/charged_usd/delivered/quality), the facts_only case for seller-broken services, and the empty-results behavior (matched 0). Nothing an agent needs to call or interpret this tool 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?
Schema description coverage is 100%, so params like n, limit and max_price_usd are already fully documented with ranges and clamps, making 3 the baseline. The description does add one genuinely useful constraint the schema lacks (required fields list is empty): 'Needs task or endpoint; invalid params return an error.' Beyond that it adds little parameter detail the schema doesn't already carry.
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?
States a specific verb (rank) and resource (x402 endpoints) plus the exact question it answers, and explicitly distinguishes itself from search_catalog (keyword browsing, unranked) and get_service (one id's raw record). An agent can select it without opening any schema.
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?
Gives the selection condition (known task at or under a price) and names both alternatives with the reason each is worse, plus a 'prefer it over' directive. When-to-use and when-to-use-something-else are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogARead-onlyIdempotentInspect
Browse or keyword-search the verified catalog of pay-per-call (x402) agent services. Use it when you don't know the task name or want to see what exists; use lookup to rank endpoints for a known task at a max price, and get_service for one id's full record. Read-only. No auth or API key; free, no quota or per-client limit: it only reads the catalog snapshot (bundled catalog.json in the local server, the published catalog.json on remote /mcp). Returns {count, results, generated_at, note, methodology_url}; results are in catalog order, ungraded, each with id, name, category, endpoint, advertised_price_usd, page_url and latest (checked_at, reachable, http_status, latency_ms, quoted_price_usd, price_matches_listing, charged_price_usd, delivered_valid, raw_log_url). No match: count 0, empty results. A non-numeric max_price_usd or limit returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional. Maximum number of results, 1-100 (default 20). | |
| query | No | Optional. Space-separated words; every word must appear (case-insensitive) in the service id, name, category, description or provider. Omit to list all. Examples: "search", "crypto news". | |
| category | No | Optional. Case-insensitive substring of the service category, e.g. "web search", "news", "on-chain data", "weather", "public records", "utility". | |
| max_price_usd | No | Optional. Keep services whose advertised price per call is at or below this many USD, e.g. 0.01. | |
| reachable_only | No | Optional (default false). If true, keep only services that were reachable in the latest check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent profile, but the description adds material context the annotations do not: no auth or API key, no quota or per-client limit, and the actual data source (local bundled catalog.json vs. published catalog.json on remote /mcp). It also discloses the error behavior for non-numeric max_price_usd/limit and the no-match case.
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?
Front-loaded with purpose and sibling routing before the detailed return-field enumeration. The field list is long but earns most of its place because no output schema exists; still, the enumeration is denser than needed for a selection decision.
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?
With no output schema, the description carries the full burden of documenting returns and does so exhaustively ({count, results, generated_at, note, methodology_url}, per-result fields, and the empty-result case), plus the auth/quota envelope. An agent has everything needed to call and interpret it.
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 nonetheless adds edge-case semantics the schema omits, namely that a non-numeric max_price_usd or limit returns an error and that no match yields count 0 with empty results. It does not add syntax guidance beyond the schema examples.
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?
Names a specific verb+resource ('Browse or keyword-search the verified catalog of pay-per-call (x402) agent services') and explicitly distinguishes itself from the siblings lookup and get_service by the condition that selects each. An agent can route correctly without opening any schema.
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?
States exactly when to use it ('when you don't know the task name or want to see what exists') and names the two alternatives with their own selection conditions ('lookup to rank endpoints for a known task at a max price, and get_service for one id's full record'). Nothing is left to inference.
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.
3 tool updates
v0.6.1- Changed
get_service1 field changed- added
Input schema / properties / id / descriptionAdded value: +"Exact, case-sensitive catalog service id as returned by search_catalog or lookup, e.g. \"exa-search\", \"x402tap-weather\", \"onesource-erc20-balance\"."
- Changed
lookup9 fields changed- changed
Input schema / properties / endpoint / descriptionPrevious value: -"a service id or endpoint URL instead of a task"New value: +"A catalog service id (e.g. exa-search) or endpoint URL, to get one service's receipts instead of a whole task. Required unless task is given; can be combined with task." - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"services returned (default 10)"New value: +"Optional. Maximum ranked services in results, 1-20 (default 10; clamped). facts_only is not limited." - changed
Input schema / properties / max_price_usd / descriptionPrevious value: -"maximum listed price per call in USD"New value: +"Optional. Only services whose listed price per call is at or below this many USD, e.g. 0.01. Negative values are rejected." - added
Input schema / properties / max_price_usd / minimumAdded value: +0 - added
Input schema / properties / n / defaultAdded value: +5 - changed
Input schema / properties / n / descriptionPrevious value: -"paid receipts per service (default 5)"New value: +"Optional. Most recent paid receipts per service used for pass_rate and returned, 1-20 (default 5; out-of-range values are clamped)." - changed
Input schema / properties / payer / descriptionPrevious value: -"optional: your 0x wallet, so a later payment to a returned vendor can be confirmed on-chain"New value: +"Optional 0x wallet address (40 hex characters), recorded so a later payment from it to a returned vendor can be matched on-chain. Nothing is charged; a malformed address returns an error." - changed
Input schema / properties / task / descriptionPrevious value: -"task name, e.g. web-search, crypto-news, weather, token-balance"New value: +"Task name from /v1/tasks, e.g. web-search, crypto-news, news, weather, token-balance, sec-filings, fx-rates, url-check. Case-insensitive; a known name matches exactly, an unknown one falls back to matching every word in service text. Required unless endpoint is given."
- Changed
search_catalog8 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Optional. Case-insensitive substring of the service category, e.g. \"web search\", \"news\", \"on-chain data\", \"weather\", \"public records\", \"utility\"." - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / limit / descriptionAdded value: +"Optional. Maximum number of results, 1-100 (default 20)." - changed
Input schema / properties / max_price_usd / descriptionPrevious value: -"maximum advertised price per call in USD"New value: +"Optional. Keep services whose advertised price per call is at or below this many USD, e.g. 0.01." - added
Input schema / properties / max_price_usd / minimumAdded value: +0 - changed
Input schema / properties / query / descriptionPrevious value: -"words to match in name, category, description"New value: +"Optional. Space-separated words; every word must appear (case-insensitive) in the service id, name, category, description or provider. Omit to list all. Examples: \"search\", \"crypto news\"." - added
Input schema / properties / reachable_only / defaultAdded value: +false - changed
Input schema / properties / reachable_only / descriptionPrevious value: -"only services reachable in the latest check"New value: +"Optional (default false). If true, keep only services that were reachable in the latest check."
3 tool updates
v0.1.0- First observed
get_service - First observed
lookup - First observed
search_catalog
TDQS
Scored across 3 tools
Each tool has a clearly distinct role: search_catalog browses or keyword-searches, get_service fetches one full record by id, and lookup ranks endpoints for a known task and price. Their descriptions explicitly state when to prefer each over the others, leaving no meaningful ambiguity.
The names are consistently snake_case and mostly follow a verb_noun pattern (search_catalog, get_service), but lookup is a bare verb. This is a minor deviation rather than an inconsistent convention.
Three tools is well-scoped for a read-only catalog server: one for browsing/search, one for detail retrieval, and one for ranked task-specific lookup. Each earns its place without redundancy.
The surface covers discovery, ranking, and detail retrieval for the catalog, which is appropriate for a read-only service. Minor gaps exist, such as no dedicated category/task listing tool, but agents can work around this via search_catalog.
Maintenance
Related MCP Connectors
Live uptime and source-URL verification for AI agents, with per-call x402/USDC paid endpoints.
Live uptime and source-URL verification for AI agents, with per-call x402/USDC paid endpoints.
Live uptime and source-URL verification for AI agents, with per-call x402/USDC paid endpoints.
Live uptime and source-URL verification for AI agents, with per-call x402/USDC paid endpoints.
Related MCP Servers
- AlicenseAqualityCmaintenanceValidate AI claims against live data: check endpoints, count competitors, and test hypotheses. Includes free and paid tools via x402.16MIT
- FlicenseNot gradedqualityBmaintenancePay-per-call structured data for autonomous AI agents. x402-metered, MCP-native.-
- AlicenseAqualityBmaintenanceTrust layer for AI agents: 22 pay-per-call x402 tools for scam and fraud checks, payment pre-flight, wallet screening, policy approvals, contact extraction and company research. Free preview with no wallet; paid calls settle in USDC on Base.22MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to perform medical-billing tasks like prior authorization checks, claim denial decoding, unpaid claim triage, appeal assessments, and PHI de-identification using deterministic rules engines with per-call payments via the x402 protocol.17 npmMIT