loading…
Search for a command to run...
loading…
Enables a coding agent to request small dev funds (ETH/WETH/USDC/USDT) from a personal hot wallet with per-call and 24h caps, plus TOTP approval for amounts ove
Enables a coding agent to request small dev funds (ETH/WETH/USDC/USDT) from a personal hot wallet with per-call and 24h caps, plus TOTP approval for amounts over soft caps.
MCP server that lets a coding agent request small dev funds (ETH/WETH/USDC/USDT) from a personal hot wallet, with caps and TOTP approval so a misbehaving agent can't drain it.
Agent work on smart wallets constantly needs small dev top-ups: fund a fresh smart account, seed a session key, test on a new chain. Public faucets are unreliable and rate-limited; topping up by hand is friction. This is a self-hosted faucet over MCP behind tight per-call and 24h budgets.
send (transfer) and status (balances + remaining budget).(chain class, token pool):STABLE window; ETH + WETH share ETHWETH.ethereum, base, arbitrum, optimism, polygon, plasma + their sepolia testnets and plasma-testnet.| Chain class | Pool | Soft/call | Soft 24h | Hard/call | Hard 24h |
|---|---|---|---|---|---|
| mainnet | stable | 0.10 | 1.0 | 1.0 | 10.0 |
| mainnet | eth | 0.00002 | 0.0005 | 0.0002 | 0.005 |
| testnet | stable | 2 | 20 | 20 | 200 |
| testnet | eth | 0.001 | 0.01 | 0.01 | 0.1 |
bun install
bun run setup # generates a FAUCET_TOTP_SECRET + otpauth URI
cp .env.example .env # then fill FUNDING_PRIVATE_KEY and FAUCET_TOTP_SECRET
Add the printed otpauth:// URI (or scan the QR) into Apple Passwords / 1Password as a verification-code entry. Fund the hot wallet with small dev amounts on the chains/tokens you expect to use.
Smoke-test the TOTP loop:
bun run bin/verify.ts <6-digit code from your authenticator>
| Variable | Required | Default | Description |
|---|---|---|---|
FUNDING_PRIVATE_KEY |
yes | — | 0x-prefixed hot wallet private key. |
FAUCET_TOTP_SECRET |
yes | — | Base32 TOTP secret (generated by bun run setup). |
FAUCET_STATE_FILE |
no | ~/.faucet/state.json |
Path for the rolling 24h send log + OTP replay cache. |
RPC_URL_<chainId> |
no | viem's public RPC | Override the RPC for a specific chain (e.g. RPC_URL_1=https://...). |
~/.claude.json or project .claude/settings.json:
{
"mcpServers": {
"faucet": {
"command": "bun",
"args": ["run", "--cwd", "/absolute/path/to/faucet-mcp", "src/server.ts"]
}
}
}
bun run --cwd <dir> makes Bun auto-load .env from the faucet directory, so the MCP can be invoked from any cwd.
send(amount, token, chain, recipient, code?) — execute a transfer. amount is a decimal string in human units (e.g. "0.5"), never wei. code is required only when the request exceeds the soft cap.status(chain?, token?) — funder balances, configured caps, used budget, remaining window. Use this to plan before calling send.MIT — see LICENSE.
For the full design notes, threat model, and limitations: see AGENTS.md.
Run in your terminal:
claude mcp add faucet-mcp -- npx