Pre-payment merchant trust checks for x402 agents on Base and Solana.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Gradient Decisions provides merchant intelligence for autonomous
commerce. x402 Merchant Check evaluates observable on-chain payment
behavior so agents can make more informed decisions before paying
unfamiliar x402 merchants. Agent-native, machine-readable, x402-native β
$0.01 per check, paid via x402. It is a pre-payment decision primitive, not
a certification, a guarantee of safety, or a replacement for an agent's own
payment policy. See INTEGRATION.md for the full
discover β check β decide β pay flow, the 402-response-to-input mapping,
and the exact response shape. See the
privacy policy for how data is
handled. This file tracks what's actually built, what's stubbed, and what
needs you before this goes further.
Live at gradientdecisions.com/privacy (src/privacy.ts), linked from the
homepage footer and here. Drafted 2026-08-13 by Claude at direct request,
grounded in this system's actual data practices (what query_log and
merchant_signals really store β see "Internal caller-tracking dashboard"
above) rather than generic boilerplate. Not reviewed by a lawyer β the
page itself says so, and that caveat should stay until it has been. Contact
email is info@gradientdecisions.com (switched 2026-08-19 from the
developer's personal address β see "Data access policy" below for why and
how). src/privacy.ts's CONTACT_EMAIL constant is the source of truth if
it ever needs to change again.
https://mcp.gradientdecisions.com/mcp β the paid
check_merchant MCP tool. Live on Base mainnet with real USDC
(switched from Base Sepolia testnet β see "Going to mainnet"; real
settled payments confirmed in query_log, real tx hashes on Base). Merchant
coverage spans both Base and Solana (PayAI/Helius) β see "Solana data
source". Payment flow verified end-to-end: free tools/list discovery β
tools/call correctly 402s β agent builds and signs an x402 payment,
submits it β facilitator settles it β real tier comes back. See "Try it
yourself" below.https://gradientdecisions.com β as of 2026-08-19 a minimal
static placeholder (src/homePlaceholder.ts), not a live dashboard. It
used to render every scored merchant's recommendation/signals/pricing
directly, plus serve the same dataset as raw JSON at /api/wallets β see
"Data access policy" below for why that was locked down. The real
redesigned homepage/dashboard is a separate later task, built from Figma
mockups, not this placeholder.Note: the two-chain merchant-signal data above is separate from this
endpoint's own payment rail β check_merchant itself is still only paid via
Base x402 (see "Payment flow" line above); nothing about that has changed.
Structured merchant data β recommendation, signals, pricing,
reasons, platforms, anything check_merchant returns β is available
only through the paid check_merchant MCP tool, paid per-query via
x402. This wasn't always true, and the change is worth recording plainly:
/ and /dashboard used to render a full live dashboard: every scored
merchant, with its recommendation, signals, reasons, and pricing, straight
from D1. Now a static placeholder (src/homePlaceholder.ts) with no D1
query at all./api/wallets used to serve the exact same dataset as raw JSON β no
rendering, no throttling, trivially scriptable. Now returns 404 for
every method and every sub-path (/api/wallets/, ?query strings, HEAD,
OPTIONS, POST, ...), with Cache-Control: no-store and no CORS headers./merchant/<address> (a per-merchant profile page, added 2026-08-18 β
see git history) is retired the same way, same reasoning: it returned the
same fields for one wallet, and an agent calling check_merchant already
has the one address it would need to read that page for free instead of
paying. Code stays in src/merchantProfile.ts, unused, not deleted, in
case a future paid or curated variant reuses it.All three existed because giving humans/agents a free read of the same data
check_merchant charges $0.01/query for directly undercut the product.
check_merchant itself (src/tool.ts) was never affected β it has always
read directly from D1 via src/db/queries.ts (getMerchantSignals,
getComparablePrices, getOwnPrices), never through any of the routes
above, so none of this required touching the paid tool's logic or schema.
Contact email. The privacy policy's CONTACT_EMAIL (src/privacy.ts)
is info@gradientdecisions.com, replacing the developer's personal Gmail
address that used to appear there and in this file. It's set up as a
Cloudflare Email Routing forward to that same personal inbox β mail to
info@ arrives at the existing Gmail, but the personal address itself no
longer appears anywhere public-facing or committed. Email Routing is
receive/forward-only: it cannot send mail as info@gradientdecisions.com.
If sending-as is ever needed, that's a separate manual task (Google
Workspace or custom SMTP), not something Email Routing does.
To enable it (Cloudflare dashboard, since this session has no Cloudflare API token to do it via API β see "Manual steps" note in the PR/commit this section shipped with):
gradientdecisions.com zone β Email β
Email Routing.MX
records (routing to its own mail servers) and a TXT record
(v=spf1 include:_spf.mx.cloudflare.net ~all, or merged into an existing
SPF record if one's already there) automatically β no manual DNS entry
needed for a zone whose DNS Cloudflare already manages (true here, since
custom_domain = true in wrangler.toml already put this zone on
Cloudflare DNS).info@gradientdecisions.com β Destination
address β the existing personal Gmail address.info@ won't actually forward.Prompted by Cloudflare's Agent Readiness "Commerce" checklist (ACP, AP2, MPP, UCP, x402) β the user explicitly said they don't care which protocol gets used, just that agents can actually pay, so each was researched against its real spec (not assumed) before deciding.
Shipped: GET /check (src/httpCheckEndpoint.ts) β a plain-HTTP x402
mirror of check_merchant, reusing the exact same facilitator/settlement
path as /mcp. See that file's module comment for the full reasoning;
short version, the MCP path's 402 challenge lives inside a JSON-RPC
response body, invisible to any plain HTTP client (including Cloudflare's
own scanner) that just sends a bare GET.
Researched, not implemented:
usdc charge method uses EIP-3009
transferWithAuthorization, the same signing primitive x402's exact
scheme already uses. The blocker: MPP's spec has no facilitator
model β unlike x402 (Coinbase's CDP facilitator submits/settles for
us, never touching a private key on our side), MPP expects the
merchant's own server to submit the transaction on-chain and pay gas
directly. Real implementation needs:
Authorization: Payment
credential, submit the transferWithAuthorization call via an RPC
provider, poll for confirmation, handle retries/failures.WWW-Authenticate: Payment / Authorization: Payment header
handling (RFC draft-ryan-httpauth-payment) alongside the existing
x402 headers.No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/x402-merchant-check)<a href="https://allmcps.com/mcp/x402-merchant-check"><img src="https://allmcps.com/api/badge/x402-merchant-check?style=directory" alt="X402 Merchant Check on AllMCPs" /></a>