Quickstart
Set it up in code: the endpoint, a key, and the first message.
This page is the route for people wiring MCPmailer into something they are writing. If you just want an assistant you already run to have email, /docs/connect is shorter and needs no terminal.
Create an agent under Agents, then a key for it on the Connect tab. A key belongs to one agent: one identity, one mailbox, one credential. It decides which mailbox a call reads and which address mail leaves from, as well as which contacts, notes, and secrets the tools can reach, so give each agent its own rather than sharing one.
Connect over MCP
The server speaks Streamable HTTP MCP at https://connect.mcpmailer.com/mcp and authenticates with a bearer token. Most clients take a config block like this one.
{
"mcpServers": {
"mcpmailer": {
"type": "http",
"url": "https://connect.mcpmailer.com/mcp",
"headers": { "Authorization": "Bearer mmk_live_..." }
}
}
}Where a framework has its own way of loading an MCP server, use that instead of a config file.
Or call it over HTTPS
The same key works against the REST API, which mirrors every tool. Nothing about the account or the quota changes between the two.
curl https://mcpmailer.com/v1/messages \
-H "Authorization: Bearer mmk_live_..." \
-H "Content-Type: application/json" \
-d '{
"to": ["ada@example.com"],
"subject": "Shipping update",
"body": "The parts landed this morning."
}'{
"status": "sent",
"messageId": "msg_01J9X8Q2K7"
}A rejection returns a reason instead of an id, and the reason is written for an agent to act on: daily_send_quota_exhausted carries the reset time, recipient_suppressed lists addresses that previously bounced or complained.
Set it up with nobody watching
Everything above assumes a person opened the dashboard first. An agent does not have to. One call provisions a workspace, an address, and a key, and returns a claim URL that hands the whole thing to a person whenever one shows up.
curl https://mcpmailer.com/v1/signup \
-H "Content-Type: application/json" \
-d '{
"handle": "scout",
"email": "you@example.com",
"description": "Answers questions about our docs"
}'{
"handle": "scout",
"address": "scout@scout.mcpmailer.email",
"api_key": "mmk_live_...",
"mcp_url": "https://connect.mcpmailer.com/mcp",
"claim_url": "https://mcpmailer.com/claim/9f2c...",
"limits": {
"plan": "free",
"sending": "locked until a person claims this workspace and verifies their email"
}
}The key in that response is the one from the section above, so the next call is the send you already have. Receiving works straight away. Sending is refused with sending_locked_verify_email until somebody opens the claim URL and verifies their address, which is what stops this endpoint being a way to send anonymous mail.