Three tools, one fetch engine
ProofFetch Lite
POST /v1/proof · MCP proof_fetch
The full receipt: fetched_at, status_code, final_url, title, text_markdown, content_sha256. Use it when you need to show what a page said and when.
from $0.04 / call
ReadClean
POST /v1/readclean · MCP read_clean
Only title and text_markdown: the page with scripts, styles, nav, header, footer, forms and iframes removed. Use it to feed a page to an LLM.
from $0.01 / call
UrlWatch
POST /v1/urlwatch · MCP url_watch
Send url and, optionally, the previous_sha256. You get back the new content_sha256 and changed: true|false. Use it in monitor loops. If you leave out the previous hash, changed is always true.
from $0.005 / call
What the "proof" is (and isn't)
content_sha256is the hex SHA-256 of the raw response body bytes. For static pages, you can recompute it yourself:curl -s https://example.com/ | sha256sumgave the same hash as the example below.- Dynamic pages (ads, CSRF tokens, timestamps) return different bytes on every request, so their hash changes from one fetch to the next. Plan for that when you use UrlWatch.
- The receipt is not cryptographically signed or notarized by a third party. It's a structured, hash-anchored record of one fetch that your agent can log, diff and cite.
Real request and response
These were captured from the live server on 2026-10-08. The output is unedited apart from line breaks.
curl -sS -X POST https://proofetch.hardenbranch.workers.dev/v1/proof \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com"}'
{
"ok": true,
"product": "ProofFetch Lite",
"fetched_at": "2026-10-08T17:20:44.976Z",
"content_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484",
"title": "Example Domain",
"text_markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.",
"status_code": 200,
"final_url": "https://example.com/"
}
ReadClean on the same URL (POST /v1/readclean):
{
"ok": true,
"product": "ReadClean",
"title": "Example Domain",
"text_markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes."
}
UrlWatch with the previous hash (POST /v1/urlwatch, body {"url":"https://example.com","previous_sha256":"25dd…e484"}):
{
"ok": true,
"product": "UrlWatch",
"fetched_at": "2026-10-08T17:20:45.377Z",
"content_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484",
"changed": false,
"previous_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484"
}
A blocked request (cloud metadata IP) returns HTTP 400 and isn't billable:
{
"ok": false,
"product": "ProofFetch Lite",
"error": {
"code": "ssrf_blocked",
"message": "blocked_ip"
},
"chargeable": false
}
MCP setup (Claude, Cursor, any MCP client)
The server speaks MCP over Streamable HTTP (JSON-RPC 2.0, protocol 2025-03-26) at https://proofetch.hardenbranch.workers.dev/mcp. This page covers its three read-only tools: proof_fetch, read_clean and url_watch. The same endpoint also exposes two newer tools, site_crawl and sec_section. They aren't on the marketplaces yet; see /llms.txt.
Cursor (~/.cursor/mcp.json):
{
"mcpServers": {
"proofetch": { "url": "https://proofetch.hardenbranch.workers.dev/mcp" }
}
}
Claude Code:
claude mcp add --transport http proofetch https://proofetch.hardenbranch.workers.dev/mcp
Claude Desktop (claude_desktop_config.json, through the mcp-remote bridge):
{
"mcpServers": {
"proofetch": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://proofetch.hardenbranch.workers.dev/mcp"]
}
}
}
Metered through a marketplace (stable listing, one wallet or key for many tools):
# Agent Wonderland MCP (see docs.agentwonderland.com/consumers/setup)
{ "mcpServers": { "agentwonderland": { "command": "npx", "args": ["-y", "@agentwonderland/mcp"] } } }
# then ask your agent to run:
run_agent({ slug: "proof-fetch-lite", input: { "url": "https://example.com" } })
# Cracked (REST; also exposed as run_tool in https://cracked.ai/mcp)
curl -s https://cracked.ai/v1/run -H "Authorization: Bearer $CRACKED_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"provider":"cp-prooffetch-lite-2","endpoint":"/post/v1/proof","input":{"url":"https://example.com"}}'
Raw JSON-RPC check:
curl -sS -X POST https://proofetch.hardenbranch.workers.dev/mcp -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Pricing
You pay per successful call, at the price the marketplace lists. Failed calls (invalid URL, blocked address, DNS failure, timeout, body over 2 MB) return HTTP 4xx/5xx with "chargeable": false and aren't charged.
| Tool | Cracked | run.pay | Agent Wonderland |
|---|---|---|---|
| ProofFetch Lite | $0.04 | $0.04 (service 9a326c8a) | $0.10 |
| ReadClean | $0.01 | $0.01 (service 38c95c4f) | $0.10 |
| UrlWatch | $0.005 | $0.005 (service bf603002) | $0.10 |
Prices as listed on 2026-10-08. Cracked's listing page says it adds a $0.001 platform fee per successful run. Agent Wonderland charges $0.10 per request for each tool, so Cracked or run.pay is the cheaper way to call ReadClean and UrlWatch. Full run.pay service IDs: ProofFetch 9a326c8a-bbac-4b11-9750-8a4fe52e22de, ReadClean 38c95c4f-ead6-4c76-a0f3-e77c70c5b262, UrlWatch bf603002-2584-47f8-97fb-ce1927cba95b.
https://proofetch.hardenbranch.workers.dev are currently unauthenticated and unmetered, so you can try it from the examples above. This is a temporary tunnel address with no uptime guarantee, and it can change without notice. The marketplace listings above are the stable way to use the tools in production. They're where pricing, receipts, retries and health tracking apply.Limits and guarantees
- Public
http/httpsURLs only. No other schemes, and nouser:pass@credentials in the URL. - SSRF guards: blocks localhost,
.local/.internalnames, private, loopback, link-local, CGNAT and test ranges, IPv6 ULA/link-local, and cloud metadata (169.254.169.254). Hostnames are resolved over DNS-over-HTTPS and rejected if any answer is private. Every redirect (max 5) is checked again. - 15 second timeout, 2 MB maximum body, Markdown capped at 200,000 characters.
- One plain HTTP GET. No JavaScript rendering, no screenshots, no headless browser, no proxies, no logins or cookies. Pages that render client-side may come back mostly empty.
- Non-HTML text (JSON, XML, plain text) comes back in a code block. Binary content gets a short note with the byte count and content type, and the SHA-256 still covers the raw bytes.
FAQ
Is a 404 page billed? If the fetch completes, the call succeeds and status_code reports what the target returned (for example, 404). That counts as a successful call. Only errors on our side (blocked, invalid, DNS, timeout, too large) are non-billable.
Does it check robots.txt? No. It doesn't crawl. It makes one on-demand GET for the single URL your agent passes, with the User-Agent ProofFetch-Lite/1.0.0. You're responsible for fetching only pages you're allowed to.
Can it reach my intranet? No. Private and internal addresses are blocked by design.
Machine-readable docs? /llms.txt, /openapi.yaml, /health.
Contact
Questions, bulk use or a feature you need: ktstepp85@gmail.com (Kyle Stepp).