# Scrooge Tool Mill > Company card for any domain ($0.03) plus 7 page-intel tools for agents, from $0.002. x402, USDC on Base, no API keys. - Live: https://scrooge-x402-tool-mill.vercel.app - Network: Base mainnet (eip155:8453) - Asset: USDC · Scheme: exact - Pay to: 0xfE2353C808F2409cCb81508005A62cef29457706 ## Tools (USDC per call) - POST https://scrooge-x402-tool-mill.vercel.app/v1/company-card · $0.03 · Public-record company profile for a domain: legal name, domain age, registrar, LEI, socials - POST https://scrooge-x402-tool-mill.vercel.app/v1/page-meta · $0.002 · Extract public page metadata (title, description, canonical, OG, language, excerpt) · cheapest entry, free trial ?trial=1 - POST https://scrooge-x402-tool-mill.vercel.app/v1/structured-data · $0.01 · Schema.org JSON-LD, microdata, and Open Graph as typed JSON (prices, dates, org facts) - POST https://scrooge-x402-tool-mill.vercel.app/v1/link-graph · $0.03 · Outbound link graph {href,text?} from a public page (max 50) - POST https://scrooge-x402-tool-mill.vercel.app/v1/change-fingerprint · $0.04 · Change fingerprint: etag, lastModified, sha256 contentHash, byteLength, fetchedAt - POST https://scrooge-x402-tool-mill.vercel.app/v1/readable-text · $0.05 · Extract main readable article text from a public HTML page - POST https://scrooge-x402-tool-mill.vercel.app/v1/watch · $0.10 · Watch a page for 7 days and get a webhook when it changes - POST https://scrooge-x402-tool-mill.vercel.app/v1/batch-meta · $0.15 · Batch page-meta for up to 10 URLs in one payment ## Start here - GET https://scrooge-x402-tool-mill.vercel.app/start → free sample - POST https://scrooge-x402-tool-mill.vercel.app/v1/page-meta?trial=1 → 1 free page-meta per IP per Bangkok day (opt-in; without it, the normal 402) - GET https://scrooge-x402-tool-mill.vercel.app/agent-start.json → first paid call MCP: https://scrooge-x402-tool-mill.vercel.app/mcp ## Free discovery - GET https://scrooge-x402-tool-mill.vercel.app/.well-known/l402-services - GET https://scrooge-x402-tool-mill.vercel.app/.well-known/x402.json (x402 v2 manifest with accepts[]) - GET https://scrooge-x402-tool-mill.vercel.app/openapi-x402.json ## MCP setup - Claude Code: claude mcp add --transport http tool-mill https://scrooge-x402-tool-mill.vercel.app/mcp - Cursor (.cursor/mcp.json): {"mcpServers":{"tool-mill":{"url":"https://scrooge-x402-tool-mill.vercel.app/mcp"}}} - Claude Desktop / stdio-only clients: {"mcpServers":{"tool-mill":{"command":"npx","args":["-y","mcp-remote","https://scrooge-x402-tool-mill.vercel.app/mcp"]}}} - Any streamable-HTTP MCP client: https://scrooge-x402-tool-mill.vercel.app/mcp (POST, JSON-RPC) - Paying: an unpaid tools/call returns x402 PaymentRequired (accepts[]) as an error result; an x402-aware client (@x402/mcp) signs and retries with _meta["x402/payment"]. ## Paid examples (copy and paste) ### POST /v1/company-card ($0.03 USDC, MCP tool company_card) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/company-card -H 'content-type: application/json' -d '{"domain":"coinbase.com"}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/company-card -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"domain":"coinbase.com"}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.03 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/company-card", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"domain":"coinbase.com"}) }); console.log(res.status, await res.json()); ``` ### POST /v1/page-meta ($0.002 USDC, MCP tool page_meta) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/page-meta -H 'content-type: application/json' -d '{"url":"https://example.com"}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/page-meta -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com"}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.002 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/page-meta", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com"}) }); console.log(res.status, await res.json()); ``` ### POST /v1/structured-data ($0.01 USDC, MCP tool structured_data) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/structured-data -H 'content-type: application/json' -d '{"url":"https://example.com"}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/structured-data -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com"}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.01 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/structured-data", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com"}) }); console.log(res.status, await res.json()); ``` ### POST /v1/link-graph ($0.03 USDC, MCP tool link_graph) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/link-graph -H 'content-type: application/json' -d '{"url":"https://example.com","maxLinks":20}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/link-graph -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com","maxLinks":20}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.03 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/link-graph", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com","maxLinks":20}) }); console.log(res.status, await res.json()); ``` ### POST /v1/change-fingerprint ($0.04 USDC, MCP tool change_fingerprint) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/change-fingerprint -H 'content-type: application/json' -d '{"url":"https://example.com"}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/change-fingerprint -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com"}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.04 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/change-fingerprint", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com"}) }); console.log(res.status, await res.json()); ``` ### POST /v1/readable-text ($0.05 USDC, MCP tool readable_text) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/readable-text -H 'content-type: application/json' -d '{"url":"https://example.com","maxChars":4000}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/readable-text -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com","maxChars":4000}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.05 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/readable-text", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com","maxChars":4000}) }); console.log(res.status, await res.json()); ``` ### POST /v1/watch ($0.10 USDC, MCP tool watch_page) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/watch -H 'content-type: application/json' -d '{"url":"https://example.com","callback_url":"https://your-app.example/hook"}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/watch -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"url":"https://example.com","callback_url":"https://your-app.example/hook"}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.10 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/watch", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"url":"https://example.com","callback_url":"https://your-app.example/hook"}) }); console.log(res.status, await res.json()); ``` ### POST /v1/batch-meta ($0.15 USDC, MCP tool batch_meta) ```bash # 1) unpaid call -> HTTP 402, requirements (x402Version 2, accepts[]) in body and PAYMENT-REQUIRED header curl -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/batch-meta -H 'content-type: application/json' -d '{"urls":["https://example.com","https://x402.org"]}' # 2) retry with a signed payment (curl cannot sign; get it from @x402/fetch or an x402 wallet) curl -X POST https://scrooge-x402-tool-mill.vercel.app/v1/batch-meta -H 'content-type: application/json' -H "PAYMENT-SIGNATURE: $SIGNED_PAYMENT" -d '{"urls":["https://example.com","https://x402.org"]}' ``` ```ts // npm i @x402/fetch @x402/evm viem (wallet needs $0.15 USDC on Base) import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"; import { ExactEvmScheme } from "@x402/evm"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const pay = wrapFetchWithPaymentFromConfig(fetch, { schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }] }); const res = await pay("https://scrooge-x402-tool-mill.vercel.app/v1/batch-meta", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({"urls":["https://example.com","https://x402.org"]}) }); console.log(res.status, await res.json()); ```