email-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@email-mcp-serversend an email to john@example.com with subject 'Hello' and body 'Just saying hi'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 optionalsmtp_configsend_custom_email— Full control: CC/BCC, attachments; accepts optionalsmtp_configtest_smtp_connection— Verify your SMTP settings before sending; accepts optionalsmtp_config
Related MCP server: MCP Email Server with SendGrid
Quick Start
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
cd email-mcp-server
uv sync --extra devConfigure SMTP (see next section), then run:
# 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 --httpRun tests:
uv run pytestSMTP 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:
cp env.example .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=falseAlternatively, 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:
{
"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 |
| string | SMTP server hostname |
| integer | SMTP server port (usually |
| boolean | Use SSL/TLS ( |
| string | Auth username |
| string | Auth password |
| string | Sender email address |
Client Configuration
Claude Code
# 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/mcpJSON-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:
{
"<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 |
|
| Windows: |
Cursor |
|
| Or |
VS Code |
|
| Add |
Windsurf |
|
| |
Zed |
|
|
Streamable HTTP (any client)
Start the server with uv run python -m email_mcp_server.server --http, then:
Client | Config |
Claude Code |
|
Claude Desktop |
|
Cursor |
|
VS Code |
|
Windsurf |
|
Zed |
|
Provider Settings
Provider | Host | Notes |
Gmail |
| Requires app password with 2FA enabled |
Outlook |
| Regular password or app password |
Yahoo |
| Requires app password with 2FA enabled |
iCloud |
| Requires app password with 2FA enabled |
All providers use port 587 with SMTP_SECURE=false (STARTTLS).
License
MIT License
Available Tools
3 toolssend_custom_emailA
Send a custom email with full configuration options.
Args:
email: Email message details including:
- to: Recipient email address(es) (string or list)
- cc: CC email address(es) (optional, string or list)
- bcc: BCC email address(es) (optional, string or list)
- subject: Email subject
- text: Plain text email body (optional)
- html: HTML email body (optional)
- attachments: List of attachments (optional), each with:
- path: Local file path to attach (preferred)
- content: Base64-encoded file content (alternative to path)
- filename: Override filename (auto-derived from path if omitted)
- mime_type: MIME type override (optional)
smtp_config: Optional SMTP configuration override with:
- host: SMTP server hostname
- port: SMTP server port
- secure: Use SSL/TLS
- username: Auth username
- password: Auth password
- from_email: Sender email address
Returns:
Success message or error message
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| smtp_config | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It discloses the return type (success or error message) and elaborates on parameters, but does not mention authorization needs, rate limits, or side effects beyond the act of sending. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise purpose sentence followed by detailed Args and Returns sections. However, it is somewhat verbose for the parameter details; could be more terse while maintaining completeness. Barely loses a point for efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has nested objects, no schema descriptions, and an output schema (implied), the description provides thorough coverage of all parameter structures, optionality, and return behavior. It fully compensates for the schema's lack of descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does excellently. It details the email object with nested fields (to, cc, bcc, subject, text, html, attachments with subfields) and smtp_config (host, port, secure, username, password, from_email), adding meaning like 'preferred' and 'auto-derived' that the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Send a custom email with full configuration options,' which precisely specifies the verb and resource. It distinguishes from siblings (send_simple_email, test_smtp_connection) by emphasizing 'full configuration' and 'custom,' implying this tool is for advanced scenarios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies it's for complex email needs via 'full configuration,' but it does not mention when-not-to-use or directly compare to send_simple_email. Slight gap in intentionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_simple_emailB
Send a simple email.
Args:
to: Recipient email address
subject: Email subject
body: Email body content
is_html: Whether body is HTML (default: False)
smtp_config: Optional SMTP configuration override with:
- host: SMTP server hostname
- port: SMTP server port
- secure: Use SSL/TLS
- username: Auth username
- password: Auth password
- from_email: Sender email address
Falls back to environment variables if not provided.
Returns:
Success message or error message
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| subject | Yes | ||
| body | Yes | ||
| is_html | No | ||
| smtp_config | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers return type (success or error message) and SMTP config fallback behavior. However, it does not disclose rate limits, size constraints, or whether sending is synchronous, leaving gaps in behavioral understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise but includes a block listing SMTP config subfields, which adds verbosity. It is structured clearly but could be tighter without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers parameters, return value, and SMTP config behavior, but lacks details on error conditions, asynchronous behavior, or constraints like attachment support. Adequate for a simple tool but incomplete for robust use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description provides detailed explanation for each parameter, including is_html default, smtp_config structure, and fallback to environment variables. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Send a simple email' and lists all parameters. However, it does not differentiate from sibling tools like send_custom_email or test_smtp_connection, missing an opportunity to clarify when to use this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description implies it is for simple emails but does not explicitly state scenarios or compare with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_smtp_connectionA
Test SMTP connection.
Args:
smtp_config: Optional SMTP configuration override with:
- host: SMTP server hostname
- port: SMTP server port
- secure: Use SSL/TLS
- username: Auth username
- password: Auth password
- from_email: Sender email address
Falls back to environment variables if not provided.
Returns:
Connection test result or error message
| Name | Required | Description | Default |
|---|---|---|---|
| smtp_config | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description adds useful context: the tool falls back to environment variables if smtp_config is not provided, and returns a connection test result or error. However, it does not disclose potential side effects or if the test is read-only, which is important for a test operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an Args section and Returns section. It is concise enough but could be slightly shortened by removing the docstring format. Still, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (not detailed), but the description's return statement is vague ('Connection test result or error message'). Given the simplicity of the tool and the presence of sibling tools, the description is adequate but leaves room for more specifics about the return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the sole parameter 'smtp_config'. The description compensates by listing the expected nested fields (host, port, secure, etc.) and explaining the fallback behavior, which adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Test SMTP connection' with a specific verb and resource. It is distinct from siblings 'send_custom_email' and 'send_simple_email' which focus on sending emails, not testing connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for testing SMTP connectivity, but does not explicitly state when to use versus alternatives like sending emails. No exclusions or prerequisites are mentioned, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
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.
All tools follow a consistent verb_noun pattern in snake_case: send_custom_email, send_simple_email, test_smtp_connection.
With 3 tools, the server is focused on sending emails and testing connections. While minimal, it covers the core functionality without unnecessary bloat.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
An MCP server that provides email capabilities, hosted on Alpic platform
An MCP server that provides email capabilities, hosted on Alpic platform
An MCP server that provides email capabilities, hosted on Alpic platform
Related MCP Servers
- AlicenseCqualityFmaintenanceAn MCP server that enables AI assistants to send emails through SMTP protocol by providing server credentials, recipient information, subject, and message content.1481Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI applications to send text, HTML, and template-based emails using SendGrid. It supports file attachments, CC/BCC recipients, and easy deployment via Python or Docker.
- AlicenseAqualityAmaintenanceAn MCP server for EmailJS that enables AI agents to send emails, validate configurations, and query email history through natural language.3162MIT
- AlicenseNot gradedqualityDmaintenanceA production-ready MCP server that empowers AI agents to securely send emails via SMTP, supporting plain text, HTML, and attachments.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/egyptianego17/email-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server