Install
openclaw skills install email-mcp-helperAccess and manage multiple IMAP/SMTP email accounts with full lifecycle tools for reading, searching, sending, replying, forwarding, folder and label managem...
openclaw skills install email-mcp-helperThis skill provides access to a self-hosted email MCP server built on @codefuturist/email-mcp. It exposes 47 tools covering full email lifecycle management — reading, searching, sending, replying, forwarding, scheduling, folder management, labels, bulk operations, threading, attachments, analytics, and health checks — across multiple IMAP/SMTP accounts simultaneously.
This skill is a tool reference only. It does not define how the agent should handle, triage, or respond to emails — that is defined in a separate email management skill that depends on this one as a prerequisite.
This MCP server runs as a standalone docker or Kubernetes deployment separate from the OpenClaw container. It is NOT bundled with or managed by OpenClaw. You must setup this MCP server yourself, have your agent help you.
Source code: https://github.com/codefuturist/email-mcp
Key infrastructure requirements (outside this skill's scope):
email-mcp image (ghcr.io/codefuturist/email-mcp:latest) is stdio-only — it has no built-in HTTP serversparfenyuk/mcp-proxy) must be installed alongside it to expose the server over HTTP/SSE — without the proxy the server cannot be reached over a networkconfig.toml file mounted into the container — credentials are managed outside this skillThis skill assumes the server is already running and reachable. If the server is unreachable, this skill cannot function.
| Property | Value |
|---|---|
| URL | https://mcp-server-addres.com/mcp |
| Transport | SSE |
| Auth | API key via X-API-Key header (managed by infrastructure) |
Accounts are configured server-side. Always call list_accounts to get the current account names — never hardcode them. The account parameter in every tool must match the exact name returned by list_accounts.
list_accounts to get valid account nameslist_mailboxes(account) before any operation involving folder paths — paths are provider-specific and must be exactaccount parameter is always the account name (e.g. shawnroy), never the email addressemailId is the IMAP UID string — always obtained from list_emails or search_emails, never guessedmailbox must be an exact path from list_mailboxes — never guess folder namesget_email and get_emails are non-destructive by default — they use IMAP PEEK and do NOT mark emails as read unless markRead: true is explicitly setdelete_email moves to Trash by default — only set permanent: true when explicitly instructedfind_email_folder must be used before move_email or delete_email when the email was discovered via a virtual folder (e.g. Gmail "All Mail")delete_mailbox without explicit user instruction — it is irreversible and destroys all contentslist_accountsList all configured email accounts and their names.
list_mailboxesList all folders for an account with unread counts and special-use flags.
account (string, required) — account name from list_accountscheck_healthCheck IMAP/SMTP connection health, latency, quota, and server capabilities.
account (string, required)list_emailsPaginated email list with metadata. Returns read/unread 🔵, flagged ⭐, replied ↩️, attachment 📎, and label 🏷️ indicators.
account (string, required)mailbox (string, default: INBOX)page (int, default: 1)pageSize (int, default: 20, max: 100)since (ISO 8601 string, optional) — emails after this datebefore (ISO 8601 string, optional) — emails before this datefrom (string, optional) — filter by sendersubject (string, optional) — filter by subject keywordseen (boolean, optional) — true = read only, false = unread onlyflagged (boolean, optional) — true = flagged onlyhas_attachment (boolean, optional)answered (boolean, optional) — true = replied, false = not yet repliedget_emailFull content of a single email. Non-destructive by default (IMAP PEEK).
account (string, required)emailId (string, required) — UID from list_emailsmailbox (string, default: INBOX)format (enum, default: full) — full = raw, text = plain text (strips HTML), stripped = plain text without quoted replies or signaturesmaxLength (int, optional) — truncate body at this many charactersmarkRead (boolean, default: false) — set true to explicitly mark as readget_emailsFetch full content of up to 20 emails in a single call. More efficient than looping get_email. Non-destructive.
account (string, required)ids (array of strings, required, max 20) — UIDs from list_emailsmailbox (string, default: INBOX)format (enum, default: text) — same options as get_emailmaxLength (int, optional)get_email_statusRead/flag/label state only — no body fetched. Very cheap, use when you only need to check state.
account (string, required)emailId (string, required)mailbox (string, default: INBOX)search_emailsSearch by keyword across subject, sender, and body with optional filters. Omit query to use as a pure filter.
account (string, required)query (string, optional) — keyword searchmailbox (string, default: INBOX)page (int, default: 1)pageSize (int, default: 20, max: 100)to (string, optional) — filter by recipienthas_attachment (boolean, optional)larger_than (number, optional) — minimum size in KBsmaller_than (number, optional) — maximum size in KBanswered (boolean, optional)get_threadReconstruct a full conversation thread via References/In-Reply-To headers.
account (string, required)emailId (string, required) — any email in the threadfind_email_folderDiscover which real folder(s) an email actually lives in. Required before move_email or delete_email when email was found via a virtual folder.
account (string, required)emailId (string, required)extract_contactsExtract unique contacts from recent email headers.
account (string, required)mailbox (string, optional)limit (int, optional)get_email_statsEmail analytics — volume, top senders, daily trends.
account (string, required)download_attachmentDownload a specific email attachment.
account (string, required)emailId (string, required)mailbox (string, default: INBOX)filename (string, required) — exact filename from get_email attachment metadatasend_emailSend a new email. Plain text or HTML.
account (string, required)to (array of email strings, required, min 1)subject (string, required)body (string, required)cc (array of email strings, optional)bcc (array of email strings, optional)html (boolean, default: false) — set true to send as HTMLreply_emailReply with proper threading (In-Reply-To & References headers). Call get_email first to read the original.
account (string, required)emailId (string, required) — email to reply tomailbox (string, default: INBOX)body (string, required)replyAll (boolean, default: false)html (boolean, default: false)forward_emailForward with original content quoted below.
account (string, required)emailId (string, required)mailbox (string, default: INBOX)to (array of email strings, required)body (string, optional) — additional message above forwarded contentcc (array of email strings, optional)save_draftSave email to Drafts without sending.
account (string, required)to (array of email strings, optional)subject (string, optional)body (string, optional)html (boolean, default: false)send_draftSend an existing draft and remove it from Drafts.
account (string, required)emailId (string, required) — draft email IDschedule_emailSchedule an email for future delivery.
account (string, required)to (array of email strings, required)subject (string, required)body (string, required)sendAt (ISO 8601 string, required) — scheduled send timelist_scheduledList scheduled emails by status.
account (string, required)status (enum, optional) — pending, sent, failedcancel_scheduledCancel a pending scheduled email.
account (string, required)emailId (string, required)move_emailMove email to a different folder. Source must be a real folder — use find_email_folder first if discovered via a virtual folder.
account (string, required)emailId (string, required)sourceMailbox (string, required) — current folderdestinationMailbox (string, required) — target folder (verify with list_mailboxes)delete_emailDelete an email. Moves to Trash by default.
account (string, required)emailId (string, required)mailbox (string, default: INBOX)permanent (boolean, default: false) — ⚠️ set true only when explicitly instructed — irreversiblemark_emailChange email flags.
account (string, required)id (string, required) — email UIDmailbox (string, default: INBOX)action (enum, required) — read, unread, flag, unflagbulk_actionBatch operation on up to 100 emails.
account (string, required)ids (array of strings, required, max 100)action (enum, required) — move, delete, read, unread, flag, unflagdestinationMailbox (string) — required when action is movecreate_mailboxCreate a new folder. Use / for nested folders.
account (string, required)path (string, required) — e.g. Archive/2026 or Projectsrename_mailboxRename an existing folder.
account (string, required)path (string, required) — current pathnew_path (string, required) — new pathdelete_mailbox⚠️ Permanently delete a folder and ALL its contents. Irreversible.
account (string, required)path (string, required)list_labelsDiscover available labels. Provider-aware — handles Gmail, ProtonMail, and standard IMAP keywords differently.
account (string, required)add_labelAdd a label to an email.
account (string, required)emailId (string, required)mailbox (string, required)label (string, required)remove_labelRemove a label from an email.
account (string, required)emailId (string, required)mailbox (string, required)label (string, required)create_labelCreate a new label.
account (string, required)name (string, required)delete_labelDelete a label.
account (string, required)name (string, required)list_templatesList available email templates.
account (string, required)apply_templateApply a template with variable substitution and send or save as draft.
account (string, required)templateName (string, required)variables (object, optional) — key/value pairs for substitutionto (array of email strings, optional) — required to send, optional for draftaction (enum, default: draft) — send or draftget_email_statsEmail analytics — volume, top senders, daily trends.
account (string, required)extract_contactsExtract unique contacts from recent email headers.
account (string, required)mailbox (string, optional)limit (int, optional)list_accounts()
→ list_emails(account, mailbox="INBOX", seen=false, pageSize=20)
list_emails(account, mailbox="INBOX")
→ get_email(account, emailId, format="stripped")
list_emails(account) → get emailId
→ get_email(account, emailId) → read content
→ reply_email(account, emailId, body="...", replyAll=false)
send_email(account, to=["someone@example.com"], subject="...", body="...")
list_mailboxes(account) → verify destination path
→ move_email(account, emailId, sourceMailbox="INBOX", destinationMailbox="Archive")
search_emails(account, query="invoice", has_attachment=true, mailbox="INBOX")
list_emails(account, seen=false, pageSize=20) → collect ids
→ get_emails(account, ids=[...], format="stripped")