New
- Connect by signing in. Claude, Claude Code, Cursor, Codex and VS Code connect to
https://api.mails.ai/mcpby signing in to mails.ai: choose the workspace, press Allow, and there is no API key to paste. - A real inbox. Attachments with download links, the original email as it was sent, search across your mail, five folders (inbox, archive, spam, trash and sent) and coloured labels.
- The
mailscommand line. Send, read and manage mail from a terminal:npx @mailsai/cli. - The whole API in the SDKs and the MCP server.
@mailsai/sdkand the Pythonmailsai0.3.0 cover every call.@mailsai/mcp-server0.3.0 has a tool for every endpoint except the event stream, the billing portal and the two unsubscribe links, named likemails_send; the old dotted names still work. - Agent skills.
npx skills add mailsai/skillsteaches Claude Code and other agents to send and receive through mails.ai. - Single sign-on with any OpenID Connect provider, on the Scale plan.
- See and revoke connected apps from code.
GETandDELETE /v1/oauth/grantslist the apps connected to your workspace and revoke one, like Settings › Connected apps, and the CLI hasmails connected-apps listandmails connected-apps revoke. - A drafts-only API key. The new
draftscope writes drafts and never sends them, for an agent whose mail a person approves first. - Received mail shows its scan result. Each received message carries its injection score and whether it was quarantined.
- Change plans yourself. On Billing, "Switch to Pro" or "Switch to Scale" opens Stripe's billing page.
- A new dashboard, and a live demo on the home page.
Check these before you rely on the old behaviour
- Keys tied to one agent now stay inside that agent. Another agent's message, thread, draft, attachment or original email answers 404, and lists and search hold only its own agent's mail. Webhooks and labels belong to the whole workspace, so such a key cannot change them (403).
- Webhooks on
*no longer receivethread.created,thread.updatedorthread.deleted. Name those events on the endpoint to keep getting them. The newmessage.delayedalso comes only to an endpoint that names it. - After you rotate a webhook signing secret, each delivery carries two
v1signatures for 24 hours. Accept the delivery when anyv1matches, not only the last one. The 0.3.0 SDKs do. - Received mail is authenticated from the original email. DKIM is verified, DMARC passes when a signature aligned with the sender's domain verifies, and
spf_passisnull, because SPF can only be judged where the mail arrived.message.received.unauthenticatednow fires only when a domain that asks for signed mail (a DMARC policy of quarantine or reject) sends without a valid signature. - A 429 says when the limit resets. The body carries
resets_atandretry_after_seconds, and theRetry-Afterheader comes only when the wait is 60 seconds or less. The 0.3.0 SDKs wait and retry then, and otherwise raise an error that carries the reset time. - An agent paused for its bounce or complaint rate stays paused until the rate recovers. Setting it active answers 403
agent_suspended. - A reply or forward on mail of an agent your key cannot read answers 404, without naming that agent.
— the mails.ai team