Transactional email and agent mailboxes: send, broadcasts, domains, Correio inboxes.
Self-host on your own AWS SES, or use the hosted cloud at mepmail.dev. Migrating from Resend means changing two environment variables — not rewriting your integration.
| Feature | Status | Notes |
|---|---|---|
| Emails API (Resend-compatible) | ✅ | Send, batch, get, cancel — same request/response shapes as Resend. |
| Idempotency | ✅ | Idempotency-Key header dedupes retried sends. |
| API keys | ✅ | Create and revoke ms_ keys from the dashboard, with last-used tracking. |
| Suppression list | ✅ | Hard bounces and complaints suppressed automatically; review and remove per address, or manage via /suppressions (batch add/remove up to 1000). |
| Metrics | ✅ | Daily sends with bounce and complaint rates tracked against SES thresholds. |
| Webhooks (Standard Webhooks) | ✅ | Signed event deliveries (webhook-* and svix-* headers) with per-endpoint event selection, a delivery log, and bring-your-own whsec_ secret. |
| Domains + BYODKIM | ✅ | Guided DNS verification; bring your own DKIM key or let SES manage it. |
| Contacts | ✅ | Team-wide contacts with subscribe state, segments, topics, CSV import, and bulk POST /contacts/batch. |
| One-click unsubscribe (RFC 8058) | ✅ | List-Unsubscribe headers plus a hosted unsubscribe page. |
| Broadcasts | ✅ | Compose, schedule, and send to all contacts, a segment, or a topic; cancel while scheduled. |
| Templates + merge fields | ✅ | Reusable templates with per-contact merge fields; /templates API with per-team aliases. |
| API request logs | ✅ | Every API request recorded with request/response bodies, secrets redacted. |
| SMTP relay | ✅ | Drop-in SMTP on port 2587; authenticate with an API key. |
| Dashboard (en/pt-BR) | ✅ | Full dashboard in English and Brazilian Portuguese. |
| Self-host (Docker) | ✅ | Source-built Compose stack plus a setup wizard; sends through your own AWS SES. |
| Migrate from Resend | ✅ | npx @mepmail/cli migrate --from resend moves contacts, segments, topics, templates, webhooks, domains and suppressions; read-only against Resend, safe to re-run before cutover. |
| MCP for AI agents | ✅ | Hosted MCP server (https://api.mepmail.dev/mcp, OAuth) and a local stdio server: npx @mepmail/mcp. |
| Agent discovery | ✅ | /.well-known/ai-catalog.json, /llms.txt and /auth.md served by the web app. |
| Docs (en/pt-BR) | ✅ | Full documentation at docs.mepmail.dev. |
Build from this source checkout:
git clone https://github.com/JE4NVRG/mepmail.git mepmail
cd mepmail
cp .env.example .env
Fill the two required secrets in .env before boot (MASTER_ENCRYPTION_KEY and
BETTER_AUTH_SECRET; generate each with openssl rand -base64 32).
The supported installation path is a local source build (root Dockerfile /
docker-compose.yml); third-party installers or prebuilt images are not
supported release channels for this project. The source wizard (pnpm setup:aws)
and the full SES/SNS event pipeline are documented in the
self-hosting guide.
docker compose up --build -d
Dashboard at http://localhost:3000, API at http://localhost:3001.
Keep your Resend SDK: point its baseUrl at your MepMail instance and swap the
API key. The wire protocol is compatible, so request shapes do not change.
npx -y @mepmail/mcp # stdio server for Claude Code, Cursor and any MCP client
Code is licensed under AGPL-3.0.
This project is derived from MillionSend;
attribution and notices live in NOTICE.md. The @mepmail/mcp server ships
under MIT. Upstream names, wordmarks and logos remain property of their
respective owners and are not licensed under the AGPL.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @mepmail/mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-je4nvrg-mepmail": {
"command": "npx",
"args": [
"-y",
"@mepmail/mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@mepmail/mcpnpmMepMail works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.