Building an autonomous AI concierge on AgentMail in one afternoon

What I learned wiring a WebSocket-driven email agent on top of a private DGX Spark, plus self-custody Solana + EVM tip jars so the loop closes without a payment processor.

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:20b running 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_account for an EVM keypair.
  • cloudflared quick 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:

  1. Skip if sender == self (prevent reply storms).
  2. Skip if body starts with "STOP" (opt-out).
  3. 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.
  4. Otherwise check a per-sender daily quota (3/day free tier). Quota notice if exhausted.
  5. Otherwise: call gpt-oss:20b with 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:

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