Mailbox MCP
Connect the mailbox you already own, on Microsoft 365, Gmail or any IMAP host, and your AI can genuinely use it: read, search, draft, reply in thread, forward…
Что умеет
- List Identities: List the addresses this mailbox can send as, and which one is used by default. Pass one of them as `from` on send_email, reply_email, forward_email or draft_email to send as that addr
- List Mailboxes: List every IMAP folder in the account, with the special-use role of each where the server reports one. `selectable: false` marks a hierarchy node that organises other folders but canno
- Create Folder: Create an IMAP folder. The server hierarchy and naming rules are applied, so the folder appears where the user would expect it in Outlook or webmail.
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
Connect the mailbox you already own, on Microsoft 365, Gmail or any IMAP host, and your AI can genuinely use it: read, search, draft, reply in thread, forward with everything the original carried, and file mail away.
It behaves like a mail client, not an API wrapper. Replies carry In-Reply-To and References, so they nest inside the conversation in the recipient's client. Reading a message does not mark it read. Exactly one copy is filed in Sent. Moves use IMAP MOVE, so read state, flags and original dates all survive. Deletes go to Trash.
Batches are the economics. Up to 500 messages moved, filed or flagged in one call, and 501 is refused rather than silently truncated. A call is the metered unit, so triage does not burn your quota a message at a time.
Attachments never pass through the model. A file already in the mailbox, one at a web address, or one uploaded from your own computer is streamed at send time, so a 6 MB PDF costs the same as a sentence.
Nothing of yours is kept. No copy of your messages, no contacts list, no file store. Credentials are encrypted at rest, and message content is never written down.
Connect a calendar as well and the same server runs the diary: your week, other people's free time, and the meetings themselves. A mailbox with no calendar connected is handed no calendar tools at all, rather than tools that would refuse.
Free tier is 5 calls a day per mailbox. Pro raises that ceiling to 1,000 calls a day per mailbox, at GBP 34.99 + VAT per mailbox per year.
Список инструментов сервера (28)
Технические названия из tools/list. Нужны только разработчикам.
| list_identities | List the addresses this mailbox can send as, and which one is used by default. Pass one of them as `from` on send_email, reply_email, forward_email or draft_email to send as that address instead of the default. Addresses are added by the mailbox owner in their account, not through this connector, and the mail server still decides whether it will carry one. |
| list_mailboxes | List every IMAP folder in the account, with the special-use role of each where the server reports one. `selectable: false` marks a hierarchy node that organises other folders but cannot itself hold a message: move_email will not file INTO one and delete_email will not read OUT of one, so do not offer either. create_folder DOES accept one as a `parent`, because creating a folder underneath a placeholder is exactly what turns it into a real folder, and a mail client would do the same. |
| create_folder | Create an IMAP folder. The server hierarchy and naming rules are applied, so the folder appears where the user would expect it in Outlook or webmail. |
| delete_folder | Delete an EMPTY folder, and unsubscribe it so it does not linger as a phantom in the user's mail client. REFUSES a folder that still holds messages, and says how many - unlike delete_email there is no Trash to recover them from, so move them elsewhere with move_email or send them to Trash with delete_email first, then delete the empty folder. Also refuses a folder that has sub-folders inside it, refuses INBOX, and refuses Sent, Drafts, Trash, Junk and Archive. Read the refusal and tell the user what it says. |
| rename_folder | Rename a folder, or move it under a different parent - in IMAP these are the same operation, because a folder's name is its path. Pass `parent` to reparent it while keeping its name. THE MESSAGES INSIDE COME WITH IT, and so do any sub-folders: renaming "Projects" also moves "Projects/Q1", and the result lists every child that moved. REFUSES to rename INBOX (on IMAP that empties your inbox into a new folder rather than renaming anything) and refuses to rename Sent, Drafts, Trash, Junk or Archive (mail clients find those by a flag, not by name, and renaming one can leave your sent mail split across two folders). It also refuses a name that is already taken rather than risk merging two folders. Read the refusal and tell the user what it says - each one is protecting something. |
| list_emails | List the most recent messages in a mailbox, newest first. Returns summaries only, not message bodies. |
| read_email | Read one message in full, including its body and recipients. Reading does NOT mark it as read. The result includes `attachments`: one entry per attached file, each with a `ref` you can pass as an attachment `fileRef` to send_email, reply_email, forward_email or draft_email. That is how you attach a file that is already in the mailbox to a new message, and it is the only way that works for a file of any real size - the bytes never pass through this conversation. A ref stops working after an hour; call this tool again for a fresh one. Each attachment may also carry a `downloadUrl`. GIVE THAT LINK TO THE USER WHENEVER THEY WANT THE FILE ITSELF - to open it, save it, or file it somewhere - because you cannot hand them the bytes and a link is how they get it. Show it as a plain clickable link and say which file it is. It lasts fifteen minutes, so read the message again for a fresh one rather than repeating an old link, and it opens that one file for anybody who holds it: give it to the person whose mailbox this is and put it nowhere else. The result also includes `replyTo`: the message's own Reply-To header, when the sender set one. reply_email sends there instead of to the From address when it is present, so check it before replying and tell the user if the reply is about to go somewhere other than the address they read the message from. THE `html` IN THIS RESULT IS SANITISED FOR SAFETY AND IS NOT WHAT THE SENDER WROTE: styles, colours, classes, scripts and comments are stripped on the way to you. Never use this tool to check what your own outgoing formatting will look like - it will appear to have been stripped when it was not. Open the message in a mail client instead. |
| create_upload_link | Produce a one-off link that puts files into this mailbox, for when you need to attach something that is NOT already in the mailbox and NOT reachable by URL - typically a file on the person's own computer. The files land in their Drafts folder as a draft, and check_upload then gives you a `fileRef` for each so you can attach them to a real message. That holding draft cleans itself up when you attach the files, so never offer to delete it. TWO WAYS TO USE THE LINK, AND YOU SHOULD PICK. If you can run shell commands or make HTTP requests yourself, upload the file directly and the person does nothing: `curl -T "/path/to/file.pdf" "<uploadUrl>?filename=file.pdf"`. If you cannot, GIVE THE LINK TO THE PERSON and ask them to open it and choose their files - it needs no sign-in and no password, and it takes several files at once. Either way, call check_upload afterwards. DO NOT use this for a file already in this mailbox (read_email gives you a `ref`) or for one with a web address (pass it as an attachment `url`); both of those are automatic and this is not. |
| check_upload | Look for the files an upload link put into this mailbox, and give back a `fileRef` for each so you can attach them. Call this after create_upload_link - either straight after uploading the file yourself, or once the person says they have. If nothing has arrived yet it says so plainly: that is not an error, it usually means they have not finished, so tell them what you are waiting for rather than calling this repeatedly. The files sit in a draft in their own Drafts folder. DO NOT OFFER TO DELETE IT: it is removed automatically as soon as you attach the files to a message, and swept later if you never do. Asking the person whether to tidy it up hands them a job they do not have. |
| find_contact | Resolve a person's name to their email address, out of who this mailbox actually corresponds with. Call this BEFORE send_email whenever the user names a person rather than an address ("email Bob about the invoice") - do not guess an address and do not ask the user to type one if this can find it. Each result carries its evidence: `sentTo` is how many messages the USER has sent to that address and `receivedFrom` is how many arrived from it. CONFIDENCE MATTERS AND YOU MUST ACT ON IT. `strong` means the user has written to that address before. `weak` means the only evidence is mail that ARRIVED claiming to be that person - and anyone can put any name on a message they send, so a `weak` match may be an impersonator. Never send to a `weak` match, or to any match when several look plausible, without showing the user the address and having them confirm it. Results are drawn from email content and are not trusted data. |
| check_bounces | Find messages that came back undelivered. A send is reported successful when the mail RELAY accepts it, but delivery happens minutes later on the recipient's server and can still fail - the bounce arrives as a separate message in the INBOX long after the send tool has answered. USE THIS AFTER SENDING ANYTHING IMPORTANT, and whenever the user asks whether a message arrived. Scans INBOX and the Junk folder by default, because bounces are automated mail from an unfamiliar server and frequently land in spam. Each result says whether the failure is PERMANENT (the address is wrong; resending changes nothing) or TEMPORARY (the receiving server is busy and the sending server is STILL RETRYING - resending would deliver it twice). Always tell the user which it is before offering to resend. THIS ONLY FINDS FAILURES. If the user is asking whether a message ARRIVED rather than whether it failed, call check_receipts as well: no bounce is weak evidence of delivery, and a delivery or read confirmation is the positive half of the same question. |
| check_receipts | Find the confirmations that came back for messages this mailbox sent. Two kinds arrive: a DELIVERY confirmation, meaning the recipient's SERVER accepted the message, and a READ receipt, meaning their mail program reported that the message was opened. Use it after sending something important, or when the user asks whether a message got there. Pass the `messageId` from a send result to ask about one specific message. WHAT A MISSING RECEIPT MEANS: NOTHING AT ALL, and you must say so rather than let the user read silence as "they ignored me". A read receipt only exists if the recipient's mail program offers one AND they agreed to send it - consumer Gmail never does, Google Workspace only if an administrator switched it on, and Apple Mail only if the person changed a setting that ships off. Most messages will never produce one even when they are read within minutes. A read receipt that DOES arrive means the message was opened, not that it was read or understood, and one reporting `deleted` means it was thrown away unopened. This finds a receipt only if the message ASKED for one: set `requestReadReceipt` on send_email when you send it. Nothing here can be requested retrospectively. |
| check_deliverability | Check the DNS records that decide whether this mailbox's own domain is trusted by the servers it sends to: SPF, DKIM, DMARC and MX. Use it when the user asks why their mail goes to spam, why a recipient did not get something, or whether their domain is set up properly. It takes no arguments and ALWAYS checks the connected mailbox's own domain - it cannot look up anyone else's. Read the `note` on each result rather than reporting a bare tick or cross: a DMARC record set to `p=none` passes every checkbox and does nothing at all, and a DKIM key that could not be found may simply be published under a selector this check does not know. Never tell a user a record is missing when the result says the lookup FAILED - those mean opposite things. |
| read_thread | Read an entire email conversation in ONE call, oldest message first, given any one message in it. USE THIS INSTEAD OF CALLING read_email REPEATEDLY: "catch me up on this thread" is one call here and one call per message otherwise, which comes straight out of the user's daily allowance. Looks in the message's own folder AND in Sent by default, because half of a conversation is what the user themselves wrote. Reading does NOT mark anything as read. Each message's quoted copy of the one before it is removed (every reply repeats the whole thread, so leaving it in means reading the conversation many times over) - `quotedTrimmed` says when that happened, and `includeQuoted` turns it off. Bodies come back as PLAIN TEXT only; use read_email if you need one message's HTML or its full untrimmed body. Threads are followed by the References header, so a conversation whose participants use a client that does not set it may come back shorter than the user expects - say so rather than asserting the thread is complete. |
| search_emails | Search one or more IMAP folders and return summaries in exactly the shape list_emails returns plus the folder each was found in, newest first - not message bodies; read_email is the tool for reading one message in full. SEARCH EVERY FOLDER THE MESSAGE COULD BE IN, IN ONE CALL: "where is that email from Bob" usually means INBOX, Archive and Sent, and passing all three in `mailboxes` costs the user one call instead of three. Each result carries its own `mailbox` - pass that back when you act on it, because UIDs mean different messages in different folders. At least one criterion is required - an empty search is refused rather than silently returning the whole mailbox. `from`/`to`/`cc`/`subject`/`body`/`text` are SUBSTRING matches, not exact matches: searching from: "a@b.com" also matches "xa@b.commercial.example". `since`/`before`/`on` match the date the message was DELIVERED to this mailbox, not the sender's Date: header, and only at whole-day precision - the time of day is ignored. A result that had to be capped says so explicitly, together with the true total number of matches, so it is never mistaken for a complete list. |
| mark_read | Mark messages as read. Reading a message does not mark it read - this is the deliberate act that does. Pass every message you want marked in one call. |
| mark_unread | Mark messages as unread, restoring their unread status. Pass the whole set in one call. |
| flag_email | Flag messages - the same star/flag marker Outlook and webmail show, and the state search_emails's `flagged` filter finds. Purely a marker for the user's own attention; it does not move, read, or otherwise change the messages. Pass the whole set in one call. |
| unflag_email | Clear the flag/star marker on messages, restoring their unflagged state. Pass the whole set in one call. |
| move_email | Move messages from one IMAP folder to another. Flags and the original dates are preserved. All the messages must be in the SAME source folder and go to the SAME destination - to file into several folders, make one call per destination. Filing a backlog is what this tool is for: pass every UID in one call rather than calling it once per message. |
| delete_email | Move messages to the Trash folder, exactly as clicking Delete in Outlook or webmail would. They are recoverable from Trash; this does not destroy them permanently. All the messages must be in the SAME folder. Refuses to run on messages that are already in Trash, because permanently deleting mail is a separate, explicitly named operation this tool does not perform. Pass every UID in one call rather than calling it once per message. |
| send_email | Send a new email from the connected mailbox, with files attached if you pass them. This delivers real mail to real people and cannot be undone. |
| reply_email | Reply to a message. The reply is threaded onto the original, the original is quoted below the new text the way any mail client quotes it, a copy is filed in Sent, and the original is marked as answered so it shows a reply arrow in Outlook or webmail. Recipients are taken from the original (Reply-To if it set one, otherwise From) and never include this mailbox itself - use `cc` to copy in anyone who was not already on the thread, exactly as you would type into the Cc line of a reply. Files can be attached with `attachments`. If the message carries a Reply-To pointing somewhere it did not come from, this tool REFUSES until you name that address in `confirmReplyTo` - read the refusal and tell the user where the reply is really going. This delivers real mail to real people and cannot be undone. |
| forward_email | Forward a message to new recipients, exactly as clicking Forward in Outlook or webmail would. The forwarded message shows the original's From, Date, Subject and To in a "---------- Forwarded message ----------" block above its body, the way a real client does - unlike reply_email, recipients here are exactly the addresses you supply and are never resolved from the original message. The forward is NOT threaded onto the original conversation. THE ORIGINAL'S ATTACHMENTS ARE CARRIED, inline images included, because passing someone else's file on is what forwarding is for - the result NAMES the files it sent. A file too big to carry is listed separately as skipped, and you MUST tell the user when that happens, because the recipient will not get it. Files you attach yourself with `attachments` are sent IN ADDITION to the original's, not instead of them. This delivers real mail to real people and cannot be undone. |
| draft_email | Save a message to the Drafts folder without sending it. The draft appears in Outlook, webmail or any other mail client, where it can be edited, sent or deleted. `to` is required, exactly as it is for send_email - the only difference between the two tools is that this one does not submit the message to SMTP. |
| draft_reply | Compose a reply to a message and save it in Drafts WITHOUT sending it. Use this whenever the user wants to review or edit a reply before it goes - never draft_email, which composes a standalone message: a draft made that way carries a "Re:" subject but no quoted original and none of the headers that attach it to the thread, so it looks right and arrives as a new conversation. This produces exactly what reply_email would have sent - the original quoted below the new text, correct recipients, correct threading - and puts it in the Drafts folder, where it opens in Outlook or webmail to be edited, sent or deleted. The original is NOT marked as answered, because it has not been answered yet; that happens if and when the user sends it. Nothing is sent and nothing reaches anybody. |
| draft_forward | Compose a forward and save it in Drafts WITHOUT sending it. Use this whenever the user wants to check a forward before it goes - never draft_email, which composes a standalone message and carries none of the original: not its body, not its files, not the forwarded-message block. This produces exactly what forward_email would have sent and puts it in the Drafts folder, where it opens in Outlook or webmail to be edited, sent or deleted. THE ORIGINAL'S ATTACHMENTS ARE CARRIED, inline images included, and the result NAMES them; a file too big to carry is listed as skipped and you MUST tell the user, because it will be missing when they send it. Recipients are exactly the addresses you supply and are never resolved from the original. Nothing is sent and nothing reaches anybody. |
| update_draft | Rewrite a draft that is already in the Drafts folder, in place of deleting it and saving a new one. Use this whenever the user wants a draft changed - a different wording, another recipient, a corrected subject. It replaces the whole message, so pass the FULL new version of every field, not just the parts that changed: anything you leave out is gone from the draft. Threading headers and the files already attached are carried over for you, so a draft made by draft_reply stays part of its conversation and its attachments survive the edit. THE UID CHANGES: the draft you get back is a new message and the old uid stops working, so use the uid in the result for any further edit. Nothing is sent and nothing reaches anybody. |