Building an autonomous AI concierge on AgentMail in one afternoon
The goal was small but specific: take a fresh AgentMail inbox (johnwork@agentmail.to), wire it to a local LLM running on a private NVIDIA DGX Spark, and ship the whole thing — receive side included — without any payment-processor account that would require KYC the agent itself can't do.
This is what I shipped, why, and where the rough edges are.
The pieces
- AgentMail for inbound/outbound email. Their WebSocket endpoint means no public webhook URL is required, which suits a workstation behind a residential network.
- Ollama with
gpt-oss:20brunning locally on the DGX Spark's GB10 Blackwell GPU. About 45 tokens/sec on this workload — easily good enough for one-shot email replies. solders(Python) for a self-custody Solana keypair,eth_accountfor an EVM keypair.cloudflaredquick tunnel for a public landing page without an account.- ~300 lines of Python, plus a single static HTML page.
The conversational loop
The agent subscribes to the inbox via WebSocket and reacts to message.received events. For each inbound:
- Skip if sender == self (prevent reply storms).
- Skip if body starts with "STOP" (opt-out).
- Detect high-intent signals — "hire", "rate", "quote", "$", "schedule a call". If present, generate a draft (not a send), label it
human-review, send a brief holding message, and self-mail an alert. - Otherwise check a per-sender daily quota (3/day free tier). Quota notice if exhausted.
- Otherwise: call
gpt-oss:20bwith a tight system prompt, scrub markdown emphasis, append a disclaimer footer that names the model and includes a tip jar address.
The "draft on high intent" pattern is the one I'd recommend most. It uses AgentMail's drafts.create API to stage a reply that a human reviews before sending — so the agent never makes unauthorized commitments about money or scope.
Closing the receive loop without KYC
This is where it gets interesting. Every payment processor I tried — Stripe, Crossmint, Coinbase's awal CLI, AgentWallet.ai — wants a human to KYC-verify a "principal" before issuing a wallet. Fair enough; that's how compliance works for fiat rails.
But for stablecoins, RECEIVE-only doesn't need KYC. So I:
from solders.keypair import Keypair
kp = Keypair()
print(kp.pubkey()) # 7nzHo7sh7sPwnDB6Je7Gfgxc5JDqUp6txzPUuJ5roezd
…and similarly for EVM via eth_account. The secret keys live in wallet.json and wallet_evm.json chmod 600 on the workstation. The public addresses are on the landing page with QR codes. The disclaimer footer of every email reply also includes them.
Verifiable on chain:
- Solana: solscan.io/account/7nzHo7sh7sPwnDB6Je7Gfgxc5JDqUp6txzPUuJ5roezd
- Base/EVM: basescan.org/address/0x3428137920f83d3838738c1935c9673a8E71ae93
The user (me) keeps the keys and can later import them into Phantom / MetaMask / Backpack to claim anything that arrives. No protocol intermediary, no SaaS dependency, no API key that can be revoked.
What I'd love AgentMail to ship
A native inbox.wallet.address field. Right now AgentMail covers the email side and devs (or agents) glue the wallet side on separately. If every AgentMail inbox had a programmable USDC receive address out of the box — wired through a partner like Crossmint or Coinbase CDP for compliance — the inbox would become a unit of agent identity AND value in one primitive. That would make AgentMail the obvious default for the receive side of x402 / MPP / AP2 flows, not just the messaging side.
What's missing
- No real customer demand yet. The system is receive-ready, the funnel works end-to-end, but a tunnel URL with no audience generates no email and no tips.
- Stripe Payment Link is a placeholder. The agent will graft on the link when configured but currently won't paywall hot prospects via card rails.
- The local LLM hallucinates specific facts (table numbers, API names) more than it should. The disclaimer footer is the front-line defense.
- The cloudflared tunnel is ephemeral — for production you want a Named Tunnel with your own subdomain.
If you want to play with it
Send any AI / ML / serving / fine-tuning question to johnwork@agentmail.to and you'll get a 150-220 word plain-text reply in about a minute. Free tier is 3/day/sender; high-intent ("hire", "quote") routes to a human-review draft.
Demo: ends-missing-feedback-puzzles.trycloudflare.com
If a reply saves you time, the tip jar addresses are at the bottom of the page. No expectation of a tip — they're mostly there to demonstrate that the agent has its own receive path.
— npub1kfcm8y92q4q5nzspreqfm2j8cnl6eey2wzw7hs947q2t60dqtpjqx40z22
