A side-by-side look at the EmptyInbox and MCP Mailtrap MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose EmptyInbox for communication work as a local process; choose MCP Mailtrap for communication as a local process. You can also run both side by side in one mcpServers block.
register_account, get_quota, create_inbox.MAILTRAP_API_TOKEN, MAILTRAP_SENDING_TOKEN, MAILTRAP_ACCOUNT_ID, MAILTRAP_DEFAULT_FROM_EMAIL, MAILTRAP_TEST_INBOX_ID, DEBUG.get_stats, get_email_logs, get_email_log.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Communication | Communication |
| Quality signal | 63/100 · Good | 51/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | MAILTRAP_API_TOKENMAILTRAP_SENDING_TOKENMAILTRAP_ACCOUNT_IDMAILTRAP_DEFAULT_FROM_EMAILMAILTRAP_TEST_INBOX_IDDEBUG |
| Verified owner | Community listing | Community listing |
| GitHub stars | 4 | 3 |
| Directory activity | 1 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 12 | 46 |
| Full listing | View EmptyInbox | View MCP Mailtrap |
register_accountRegister a new EmptyInbox account and get an API key. Use this only if there is no account configured yet, or if authentication is failing. Prefer reusing an existing key: repeatedly registering from one network reduces the free credits each new account receives. Saves the key locally for future sessions.get_quotaCheck how many inbox credits remain on this account. When credits are low, the result says how to buy more with Bitcoin.create_inboxCreate a new disposable email inbox. Returns the email address and when it expires (30 days). Use this before triggering any signup or email verification flow.keep_inboxMake an inbox permanent so it never expires, for 30 credits. Use when the address was used to sign up for an account the user will keep (password resets go there). Ask the user first. Also brings back an expired inbox: addresses are never given to anyone else. Free if the inbox is already permanent.list_inboxesList all email inboxes on this account, with when each expires (null = permanent) and whether it already has.list_messagesList received email messages, newest first, already parsed: each entry carries the extracted one-time code, the link to open, and a text preview — no HTML parsing needed. Filter by inbox and use limit to keep responses small.get_messageGet one email message by ID. Returns the parsed message: extracted code, action_url, every link with its anchor text, and the body as plain text. Set format='text' for a flat rendering to read directly, or include_html=true only if the raw HTML is genuinely needed.wait_for_messagePoll an inbox until a new message arrives. Use after triggering an email verification, OTP, or signup confirmation. Returns the parsed message — including the extracted code and the link to open — as soon as it lands, or a timeout result.buy_quotaBuy inbox credits with Bitcoin. Only call this after the user has chosen a bundle or amount. Returns a pay_url to give the user: a page with a QR code, the exact amount and a live payment status, which works with any Bitcoin wallet. Also returns the raw address, amount and BIP21 URI for paying directly. Credits are added as soon as the payment is seen on the network. Call check_payment once the user has paid.list_bundlesList the inbox credit bundles for sale and their USD prices, paid in Bitcoin. Show these to the user before calling buy_quota.check_paymentCheck whether a Bitcoin payment from buy_quota has landed. Pass wait_seconds (around 120) once the user says they have paid, to wait for the credits in one call. Credit usually arrives within seconds of broadcast, well before confirmation.report_issueSend feedback to the EmptyInbox team: a bug, a failed or abandoned payment, confusing docs, or a missing feature. A human reads every report. Use it when a tool fails in a way retrying will not fix, or when the user decides not to buy and says why. Never include passwords, verification codes, API keys or email contents.get_statsSending statistics — delivery, bounce, open, click, spam rates. Group by domain, category, ESP, or dateget_email_logsList sent emails with filtering by status, stream, date. Cursor-based paginationget_email_logSingle message detail with delivery events timelineget_suppressionsList suppressed emails (bounces, spam complaints, unsubscribes)delete_suppressionRe-enable sending to a suppressed addresscheck_list_hygieneFind suppressed emails that still exist in contact lists and suggest exact cleanup actionssend_emailSend via transactional or bulk stream. Supports HTML, text, or templatesbatch_sendSend up to 500 emails in one requestsend_test_emailSend to a sandbox inbox for testing, with optional env defaults for inbox and senderlist_templatesList all email templatesget_templateGet template details including HTML/text bodycreate_templateCreate a new templatePaste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"emptyinbox": {
"command": "npx",
"args": [
"-y",
"emptyinbox-mcp"
]
}
}
}
{
"mcpServers": {
"mcp-mailtrap": {
"command": "npx",
"args": [
"-y",
"mcpj-mailtrap"
],
"env": {
"MAILTRAP_API_TOKEN": "YOUR_MAILTRAP_API_TOKEN_HERE",
"MAILTRAP_SENDING_TOKEN": "YOUR_MAILTRAP_SENDING_TOKEN_HERE",
"MAILTRAP_ACCOUNT_ID": "YOUR_MAILTRAP_ACCOUNT_ID_HERE",
"MAILTRAP_DEFAULT_FROM_EMAIL": "YOUR_MAILTRAP_DEFAULT_FROM_EMAIL_HERE",
"MAILTRAP_TEST_INBOX_ID": "YOUR_MAILTRAP_TEST_INBOX_ID_HERE",
"DEBUG": "YOUR_DEBUG_HERE"
}
}
}
}