Privi Verify MCP
An MCP server that lets AI agents check where a manufactured lot came from and whether its records were changed after the fact, paid per call in USDC on Base using x402.
Works with any MCP client: Claude, ChatGPT, Cursor, VS Code, and custom agents.
Live (testnet): https://privi-verify.onrender.com/mcp · demo lots DEMO-STEEL-0001, DEMO-FOOD-0001
Built by Privi World Co (Port Huron, Michigan) as the agent-facing side of Privi ChainFlow.
Tools
Prices are set with environment variables.
How records stay honest
Each event's fingerprint is a SHA-256 of its contents plus the previous event's fingerprint in the same lot. Editing or deleting any past event breaks every fingerprint after it, and both verify tools report exactly where the chain broke.
Each lot's latest fingerprint is anchored on the Privi blockchain every few minutes (see On-chain checkpoints), so anyone can check it without trusting Privi.
On-chain checkpoints
Every 5 minutes the server anchors the latest fingerprint of each lot that changed on the Privi blockchain through Privi Anchor. Audit results include onchain_checkpoint: the anchored position, transaction, and Merkle proof, plus an anchor_verify call anyone can run. If stored history no longer matches what was anchored, the audit fails even when every local hash was recomputed consistently. Set PRIVI_ANCHOR_KEY (an Anchor API key) to turn it on; PRIVI_ANCHOR_INTERVAL changes the period (seconds, default 300).
How payment works (x402 over MCP)
Follows the x402 v2 MCP transport spec:
- The agent calls a paid tool. The server answers
isError: true with a PaymentRequired object listing price, network, USDC contract and the payTo wallet.
- The agent's wallet signs a USDC authorization and retries with it in
_meta["x402/payment"].
- The server checks the payment matches the price, has the facilitator verify it, runs the tool, has the facilitator settle it, and returns the result with the receipt in
_meta["x402/payment-response"].
If settlement fails, the agent gets no result. Payments go straight to the PRIVI_PAY_TO wallet; the server never holds funds or private keys.
Run it
Over stdio (e.g. Claude Desktop):
Remote clients connect to https://<your-host>/mcp. GET /health returns status.
Make a test payment
scripts/test_payment.py pays the live server exactly the way an AI agent would, using a throwaway Base Sepolia wallet (free testnet USDC, no real money):
The key is saved to .agent-wallet (git-ignored). The script refuses to pay on mainnet unless you pass --allow-mainnet.
Deploy
The Dockerfile runs on Railway, Render, Fly or any container host:
- Set
PRIVI_PAY_TO, PRIVI_WRITE_KEYS and PRIVI_NETWORK.
- Mount a volume at
/data so the SQLite database survives redeploys.
- Start on
base-sepolia with testnet USDC. Switch to base only after a full test payment works, and set PRIVI_FACILITATOR_URL to a production facilitator, since the public one is testnet only.
Recording events
Develop
Tests cover the payment flow (missing, mismatched, invalid and failed-settlement payments), tamper detection, and write authorization, using a stand-in facilitator.
Roadmap
- Per-manufacturer accounts and dashboards (Privi ChainFlow)
- Postgres storage for multi-instance hosting
- Listings in MCP directories
License
MIT © 2026 Dario Canoy, Privi World Co