exhibit402-mcp
# exhibit402-mcp
MCP server for [exhibit402](https://exhibit402.dylan-caponi.workers.dev), a live x402-paid web-evidence service. It lets an agent pay USDC on Base to permanently certify what a public URL serves right now, and to re-verify existing certificates.
How a capture works: two independent observers on different networks capture the URL at the same frozen instant. Byte-identical captures get tier CERTIFIED. Differing captures get tier WITNESSED, with a pixel agreement percentage and a diff map. Either way the evidence (screenshot plus a signed manifest) is stored permanently on Arweave, an RFC 3161 timestamp token is included, and an ERC-721 certificate is minted on Base to the wallet that paid.
Machine-readable service docs: [/llms.txt](https://exhibit402.dylan-caponi.workers.dev/llms.txt) and [/openapi.json](https://exhibit402.dylan-caponi.workers.dev/openapi.json).
## Tools
| Tool | What it does | Price (USDC on Base) |
| --- | --- | --- |
| `certify_url(url, mode)` | Pays for a capture, then polls the claim ticket until the certificate is final (up to about 6 minutes). Returns the certificate JSON: tier, token id, ar:// links, hashes. | $1.00 (`fullpage`, default) or $0.50 (`viewport`, first 1280x800 screen) |
| `verify_certificate(id)` | Re-verifies any exhibit402 certificate: the service re-downloads the stored bytes, recomputes every SHA-256, and checks the on-chain record. Returns a machine-readable verdict. `id` is a token id, an Arweave tx id, or a job id. | $0.02 |
If `certify_url` hits its polling timeout, it still returns the `claim_url`. Claim tickets are durable and free to read: fetch the claim URL later with a plain GET to collect the finished certificate. You are not charged twice.
Refund policy (disclosed by the service): rejected captures (oversize, unreachable page, content screen) refund automatically minus a $0.10 fee; service faults refund in full. WITNESSED is a deliverable, not a failure, and is not refunded.
## Setup
You need one environment variable:
- `EXHIBIT402_WALLET_KEY`: an EVM private key (hex) for a wallet that holds USDC on Base (chain id 8453). The wallet needs no ETH; x402 settles via EIP-3009 and the facilitator pays gas. The key stays in your process environment and is never logged.
Without the key the server still starts and lists its tools, and every call returns a clear setup error instead of failing silently.
### Claude Code (one line)
```
claude mcp add exhibit402 --env EXHIBIT402_WALLET_KEY=0xYOUR_KEY -- npx -y exhibit402-mcp
```
### Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"exhibit402": {
"command": "npx",
"args": ["-y", "exhibit402-mcp"],
"env": { "EXHIBIT402_WALLET_KEY": "0xYOUR_KEY" }
}
}
}
```
### Cursor
Add to `.cursor/mcp.json`:
```json
{
"mcpServers": {
"exhibit402": {
"command": "npx",
"args": ["-y", "exhibit402-mcp"],
"env": { "EXHIBIT402_WALLET_KEY": "0xYOUR_KEY" }
}
}
}
```
## Pricing summary
| Action | Price |
| --- | --- |
| Full-page capture | $1.00 |
| Viewport capture (1280x800) | $0.50 |
| Verify a certificate | $0.02 |
| Rejected capture refund fee | $0.10 kept, rest refunded |
All payments are x402 (USDC on Base, eip155:8453). Payment settles before the capture starts; polling the claim ticket is free.
## Notes for operators
- `EXHIBIT402_URL` overrides the service base URL (default `https://exhibit402.dylan-caponi.workers.dev`). You will not normally need it.
- Fulfillment is normally 30 to 120 seconds, up to about 5 minutes with a cold observer or a retry round.
- A `verified: false` verdict from `verify_certificate` is a delivered result and is charged. Malformed ids, unknown ids, and gateway outages are not charged.
- The service refuses private and internal addresses before payment.
## License
MIT
TDQS
Scored across 2 tools
The two tools, certify_url and verify_certificate, have completely distinct purposes: one creates a certification, the other validates an existing one. There is no overlap or ambiguity in their functionality.
Both tool names follow a consistent verb_noun pattern (certify_url, verify_certificate), using clear, action-first naming that is predictable and readable.
With only 2 tools, the server feels minimal but is appropriate for its narrow focus on certification and verification. It falls into the borderline 'thin' range, yet the tools are purposeful and not redundant.
The core lifecycle of certification—creating and verifying—is covered. Minor gaps exist (e.g., no ability to list certificates or revoke them), but these are not essential for the primary workflow of certifying and checking authenticity.