cpanel-mail-mcp
MCP server for IMAP/SMTP email accounts — works with cPanel, Gmail (app passwords), Outlook, Fastmail, iCloud, or any provider that speaks plain IMAP + SMTP.
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.)
- Compact MCP surface — one
emailtool with lazy action discovery to reduce client context use
Install
With uvx (recommended, no venv setup)
claude mcp add cpanel-mail \
-e CPANEL_USER=you@example.com \
-e CPANEL_PASS='your_password' \
-e CPANEL_SMTP_HOST=mail.example.com \
-e CPANEL_IMAP_HOST=mail.example.com \
-- uvx cpanel-mail-mcp
With pipx
pipx install cpanel-mail-mcp
claude mcp add cpanel-mail \
-e CPANEL_USER=you@example.com -e CPANEL_PASS='...' \
-e CPANEL_SMTP_HOST=mail.example.com -e CPANEL_IMAP_HOST=mail.example.com \
-- cpanel-mail-mcp
Development install (from a git checkout)
git clone https://github.com/rsauceda/cpanel-mail-mcp
cd cpanel-mail-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env # edit
cpanel-mail-mcp # runs the stdio server
# or: python -m cpanel_mail_mcp
Configuration
Three ways, in priority order:
1. EMAIL_ACCOUNTS_JSON (best for multi-account)
export EMAIL_ACCOUNTS_JSON='[
{"name":"work","user":"me@work.com","password":"...",
"smtp_host":"mail.work.com","imap_host":"mail.work.com",
"sent_folder":"INBOX.Sent"},
{"name":"gmail","user":"me@gmail.com","password":"app_pass",
"smtp_host":"smtp.gmail.com","smtp_port":587,
"imap_host":"imap.gmail.com","sent_folder":"[Gmail]/Sent Mail"}
]'
2. EMAIL_ACCOUNTS_FILE
Point to a JSON file with the same shape.
3. Legacy single-account (CPANEL_*)
Backwards compatible with 0.1.x installs. See .env.example.
Account fields
| field | required | default |
|---|---|---|
name |
no | user |
user |
yes | — |
password |
yes | — |
smtp_host |
yes | — |
smtp_port |
no | 465 |
imap_host |
yes | — |
imap_port |
no | 993 |
sent_folder |
no | Sent |
drafts_folder |
no | Drafts |
save_to_sent |
no | true |
from_name |
no | — |
Loading a dev .env
The server auto-loads .env from the current working directory. Point it
elsewhere with:
export EMAIL_ENV_FILE=/absolute/path/to/.env
Usage — the email tool
The server exposes one MCP tool named email. Call it with an action
string and a params dict. Discover actions with action='help' — the
default when action is omitted:
{ "action": "help" }
Actions at a glance
| action | purpose |
|---|---|
help |
list all actions and their signatures |
list_accounts |
see configured accounts (no secrets returned) |
list_folders |
list IMAP folders (UTF-7 decoded) |
list_recent |
last N messages of a folder |
search |
IMAP search by FROM/TO/SUBJECT/BODY/TEXT |
read |
read a message by UID (optionally with attachments) |
download_attachments |
fetch attachments as base64 |
send |
send an email (text/HTML/attachments) |
save_draft |
append a draft to the account's Drafts folder |
send_invite |
send an ICS calendar invite |
Send an email with an attachment
{
"action": "send",
"params": {
"to": "someone@example.com",
"subject": "Report",
"text": "See attached.",
"html": "<p>See <b>attached</b>.</p>",
"attachments": [
{"path": "/tmp/report.pdf"},
{"name": "note.txt", "content": "hi from inline"}
]
}
}
Attachment shapes accepted:
{"path": "/local/file.pdf", "name": "renamed.pdf"?}— read from disk{"name": "x.bin", "content_base64": "..."}— inline base64{"name": "x.txt", "content": "hello", "mime": "text/plain"?}— inline text
Read a message and its attachments
{
"action": "read",
"params": {"uid": "42", "folder": "INBOX", "include_attachments": true}
}
Download only specific attachments
{
"action": "download_attachments",
"params": {"uid": "42", "filenames": ["report.pdf"]}
}
Send a calendar invite
{
"action": "send_invite",
"params": {
"to": "guest@example.com",
"subject": "Kickoff",
"start": "2026-07-25 09:00",
"end": "2026-07-25 10:00",
"location": "Zoom link here",
"description": "quarter review"
}
}
Datetimes accept ISO 8601 (2026-07-25T09:00:00-06:00) or
YYYY-MM-DD HH:MM. Naive times are assumed UTC.
Save a draft
{"action": "save_draft", "params": {"subject": "todo", "text": "..."}}
Search
{"action": "search", "params": {"query": "invoice", "field": "SUBJECT"}}
Pick an account (multi-account setup)
Any action accepts an optional account param; omit it to use the first
configured account:
{"action": "send", "params": {"account": "work", "to": "...", "text": "..."}}
Send gate (recommended when an agent has this tool)
Prevent accidental sends by requiring a shared secret:
export EMAIL_SEND_CONFIRMATION_CODE=please-send
Every send / send_invite call must include confirm: "please-send" in
params, or the server refuses.
Security notes
.envis git-ignored. Never commit it.- Prefer a dedicated mailbox (e.g.
mcp@yourdomain.com) with a small quota. - If your provider supports app passwords (Gmail, Fastmail, iCloud), use one instead of your primary password.
- MCP env vars end up in
~/.claude.jsonon your machine — treat that file like a keychain.
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cpanel_mail_mcp-0.2.0.tar.gz.
File metadata
- Download URL: cpanel_mail_mcp-0.2.0.tar.gz
- Upload date:
- Size: 16.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
159d9872bf77cd038ed21dce59f92ac021c49167a6898ca6359cdbff0f3d9638
|
|
| MD5 |
5a5bb411b589723a84ecd9378c1c0889
|
|
| BLAKE2b-256 |
e7b96a89d072a0af67084b3d28fa308effc355da60c79d707f628c0ae7093a14
|
File details
Details for the file cpanel_mail_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: cpanel_mail_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e84414bccd7e350dfd1a42bd71e231f1dfd123b7e36d05012a6e0202a37b8d25
|
|
| MD5 |
2aacf6138162556e26fcf1e70a4ceefb
|
|
| BLAKE2b-256 |
626800f50cf0d4e817be29b6826c7f684475cbd69e7bdff3e7601133774651e0
|