simple-email-mcp

Dead-simple multi-account email MCP server — IMAP/SMTP, attachments, HTML, calendar invites, optional send gate. Works with any provider.

simple-email-mcp

A provider-agnostic MCP server for email (IMAP/SMTP). Works with any email provider — Purelymail, Gmail, Outlook, DomainFactory, or any standard IMAP/SMTP server.

Built for Claude Desktop, Claude Code, and any MCP-compatible client.

Features

  • Multi-account — manage multiple email accounts from different providers
  • Read, search, list — full IMAP support with folder browsing
  • Send emails — plain text, HTML, or both (multipart/alternative)
  • Attachments — send via file path or base64-encoded inline data
  • Download attachments — extract attachments from received emails as base64
  • Calendar invites — send proper ICS invitations with Accept/Decline buttons
  • Save to Sent — automatically saves sent emails to the Sent folder via IMAP
  • Optional send gate — configurable confirmation code to prevent accidental sends
  • International folders — handles UTF-7 encoded folder names (German, etc.)

Quick Start

1. Install

pip install simple-email-mcp

Or from source:

git clone https://github.com/mexican75/simple-email-mcp.git
cd simple-email-mcp
pip install .

2. Create accounts.json

{
  "accounts": [
    {
      "name": "personal",
      "address": "[email protected]",
      "password": "your-app-password",
      "provider": "gmail"
    }
  ]
}

3. Add to your client

Claude Code (global, all projects):

claude mcp add email -s user -e ACCOUNTS_FILE=/path/to/accounts.json -- simple-email-mcp

Claude Desktop — add to config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
  "mcpServers": {
    "email": {
      "command": "simple-email-mcp"
    }
  }
}

Or if running from source:

{
  "mcpServers": {
    "email": {
      "command": "python",
      "args": ["/path/to/simple_email_mcp.py"]
    }
  }
}

4. Restart your client

Configuration

accounts.json

{
  "send_code": "MYSECRETCODE",
  "accounts": [
    {
      "name": "work",
      "address": "[email protected]",
      "password": "app-password",
      "provider": "outlook"
    },
    {
      "name": "personal",
      "address": "[email protected]",
      "password": "app-password",
      "provider": "gmail"
    },
    {
      "name": "custom",
      "address": "[email protected]",
      "password": "password",
      "imap_host": "mail.mydomain.com",
      "imap_port": 993,
      "smtp_host": "mail.mydomain.com",
      "smtp_port": 587,
      "smtp_security": "starttls"
    }
  ]
}

Fields

FieldRequiredDescription
send_codeNoIf set, users must provide this code to send emails. Omit or set to "" to disable.
nameYesShort identifier for the account (used in tool calls)
addressYesEmail address
passwordYesPassword or app-specific password
providerNoPreset: gmail, outlook, purelymail, domainfactory
imap_hostNoCustom IMAP server (overrides provider default)
imap_portNoCustom IMAP port (default: 993)
smtp_hostNoCustom SMTP server (overrides provider default)
smtp_portNoCustom SMTP port (default: 465)
smtp_securityNossl (port 465) or starttls (port 587). Auto-detected from port if omitted.

Environment variables (single account)

Instead of accounts.json, you can configure a single account via environment variables:

[email protected]
EMAIL_PASSWORD=password
IMAP_HOST=imap.example.com
SMTP_HOST=smtp.example.com
SMTP_SECURITY=ssl
SEND_CODE=optional

Tools

ToolDescription
email_list_accountsList configured accounts
email_list_foldersList IMAP folders for an account
email_list_emailsList recent emails in a folder
email_search_emailsSearch emails using IMAP criteria
email_read_emailRead full email content by UID
email_get_attachmentDownload an attachment as base64
email_save_attachmentSave an attachment directly to disk (preferred for large files)
email_send_emailSend an email (text, HTML, attachments, calendar invites)
email_replyReply to an email (auto-sets recipient, subject, threading, quotes body)
email_reply_allReply all (sender → To, other recipients → CC, quotes body)
email_forwardForward an email with original attachments
email_move_emailMove an email between folders
email_mark_emailMark as read/unread/flagged/unflagged

Sending with attachments

File path (when the MCP server has filesystem access):

attachments: "/path/to/file.pdf, /path/to/doc.xlsx"

Base64 inline (when the caller is in a sandbox):

attachments_inline: [{"filename": "report.pdf", "content_base64": "JVBERi0...", "content_type": "application/pdf"}]

Sending calendar invites

Pass raw ICS content via calendar_ics. The email is structured as multipart/alternative so clients display Accept/Decline buttons:

calendar_ics: "BEGIN:VCALENDAR\r\nVERSION:2.0\r\n..."

Send confirmation gate

If send_code is set in accounts.json, the AI must show the email draft to the user and wait for them to provide the code before sending. This prevents accidental sends. Remove or clear send_code to disable.

Security

  • Passwords are stored in accounts.jsonadd it to .gitignore
  • The send_code gate prevents the AI from sending emails without user approval
  • No passwords are exposed via the email_list_accounts tool
  • File attachments: The attachments parameter reads files from paths the AI provides. If the MCP server runs with broad filesystem access, the AI could theoretically attach and send any readable file. Use attachments_inline (base64) in sandboxed environments, or restrict filesystem access at the OS/container level.

Provider Notes

Gmail

Use an App Password (not your Google password). Enable IMAP in Gmail settings.

Outlook / Microsoft 365

Use an App Password or enable basic auth for IMAP/SMTP.

Purelymail

Use your Purelymail account password directly.

License

MIT — see LICENSE

Authors

Verwandte Server