Send, receive, and respond to email from your agent. One MCP connection. Your domain. Built-in approval queue.
{
"mcpServers": {
"mcpmail": {
"url": "https://mcpmail.app/mcp",
"headers": { "Authorization": "Bearer mcpm_live_..." }
}
}
}
The moment your agent needs to talk to a customer, a vendor, or another company, it hits a wall. SMTP configuration, DNS records, MIME parsing, thread reconstruction, bounce handling — infrastructure that takes weeks to build and months to get right.
MCPMail gives your agent an email address in minutes.
Add three DNS records. Your agent sends and receives as your domain. Existing email stays untouched.
domain.add({ domain: "acme.com" })
// Returns DKIM CNAMEs, SPF include, MX record
// Add them to your DNS, then:
domain.verify({ domain: "acme.com" })
// → { status: "verified", dkim: "pass", spf: "pass" }
Each mailbox is an independent agent inbox. Provision as many as you need.
mailbox.create({
address: "support",
domain: "acme.com",
display_name: "Acme Support",
send_mode: "queue"
})
// → support@agent.acme.com is live
Your agent reads inbound mail, gets parsed content and contact context, drafts a reply, and pushes it to the approval queue.
const msgs = await mail.list({ unread: true })
const msg = await mail.get({ message_id: msgs[0].id })
// msg.from.context → { company, title, tags, history }
// msg.body → cleaned reply, signatures stripped
// msg.attachments[0].parsed_text → PDF extracted
await mail.reply({
message_id: msg.id,
body: response
})
// → queued for approval
Every outbound email can be held for review before it leaves. A human approves, a critic agent reviews, or auto-approve rules pass it through when conditions are met.
Start supervised. Loosen the controls as trust builds. The queue is the default — direct sending is opted into, not out of.
mailbox.set_send_mode({
mailbox_id: "mbx_ops",
mode: "auto_approve",
rules: {
reply_to_existing_thread: true,
max_body_length: 500,
recipient_allowlist: [
"*@vendor.com"
]
}
})
// Critic agent reviews the queue
const pending = await queue.list({
status: "pending"
})
await queue.approve({
queue_id: pending[0].id
})
// → message sent via SES
mail.get({ message_id: "msg_9xK2..." })
// → response includes sender context
{
from: {
email: "jane@acme.com",
name: "Jane Smith",
context: {
company: "Acme Corp",
title: "VP Operations",
relationship: "Customer since 2024",
notes: "Prefers concise replies",
previous_threads: 12,
tags: ["high-value"],
custom: {
plan: "pro",
mrr: 790
}
}
},
body: "The parsed reply..."
}
MCPMail maintains a contact record for every email address your agent interacts with. Company, role, relationship history, custom fields, notes, tags.
The context is on the message when it arrives — your agent doesn't need a separate CRM lookup to know who it's talking to.
Pre-load contacts from your CRM, let MCPMail accumulate them automatically from email headers and signatures, or let the agent update them as it works.
SES under the hood. You never touch it.
Full SPF, DKIM, DMARC alignment. Recipients see your domain, not ours.
Signatures stripped. Quoted text separated. Your agent gets just the new content.
Outbound held for review. Auto-approve rules. Critic agent support. Trust ramps up.
PDFs become text, CSVs become JSON. Agents read attachments as structured data.
Automatic threading via Message-ID, In-Reply-To, References. No header management.
Real-time POST on message received. HMAC-signed. Retry with backoff. Or just poll.
Every sender gets a record. Pre-load, accumulate, or let the agent build it.
Search messages by content, sender, date range, attachment presence.
Hard bounces, soft bounces, complaints — tracked and surfaced automatically.
Small surface, maximum utility. Each tool does one thing.
domain.add Register a domain
domain.verify Check DNS records
domain.list All verified domains
domain.remove Deregister a domain
mailbox.create Provision an inbox
mailbox.list All active mailboxes
mailbox.delete Remove a mailbox
mailbox.set_send_mode Configure approval rules
mail.send Send an email
mail.reply Reply in a thread
mail.list Poll for messages
mail.get Full message + context
mail.search Full-text search
mail.draft Save without sending
mail.send_draft Send a saved draft
mail.mark_read Mark as processed
queue.list Pending outbound
queue.get Full context for review
queue.approve Release to send
queue.reject Block with reason
contact.set Add or update context
contact.get Look up a sender
contact.list Search contacts
thread.list All conversations
thread.get Full thread history
webhook.create Register a URL
webhook.list Active webhooks
webhook.delete Remove a webhook
Every company, system, and person already speaks email.
Triage inbound, draft responses with context, escalate what the agent can't handle. L1 automated, L2 human.
Score inbound inquiries, ask qualifying questions, route hot leads to sales, create CRM records.
Send invoices, parse incoming ones from PDF attachments, match POs, follow up on overdue.
Send RFQs, compare quotes when replies arrive, manage PO back-and-forth.
Acknowledge applications, schedule screens via calendar, send prep materials, coordinate feedback.
Your agent emails their agent. Negotiations, confirmations, and POs — all over SMTP.
Standard MCP server. One config snippet. Any agent framework.
Per mailbox. Per message. No seats. No bundled AI credits.
AI inference is your cost, not ours. We charge for the pipes.
Provision a mailbox, verify your domain, send your first email. Under fifteen minutes.