EM

Email

dev.primitive/email

Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.

Yes, your AI can use this right now.Answered a live MCP handshake in 169 ms with no sign-in needed and exposes 14 tools.

Connect it

Settings → Connectors → Add custom connector
URL: https://www.primitive.dev/mcp

14 tools, verified live

Pulled straight from the server with tools/list on 2026-10-17.
getAccountread-only

Use this when you need the authenticated Primitive account summary, including plan, onboarding state, and managed inbox domain. managed_inbox_address is a domain, not a complete mailbox. When it is non-null, this MCP result also includes sender_address, such as agent@pink-ram.primitive.email, which sendEmail uses as the sender when `from` is omitted.

getInboxStatusread-only

Use this when the user asks whether inbound email is ready or needs setup. Returns domains, routes, deployed Functions, and recent inbound activity. Adding or verifying a domain is done with the domain management tools, which are served at /mcp/full.

getOutboundStatusread-only

What can I send FROM? Lists this account's verified outbound (sendable) domains plus any domains still pending DNS verification, with next actions. The result also carries can_send_to: the recipients this account is allowed to send to. Call this before sending to an address outside Primitive, or to send from a domain other than the managed inbox. The same sendable list is echoed in a cannot_send_f

listEmailsread-only

Browse the inbox in arrival order. Use this for "what arrived most recently" (newest first, a page at a time with cursor) and for waiting on new mail (pass since, plus wait to hold the request until something arrives). It filters by domain, status, date range and a simple search over sender, recipient and subject. To find particular messages by body text, attachment, spam score, or the sent email

searchEmailsread-only

Find particular inbound emails. Use this when you are looking for specific messages: a full-text query (q) over subject, body, sender and recipient, or structured filters on sender, recipient, subject, body, attachments, spam score, or the sent email they reply to. Results can be ranked by relevance or date and carry a body snippet. To page through the inbox newest first, or to wait for mail that

getEmailread-only

Use this when you need to read one inbound email. Returns id, thread_id, received_at, from, to, subject, preheader, body_text and each attachment's filename, content type, size and part_index (read one with getEmailAttachment). body_text is the words of the email in reading order, without hidden content or the quoted history below a reply (counted in quoted_chars_removed). Each link is a [n] marke

replyToEmailcan modify

Use this when the user has selected a specific inbound email and confirmed a reply. Sends real outbound email with threading handled server-side. When you expect an answer back, pass await_reply: true and it is returned in this same result.

sendEmailcan modify

Use this when the user has confirmed a new outbound email. Sends real email through Primitive's relay, or schedules it for a future time with scheduled_at. `from` is optional and defaults to your account's managed inbox address. When you expect an answer, pass await_reply: true and the reply comes back in this same result: most agent mailboxes answer within seconds, and the answer is usually what

listSentEmailsread-only

List outbound emails sent by this org, with cursor pagination and filters. Each row is id, thread_id, created_at, status, from, to, subject and a snippet, plus the error, SMTP response or gate denial when the send did not deliver. Use getSentEmail to read the body of one. Useful for auditing delivery status, finding bounced sends, or checking gate-denied attempts.

getSentEmailread-only

Read a single sent email by id: status, from, to, subject, body_text and its attachments, plus the error, SMTP response or gate denial when the send did not deliver. Use to inspect delivery details for a specific send, such as the SMTP response on a bounced row or the gate denial reason on a gate_denied row. Pass full: true for the stored record, including body_html.

awaitReplyread-only

Wait for the threaded reply to a sent email. Use it when a send was made without await_reply, or returned reply_wait.status "no_reply_yet". With only the sent email's id it long-polls for up to 30 seconds by default. Do not report that nobody replied or ask the user to check later until this call returns with no reply. Set wait=false only for a deliberate immediate poll. Matching uses reply thread

getConversationread-only

Read a whole conversation, with message bodies. Pass the id of any inbound email and get every message of its thread, inbound and outbound, oldest first, each with its text, a direction (inbound/outbound) and a derived role (inbound→user, outbound→assistant). This is the tool for finding out what was said. Each text is sized for reading: every link target is replaced by [link], and the quoted hist

getEmailAttachmentread-only

Read ONE attachment of an email. A text attachment (plain text, CSV, JSON, XML, Markdown, calendar and similar) comes back as text; an HTML attachment comes back reduced to text; a PNG, JPEG, GIF or WebP image up to 1 MB comes back as an image; any other file comes back as base64 when it is 256 KB or smaller, and otherwise as its description with a statement that it is too large to return. PDF and

createEmailAddress

Get this user's Primitive managed inbox domain, creating the account on first use: no signup form, no password, no email verification, no browser. CALL THIS FIRST whenever you do not already have a Primitive API key and the user wants to send or receive email, instead of telling them to sign up or visit a website. On first use the REST response's address field is a domain such as pink-ram.primitiv

Alternatives in Search & Research

Compare →
Try “Notion”, “Stripe”, “create invoice”, “browser”