MCP Email Server
A Model Context Protocol (MCP) server for email operations (POP3/SMTP with TLS). Allows an LLM like Claude to read, send, and manage emails.
Quick Start
Option 1: uvx (recommended)
No clone, no install — runs directly from GitHub:
uvx git+https://github.com/ptbsare/email-mcp-server \
--email-user [email protected] \
--email-pass yourpassword \
--pop3-server pop.example.com \
--smtp-server smtp.example.com
First run caches the package; subsequent launches are instant.
Option 2: Clone + run locally
git clone https://github.com/ptbsare/email-mcp-server
cd email-mcp-server
uv pip install -e .
uv run main.py --email-user [email protected] --email-pass yourpassword \
--pop3-server pop.example.com --smtp-server smtp.example.com
Option 3: .env file
Create a .env file in the working directory:
[email protected]
EMAIL_PASS=yourpassword
POP3_SERVER=pop.example.com
SMTP_SERVER=smtp.example.com
Then simply:
uvx git+https://github.com/ptbsare/email-mcp-server
# or
uv run main.py
Configuration
Config Priority (highest → lowest)
- CLI arguments — override everything
- Environment variables — override
.envfile .envfile — fallback defaults
All Config Options
| CLI Argument | Env Variable | Required | Default | Description |
|---|---|---|---|---|
--email-user |
EMAIL_USER |
✅ | — | Email address |
--email-pass |
EMAIL_PASS |
✅ | — | Email password / app password |
--pop3-server |
POP3_SERVER |
✅ | — | POP3 server hostname |
--pop3-port |
POP3_PORT |
995 |
POP3 SSL port | |
--smtp-server |
SMTP_SERVER |
✅ | — | SMTP server hostname |
--smtp-port |
SMTP_PORT |
587 |
SMTP port (auto 465 if --smtp-use-ssl) |
|
--smtp-use-ssl |
SMTP_USE_SSL |
false |
Use SMTP_SSL (port 465) instead of STARTTLS | |
--log-level |
LOG_LEVEL |
INFO |
Logging: DEBUG / INFO / WARNING / ERROR |
Examples: Mixing Config Sources
# CLI args only (no .env needed):
uv run main.py --email-user [email protected] --email-pass xxx \
--pop3-server pop.gmail.com --smtp-server smtp.gmail.com
# .env file for credentials, CLI for servers:
# .env: [email protected] / EMAIL_PASS=xxx
uv run main.py --pop3-server pop.gmail.com --smtp-server smtp.gmail.com
# Env vars override .env:
[email protected] uv run main.py --pop3-server pop.gmail.com ...
Using with Claude Desktop
Add to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.jsonWindows: %APPDATA%/Claude/claude_desktop_config.json
With env vars (in config):
{
"mcpServers": {
"email-mcp-server": {
"command": "uvx",
"args": ["git+https://github.com/ptbsare/email-mcp-server"],
"env": {
"EMAIL_USER": "[email protected]",
"EMAIL_PASS": "your-app-password",
"POP3_SERVER": "pop.example.com",
"SMTP_SERVER": "smtp.example.com"
}
}
}
}
With CLI args (in config):
{
"mcpServers": {
"email-mcp-server": {
"command": "uvx",
"args": [
"git+https://github.com/ptbsare/email-mcp-server",
"--email-user", "[email protected]",
"--email-pass", "your-app-password",
"--pop3-server", "pop.example.com",
"--smtp-server", "smtp.example.com"
]
}
}
}
Tip: The
envsection and CLI args can be used together. CLI args always take priority.
Features
- Poll Emails: List inbox email headers with configurable limit (
pollEmails) - Fetch Full Emails: Get complete email content by ID, with automatic attachment extraction (
getEmailsById) - Delete Emails: Remove emails by ID (
deleteEmailsById) - Send Emails: Send plain text (
sendTextEmail) or HTML (sendHtmlEmail) emails with optional file attachments - Secure Connections: POP3 over SSL (port 995), SMTP with STARTTLS (port 587) or direct SSL (port 465)
- Attachment Support: Send local files as attachments; received attachments are auto-saved to
/tmp/email_mcp_attachments/<email_id>/
Tools
pollEmails(limit=50)
List recent email headers (no body). Returns newest first. Use this first to get IDs for getEmailsById/deleteEmailsById.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit |
int |
50 |
Max emails to return, newest first |
Returns: [{"id": int, "Subject": str, "From": str, "Date": str, "Message-ID": str}]
pollEmails(limit=10) # 10 most recent
pollEmails() # default 50
getEmailsById(ids)
Fetch full email content (headers + body) by IDs from pollEmails. Attachments auto-saved to /tmp/email_mcp_attachments/<id>/.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids |
list[int] |
✅ | Email IDs from pollEmails(). Example: [1, 3, 5] |
Returns: [{"id": int, "headers": dict, "body": str, "attachments": [{"filename": str, "local_path": str, "size": int, "content_type": str}]}]
getEmailsById(ids=[1, 3, 5])
deleteEmailsById(ids)
Permanently delete emails by IDs. Irreversible. Call pollEmails first.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids |
list[int] |
✅ | Email IDs from pollEmails(). Example: [1, 2, 3] |
Returns: {"deleted": [int], "failed": {"id": "error msg"}}
deleteEmailsById(ids=[1, 2, 3])
sendTextEmail(toAddresses, subject, body, attachments=None)
Send a plain text email. Sender auto-set to EMAIL_USER. Attachments: list of local file paths like ["/tmp/file.pdf"].
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
toAddresses |
list[str] |
✅ | — | Recipients. Example: ["[email protected]"] |
subject |
str |
✅ | — | Subject line |
body |
str |
✅ | — | Plain text body |
attachments |
list[str] |
None |
Local file paths. Example: ["/tmp/report.pdf"] |
Returns: {"status": "success"}
sendTextEmail(
toAddresses=["[email protected]"],
subject="Hello",
body="Hi Alice!",
attachments=["/tmp/report.pdf"]
)
sendHtmlEmail(toAddresses, subject, body, attachments=None)
Send an HTML email. Sender auto-set to EMAIL_USER. Attachments: list of local file paths like ["/tmp/file.png"].
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
toAddresses |
list[str] |
✅ | — | Recipients. Example: ["[email protected]"] |
subject |
str |
✅ | — | Subject line |
body |
str |
✅ | — | HTML content. Example: "<h1>Hi</h1><p>Hello!</p>" |
attachments |
list[str] |
None |
Local file paths. Example: ["/tmp/chart.png"] |
Returns: {"status": "success"}
sendHtmlEmail(
toAddresses=["[email protected]"],
subject="Report",
body="<h1>Report</h1><p>Sales up <b>20%</b>.</p>",
attachments=["/tmp/chart.png"]
)
Development Setup
Prerequisites
- Python 3.12+
- uv
Steps
git clone https://github.com/ptbsare/email-mcp-server
cd email-mcp-server
uv pip install -e .
uv run main.py --help
Important Notes
- App Passwords: If your email provider uses 2FA, generate an App Password for
EMAIL_PASS - Email IDs: POP3 IDs are session-specific. Call
pollEmails()beforegetEmailsById()ordeleteEmailsById() - Attachment Storage: Received attachments are saved to
/tmp/email_mcp_attachments/<email_id>/ - Security: Never commit your
.envfile — it's already in.gitignore - Config Priority: CLI args > environment variables >
.envfile
Project Structure
email-mcp-server/
├── main.py # MCP server entry point (all logic)
├── pyproject.toml # Package config & dependencies
├── uv.lock # Dependency lock file
├── .env # Credentials (create your own)
├── .gitignore
└── README.md
License
MIT