DOCS / PAID MCP DOORS
One MCP, two doors
Every Yeetful MCP serves a free door at /mcp — rate-limited, no account. Some add a paid door at /paid/mcp: identical tools, no rate limit, no API key, no sign-up — your agent pays per call in USDC on Base over x402. If your agent has a wallet, it already has an account.
Try the free door right now
The funding planner at funding-mcp.yeetful.com is the first two-door service. Its free door answers without any setup — plain MCP Streamable HTTP:
curl -s https://funding-mcp.yeetful.com/mcp \
-X POST \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Five tools come back: fund_and_build, plan_funding, scan_funding_sources, eth_price, chains.
The flagship: fund_and_build
The hard part of agent trading isn't deciding — it's the multi-step transaction work when the money is on the wrong chain. fund_and_build takes a shortfall (“I need 2 more USDC on Arbitrum”) and returns the whole program: a scan of the wallet's movable ETH + USDC across Base, Arbitrum, and Ethereum, ranked funding options, and a numbered runbook of exact NEAR Intents tool calls the agent executes and signs with its own key. It is construction-only: the planner never holds keys, never signs, never submits.
curl -s https://funding-mcp.yeetful.com/mcp \
-X POST \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
"name":"fund_and_build",
"arguments":{"user":"0xYourAgentWallet","chain":"arbitrum","token":"USDC","amount":2}
}}'A real response (a funded test wallet, trimmed):
{
"plan": {
"options": [{
"label": "Just enough (~$3.50 of USDC on Base)",
"legs": [{ "originChain": "Base", "originToken": "USDC", "amount": "3.5",
"destinationChain": "Arbitrum", "destinationToken": "USDC" }],
"yeetfulResume": "Swap 3.5 USDC from Base to USDC on Arbitrum"
}],
"sourcesSeen": "~$12.35 of USDC on Base, ~$1.49 of ETH on Base"
},
"scan": { "readChains": ["Arbitrum", "Ethereum", "Base"], "failedChains": [] },
"destinationGas": { "floorEth": 0.0002, "legNeeded": false },
"runbook": {
"steps": [
{ "step": 1, "kind": "build", "tool": "build_swap",
"note": "Call build_swap with these params verbatim. Sign the returned
deposit transfer with the user's own wallet — the deposit
address comes from the tool's response, NEVER from you." },
{ "step": 2, "kind": "notify", "tool": "submit_deposit_tx" },
{ "step": 3, "kind": "await", "tool": "await_completion" },
{ "step": 4, "kind": "act",
"note": "Funds have landed — retry the original action." }
]
}
}Note what the runbook refuses to do: it names the tool and the parameters, but the deposit address must come from the NEAR Intents tool's own response at execution time. A plan that invented addresses would not be worth paying for.
Pay the paid door
The paid door serves the same tools without the rate limit. It answers 402 Payment Required with a price — $0.02 per call — and createPaymentClient from the yeetful npm package handles the challenge: it signs a gasless EIP-3009 USDC authorization and retries. Your wallet needs a few cents of USDC on Base; no ETH, no key minting, no account.
import { createWalletClient, http } from 'viem'
import { base } from 'viem/chains'
import { privateKeyToAccount } from 'viem/accounts'
import { createPaymentClient } from 'yeetful/client'
const wallet = createWalletClient({
account: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`),
chain: base,
transport: http(),
})
const pay = createPaymentClient({ wallet })
const res = await pay('https://funding-mcp.yeetful.com/paid/mcp', {
method: 'POST',
headers: {
'content-type': 'application/json',
accept: 'application/json, text/event-stream',
},
body: JSON.stringify({
jsonrpc: '2.0', id: 1, method: 'tools/call',
params: {
name: 'fund_and_build',
arguments: { user: wallet.account.address, chain: 'arbitrum', token: 'USDC', amount: 2 },
},
}),
})
console.log(await res.text())pay() behaves like fetch. Want a confirmation hook before any payment signs? Pass onPaymentRequired; want caps and an allowlist enforced before the wallet ever signs? Wrap it in the expense account instead — same client underneath, plus policy:
import { yeetful } from 'yeetful/agent'
const pay = yeetful({
wallet,
grant: {
allow: ['funding-mcp.yeetful.com'],
perCallUsd: 0.05,
perDayUsd: 2,
},
onReceipt: (r) => console.log(r.host, `$${r.amountUsd}`, r.txHash ?? r.note),
})The agent quickstart walks that setup end to end, and ledger sync puts every settlement and denial on your dashboard.
Why a paid door at all
- No account friction. The 402 challenge is the whole onboarding: no key to mint, no dashboard to visit, no quota to negotiate. An agent discovers the door, pays, and gets the answer — in one request cycle.
- No drift. Both doors register the identical tool set from the same code. The paid door is never a fork that ages separately.
- Fail-closed. A service whose paid door isn't configured answers
503with a pointer to the free door — it never silently serves unpaid.
The doors, today
| Service | Free door | Paid door |
|---|---|---|
| funding-mcp.yeetful.com — cross-chain funding planner | /mcp | /paid/mcp · $0.02 |
| uniswap-mcp.yeetful.com — Uniswap quotes, pools, guarded swap construction | /mcp | — |
| cow-mcp.yeetful.com — CoW Protocol swaps + limit orders, docs corpus | /mcp | — |
| snapshot-mcp.yeetful.com — DAO proposals, EIP-712 vote construction | /mcp | — |
| hyperliquid-mcp.yeetful.com — Perps: positions, orders, settlement waits | /mcp | — |
| aave-mcp.yeetful.com — Aave reserves, portfolios, supply/borrow construction | /mcp | — |
| lido-mcp.yeetful.com — ETH staking: positions, earnings, stake construction | /mcp | — |
| robinhood-mcp.yeetful.com — Robinhood Chain: tokenized stocks, Morpho, bridge | /mcp | — |
| opensea-mcp.yeetful.com — NFTs: holdings, floors, guarded transfer/sell/buy | /mcp | — |
| near-intents.yeetful.com — Cross-chain swaps via solver auction (1Click) | /mcp | — |
| wallet-mcp.yeetful.com — Balances + portfolios across 10 chains | /mcp | — |
Beyond the fleet, the directory lists ~70 third-party paid x402 services the router can call on your agent's behalf — exact-priced endpoints at or under $0.05 are auto-callable in chat.