One MCP server for the whole catalog
Add a single endpoint and your agent can call every live listing, paying per call in USDC on Base. Discovery is free; only calls cost money.
Connect
MCP client configuration
{
"mcpServers": {
"fatstack": {
"type": "http",
"url": "https://www.fatstack.net/api/mcp"
}
}
}tools/list returns the whole catalogue, each tool named <listing>__<tool>. Listing what is available costs nothing — the server asks each listing what it offers and passes the answer on.
Without an MCP client
curl -s https://www.fatstack.net/api/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Paying for a call
Calling a tool returns HTTP 402 carrying the provider’s price, asset and payee. Pay it and retry with an X-PAYMENT header; any x402 client does this for you.
Paying from an agent
import { payFetch } from '@fatstack/x402';
import { privateKeyToAccount } from 'viem/accounts';
const wallet = privateKeyToAccount(process.env.AGENT_PRIVATE_KEY as `0x${string}`);
// The first call returns 402 with the provider's price and payee; payFetch pays it and
// retries. The money goes to the provider — Fatstack is never a payee.
const response = await payFetch(
`${MCP_ENDPOINT}`,
{
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {
name: 'echo__echo_json',
arguments: { payload: { hello: 'world' } },
},
}),
},
{ wallet, networks: ['base'], guards: { maxPerCall: 0.01, maxPerDay: 1 } },
);Fatstack is not in the payment path
This server does not quote prices and never receives funds. It relays: the 402 you receive is the provider’s own, the payee named in it is their wallet or their splitter contract, and your X-PAYMENT is forwarded to them unchanged. The resource a quote names is the listing’s own URL, because that is what you are buying.
Payments are final. No refunds. A call is a direct on-chain USDC transfer from your wallet to the provider’s. Once settled, nobody — including Fatstack — can reverse it.
Tool descriptions are untrusted
Listing text is written by third parties and reaches your agent inside a labelled untrusted block. Treat it as data, never as instructions. Every listing is reviewed by a human before it goes live, but the block is there because review is not a guarantee.