Create a throwaway email, catch the verification mail, extract the OTP. Three REST calls or one MCP tool call. No IMAP, no browser automation, no SDK to install.
Provision an inbox, point your signup flow at it, pull the OTP. Smart extractors tuned for Stripe, GitHub, Clerk, Supabase, Resend, Auth0, and dozens more.
Read the docs →# 1. Add MailSink to your Claude Desktop / Cursor / Claude Code config { "mcpServers": { "mailsink": { "command": "npx", "args": ["-y", "@mailsink/mcp"], "env": { "MAILSINK_API_KEY": "msk_REPLACE_ME" } } } } # 2. Ask Claude: # "Create a MailSink inbox, wait for the verification email, return the OTP."
// 1. Provision a temp inbox const { id, address } = await fetch("https://api.mailsink.dev/v1/inboxes", { method: "POST", headers: { Authorization: `Bearer ${process.env.MAILSINK_API_KEY}` }, }).then((r) => r.json()); // 2. Drive your signup / verification flow (send mail to `address`) // 3. Pull the OTP const { code } = await fetch( `https://api.mailsink.dev/v1/inboxes/${id}/latest-code`, ).then((r) => r.json());
import os, requests H = {"Authorization": f"Bearer {os.environ['MAILSINK_API_KEY']}"} # 1. Provision a temp inbox inbox = requests.post( "https://api.mailsink.dev/v1/inboxes", headers=H, ).json() # 2. Drive your signup / verification flow (send mail to inbox["address"]) # 3. Pull the OTP code = requests.get( f"https://api.mailsink.dev/v1/inboxes/{inbox['id']}/latest-code", headers=H, ).json()
# 1. Provision a temp inbox curl -X POST https://api.mailsink.dev/v1/inboxes \ -H "Authorization: Bearer $MAILSINK_API_KEY" # 2. Drive your signup / verification flow (send mail to the address) # 3. Pull the OTP curl https://api.mailsink.dev/v1/inboxes/$INB/latest-code
{ "code": "847291", "from": "[email protected]", "subject": "Your code" } IMAP is a tax. Browser automation breaks. Mock email services don't actually receive mail. MailSink gives you what every test suite and agent actually needs: an inbox, a wait primitive, an extractor.
Real MX records on rotating shared domains. Stripe, GitHub, Google, Clerk, Supabase all deliver. No sandbox limits, no "test addresses" that bounce.
POST /v1/inboxes
One endpoint blocks until the OTP arrives, so your test skips the polling loop. Built for CI runners with strict timeouts.
GET /v1/inboxes/:id/wait-for-code
Drop @mailsink/mcp into Claude, Cursor, or any MCP host.
Eight read-only tools your agent already knows how to call.
npx @mailsink/mcp
Every inbox is provisioned and delivered through Cloudflare Email Routing, Workers, D1, and R2. No region to pick, no cold start tax. Senders see real MX records. You see structured JSON.
847291 https://github.com/verify?t=… /v1/inboxes 201 { "id": "inb_8xefq", "address": "signup-…@codenotify.net" } /v1/inboxes/inb_8xefq/wait-for-code 200 { "code": "847291", "from": "[email protected]" } wait_for_email ok { "code": "847291", "from": "[email protected]" } Other tools optimize for SMTP testing or marketing-email dev. MailSink is built for the verify-the-code, agent-completes-signup case. Prices reflect that.
| Ours MailSink | MailSlurp | Mailtrap | AgentMail | |
|---|---|---|---|---|
| Receive real mail | Sandbox only | |||
| MCP server | shipped | |||
| OTP extraction endpoint | /latest-code | Manual | Manual | |
| Free tier | 50 inboxes/mo | 10 inboxes | Trial 14d | Limited |
| Paid entry | $15/mo | $59/mo | $15/mo | $25/mo |
| Anonymous mode | no signup |
// pricing as of 2026-05. Inputs verified via vs MailSlurp, vs Mailtrap, vs AgentMail.
Good against common senders: Stripe, GitHub, Google, Clerk, Supabase, Auth0, Resend, AWS, and dozens more. We describe it honestly as basic extraction and document supported patterns per sender. If a sender isn't supported you can still read the raw message body via GET /v1/messages/:id.
No. MailSink is for testing your own signup flows, CI email verification, and authorized agent workflows. Creating accounts on third-party services in violation of their terms is prohibited and we'll cut off accounts that do it.
Exactly as long as the TTL you set, then they're removed from R2 and D1. Free: 1 hour. Pro: 24 hours. Team: 7 days. No backup copies, no retention.
Not in the first release. The MCP tool does long-polling with a timeout (wait_for_email), which covers the common agent case. Webhooks are on the roadmap.
We rotate shared domains across a reserve pool and monitor delivery. When a sender flags one, new inboxes auto-provision on a clean domain until it clears. Bring-your-own-domain is coming soon.
Not yet. The ingress plus Cloudflare Workers stack isn't trivial to package for self-hosting, so we're focused on the hosted product first.