Listed from the MCP registry; nobody on Odel publishes it.
Disposable email inboxes for AI agents — OTPs and magic links auto-extracted. No signup to try.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y zerodrop-mcp
MCP client config
{
"mcpServers": {
"zerodrop": {
"command": "npx",
"args": [
"-y",
"zerodrop-mcp"
]
}
}
}Email verification for AI agents — an MCP server that gives Claude, Cursor, Claude Code, and any MCP client disposable email inboxes with auto-extracted OTPs and magic links.
Your agent tests your app's signup. The app sends a verification code. Without an inbox it can read, the agent is stuck. With zerodrop-mcp:
Agent: generate_inbox()
→ swift-x7k29ab@zerodrop-sandbox.online
Agent: [fills the signup form with that address]
Agent: wait_for_email(inbox, require_otp: true)
→ { "otp": "847291", "subject": "Verify your email", ... }
Agent: [enters 847291 — flow complete]
No Docker. No SMTP. No signup to try: without an API key, one sender can reach 5 different inboxes a day. A free key lifts that.
claude mcp add zerodrop -- npx -y zerodrop-mcp
Add to claude_desktop_config.json:
{
"mcpServers": {
"zerodrop": {
"command": "npx",
"args": ["-y", "zerodrop-mcp"]
}
}
}
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"zerodrop": {
"command": "npx",
"args": ["-y", "zerodrop-mcp"]
}
}
}
generate_inboxCreates a disposable email address. Local and instant — no network request.
| Param | Type | Description |
|---|---|---|
prefix | string, optional | Prefix for the inbox name, e.g. your app name |
Returns the inbox address. With a key from zerodrop.dev/keys in ZERODROP_API_KEY, the name starts with your key's prefix (k7x2-myapp-swift-x7k29ab) and only your key can read it. Without one, a prefix whose part before the first hyphen is four letters and digits, at least one of each (app1, app1-web), goes after the adjective instead (swift-app1-web-x7k29ab), so the inbox can't fall under someone's account.
wait_for_emailBlocks until a matching email arrives, then returns it with the OTP and magic link already extracted — the agent never parses HTML or regexes a body.
| Param | Type | Description |
|---|---|---|
inbox | string | Address from generate_inbox |
timeout_seconds | number, optional | Default 30, max 120 |
from_contains | string, optional | Filter by sender |
subject_contains | string, optional | Filter by subject |
require_otp | boolean, optional | Only match emails with an OTP |
require_magic_link | boolean, optional | Only match emails with a magic link |
Returns:
{
"from": "noreply@yourapp.com",
"subject": "Your verification code",
"received_at": "2026-07-18T12:34:56Z",
"otp": "847291",
"magic_link": null,
"body_preview": "Your code is: 847291..."
}
Without an API key, one sender can reach 5 different inboxes a day. If ZeroDrop held the email because its sender passed that, wait_for_email returns at once (0.3.0 or later) with an error instead of waiting for the timeout:
{ "error": "held", "message": "ZeroDrop held an email from yourapp.com to this inbox. The email was not stored. …" }
check_inboxNon-blocking snapshot of the inbox — recent emails with extracted fields, or an empty list. A notice that ZeroDrop held an email appears as { "held": true, "received_at": "…", "message": "…" }.
Emails sent to a generated inbox are caught at Cloudflare's edge by ZeroDrop's open-source worker. OTPs and magic links are extracted at the edge before your agent reads them. On the free tier, an inbox is deleted 30 minutes after its latest email.
Environment variables (set in your MCP client config):
| Variable | Default | Description |
|---|---|---|
ZERODROP_API_KEY | — | Free key from zerodrop.dev/keys. Inbox names then start with your key's prefix, only your key can read them, and mail to them isn't limited. Without it, inboxes are public and one sender can reach 5 different inboxes a day; past that, the inbox gets a notice from notice@zerodrop.dev instead of the email. |
ZERODROP_DOMAIN | zerodrop-sandbox.online | Your Workspace's own domain, such as yourcompany-qa.com. Generated inboxes use it, and every inbox on it can be read only with your key, so set ZERODROP_API_KEY too. An address named by hand on it (qa@yourcompany-qa.com) is read from your key's prefix, where ZeroDrop files it. 0.4.0 or later |
ZERODROP_BASE_URL | https://zerodrop.dev | Self-hosted instance URL |
{
"mcpServers": {
"zerodrop": {
"command": "npx",
"args": ["-y", "zerodrop-mcp"],
"env": { "ZERODROP_API_KEY": "your-key" }
}
}
}
If you're generating test code rather than driving flows live, use the SDKs directly:
npm · PyPI · Go · RubyGems · Packagist · JitPack · GitHub Action
AI coding assistant context: docs.zerodrop.dev/ai-coding
ZERODROP_BASE_URL (zerodrop.dev by default) — nothing elseMIT — zerodrop.dev