Skip to main content

Provider-agnostic MCP server for email (IMAP/SMTP)

Project description

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": "me@example.com",
      "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": "me@company.com",
      "password": "app-password",
      "provider": "outlook"
    },
    {
      "name": "personal",
      "address": "me@gmail.com",
      "password": "app-password",
      "provider": "gmail"
    },
    {
      "name": "custom",
      "address": "me@mydomain.com",
      "password": "password",
      "imap_host": "mail.mydomain.com",
      "imap_port": 993,
      "smtp_host": "mail.mydomain.com",
      "smtp_port": 587,
      "smtp_security": "starttls"
    }
  ]
}

Fields

Field Required Description
send_code No If set, users must provide this code to send emails. Omit or set to "" to disable.
name Yes Short identifier for the account (used in tool calls)
address Yes Email address
password Yes Password or app-specific password
provider No Preset: gmail, outlook, purelymail, domainfactory
imap_host No Custom IMAP server (overrides provider default)
imap_port No Custom IMAP port (default: 993)
smtp_host No Custom SMTP server (overrides provider default)
smtp_port No Custom SMTP port (default: 465)
smtp_security No ssl (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_ADDRESS=me@example.com
EMAIL_PASSWORD=password
IMAP_HOST=imap.example.com
SMTP_HOST=smtp.example.com
SMTP_SECURITY=ssl
SEND_CODE=optional

Tools

Tool Description
email_list_accounts List configured accounts
email_list_folders List IMAP folders for an account
email_list_emails List recent emails in a folder
email_search_emails Search emails using IMAP criteria
email_read_email Read full email content by UID
email_get_attachment Download an attachment as base64
email_save_attachment Save an attachment directly to disk (preferred for large files)
email_send_email Send an email (text, HTML, attachments, calendar invites)
email_move_email Move an email between folders
email_mark_email Mark 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simple_email_mcp-1.0.0.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

simple_email_mcp-1.0.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file simple_email_mcp-1.0.0.tar.gz.

File metadata

  • Download URL: simple_email_mcp-1.0.0.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for simple_email_mcp-1.0.0.tar.gz
Algorithm Hash digest
SHA256 c5958586d5c7879c5f2222a2cfffc6c724c6726786dd08ffd3b82f336679ef64
MD5 852786cc076668d1e374cb107da8d8a0
BLAKE2b-256 ef60ed27a1f9e6d2486d804acc2d515fabd3f9a90ef4e829e08466b516f3fda6

See more details on using hashes here.

Provenance

The following attestation bundles were made for simple_email_mcp-1.0.0.tar.gz:

Publisher: publish.yml on mexican75/simple-email-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simple_email_mcp-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for simple_email_mcp-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 be3b07ba5cb686aa560140a3711a36ed6c4303e8b079e9bd0f3653332d950eed
MD5 45ba95c17a17bdccac32cd0066fc55ec
BLAKE2b-256 0bff0f027bd455089041642dc6142ee22f6cc184a442d15f1bebefb9c8e47b52

See more details on using hashes here.

Provenance

The following attestation bundles were made for simple_email_mcp-1.0.0-py3-none-any.whl:

Publisher: publish.yml on mexican75/simple-email-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page