email-mcp-server
README.md
# Email MCP Server
An MCP (Model Context Protocol) server that lets your AI assistant send emails via SMTP.
## Features
- **`send_simple_email`** — Send a quick email (text or HTML); accepts optional `smtp_config`
- **`send_custom_email`** — Full control: CC/BCC, attachments; accepts optional `smtp_config`
- **`test_smtp_connection`** — Verify your SMTP settings before sending; accepts optional `smtp_config`
## Quick Start
```bash
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
cd email-mcp-server
uv sync --extra dev
```
Configure SMTP (see next section), then run:
```bash
# stdio transport (for MCP clients)
uv run python -m email_mcp_server.server
# Streamable HTTP transport (port 8000)
uv run python -m email_mcp_server.server --http
```
Run tests:
```bash
uv run pytest
```
## SMTP Configuration
You can configure SMTP credentials in two ways — use one or both.
### Option A: Environment variables
Copy the example and fill in your credentials:
```bash
cp env.example .env
```
```env
# Required
SMTP_HOST=smtp.gmail.com
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM=your-email@gmail.com
# Optional (defaults shown)
# SMTP_PORT=587
# SMTP_SECURE=false
```
Alternatively, pass them via the client's `env` block (see Client Configuration below).
### Option B: Per-call payload
Pass `smtp_config` directly in any tool call — environment variables are ignored for that call:
```json
{
"smtp_config": {
"host": "smtp.gmail.com",
"port": 587,
"secure": false,
"username": "your-email@gmail.com",
"password": "your-app-password",
"from_email": "your-email@gmail.com"
}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `host` | string | SMTP server hostname |
| `port` | integer | SMTP server port (usually `587`) |
| `secure` | boolean | Use SSL/TLS (`false` for STARTTLS) |
| `username` | string | Auth username |
| `password` | string | Auth password |
| `from_email` | string | Sender email address |
## Client Configuration
### Claude Code
```bash
# stdio
claude mcp add email-server -- uv --directory /absolute/path/to/email-mcp-server run python -m email_mcp_server.server
# streamable HTTP (start the server first with --http)
claude mcp add --transport http email-server http://localhost:8000/mcp
```
### JSON-based clients (Claude Desktop, Cursor, VS Code, Windsurf, Zed)
Use the generic example below and adjust the top-level key and config file path for your client:
```json
{
"<top-level-key>": {
"email-server": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/email-mcp-server", "run", "python", "-m", "email_mcp_server.server"],
"env": {
"SMTP_HOST": "smtp.gmail.com",
"SMTP_PORT": "587",
"SMTP_SECURE": "false",
"SMTP_USER": "your-email@gmail.com",
"SMTP_FROM": "your-email@gmail.com",
"SMTP_PASS": "your-app-password"
}
}
}
}
```
| Client | Config file path | Top-level key | Notes |
|--------|-----------------|---------------|-------|
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` | `mcpServers` | Windows: `%APPDATA%\Claude\...` |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | Or `.cursor/mcp.json` (project) |
| VS Code | `.vscode/mcp.json` | `servers` | Add `"type": "stdio"` inside the server entry |
| Windsurf | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` | |
| Zed | `~/.config/zed/settings.json` | `context_servers` | |
### Streamable HTTP (any client)
Start the server with `uv run python -m email_mcp_server.server --http`, then:
| Client | Config |
|--------|--------|
| Claude Code | `claude mcp add --transport http email-server http://localhost:8000/mcp` |
| Claude Desktop | `{ "type": "http", "url": "http://localhost:8000/mcp" }` |
| Cursor | `{ "url": "http://localhost:8000/mcp" }` |
| VS Code | `{ "type": "http", "url": "http://localhost:8000/mcp" }` |
| Windsurf | `{ "serverUrl": "http://localhost:8000/mcp" }` |
| Zed | `{ "url": "http://localhost:8000/mcp" }` |
## Provider Settings
| Provider | Host | Notes |
|----------|------|-------|
| Gmail | `smtp.gmail.com` | Requires [app password](https://myaccount.google.com/apppasswords) with 2FA enabled |
| Outlook | `smtp-mail.outlook.com` | Regular password or app password |
| Yahoo | `smtp.mail.yahoo.com` | Requires app password with 2FA enabled |
| iCloud | `smtp.mail.me.com` | Requires app password with 2FA enabled |
All providers use port `587` with `SMTP_SECURE=false` (STARTTLS).
## License
MIT License
TDQS
A3.7/5.0
Scored across 3 tools
Disambiguation4/5
send_custom_email and send_simple_email both send emails, but their names and argument differences clearly distinguish a full-featured version from a simple one. test_smtp_connection is entirely separate.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern in snake_case: send_custom_email, send_simple_email, test_smtp_connection.
Tool Count4/5
With 3 tools, the server is focused on sending emails and testing connections. While minimal, it covers the core functionality without unnecessary bloat.
Completeness3/5
The server covers sending (two variants) and connection testing, but lacks tools for receiving, listing, or managing emails, which are typical for an email server.
Maintenance
ActivityInactive
ResponsivenessSlow