Skip to main content
Glama
egyptianego17

email-mcp-server

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

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 dev

Configure 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 --http

Run tests:

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:

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=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:

{
  "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

# 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:

{
  "<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 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

Available Tools

3 tools
send_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
    
ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
smtp_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full behavioral disclosure burden. It goes beyond the bare action by enumerating SMTP authentication fields, optional configuration, and the return outcome of 'Success message or error message'. It does not mention side effects like irreversible sending or failure conditions in detail, but it does describe core behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every part is necessary for a tool with two nested objects and many optional fields. The one-line summary is front-loaded and the rest is a structured parameter breakdown with no filler. The format is scan-friendly for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this complexity, the description provides a complete operational picture: what the email object can contain, what the SMTP override accepts, and what return behavior to expect. It compensates for the uninformative schema and the absence of annotations effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and both parameters are free-form additionalProperties objects, so the description is essential. It fully compensates by explaining all expected email fields, attachment subfields, and every smtp_config field, while clarifying which options are optional and where defaults apply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Send a custom email') and a resource/scope ('with full configuration options'). This makes the tool distinct from the simpler sibling send_simple_email, but it does not explicitly draw the contrast or name alternatives in the description text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description strongly implies use when full configuration is needed (cc, bcc, attachments, HTML body, SMTP override) but it does not state 'use this instead of send_simple_email when...' or mention any exclusion criteria. Usage guidance remains implicit rather than explicit.

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
    
ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
subjectYes
bodyYes
is_htmlNo
smtp_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that SMTP configuration falls back to environment variables if not provided, which is useful context. It also states the return type as a success or error message. Since no annotations are provided, the description carries the full burden, and while it covers the basic behavior, it does not disclose potential side effects, exclusions, or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an initial one-line summary, an Args section mapping to parameters, and a Returns section. It is not overly verbose, though repeating the parameter names largely duplicates the schema. The smtp_config details are dense but relevant, and each part serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and the number of parameters, the description covers the key aspects: what the tool does, the required parameters, the optional smtp_config, and the fallback behavior. It is complete enough for an agent to understand how to invoke the tool correctly, though it leaves room for more detail on error conditions and rate limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the parameter descriptions in the docstring add crucial value, especially for smtp_config, which is only typed as an arbitrary object in the schema. The description explains each expected sub-field of smtp_config and the fallback behavior of environment variables. However, the descriptions for to, subject, and body add little beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: 'Send a simple email.' The verb 'send' and resource 'simple email' are explicit, and the name is distinct from the sibling send_custom_email by the modifier 'simple', which implies it's for basic emails. However, it does not explicitly contrast itself with send_custom_email, so the differentiation is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as send_custom_email or test_smtp_connection. It does mention the optional smtp_config override and fallback to environment variables, but this is parameter context rather than usage-selection guidance. The sibling tools are not mentioned or compared at all.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_smtp_connectionB

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
    
ParametersJSON Schema
NameRequiredDescriptionDefault
smtp_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must disclose behavior on its own. It indicates the tool tests a connection and returns success or an error message, but it omits whether the test is read-only, whether it sends a test email, what happens on network timeouts, or which environment variables are read. This uncertainty could lead an agent to call the tool with incorrect assumptions about side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-sentence summary followed by a labeled Args section and a Returns line. The bulleted fields are compact and each serves a purpose. It is slightly verbose due to the docstring style but remains easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a connection diagnostic with one optional parameter, the description covers the main input shape and general return kind. It lacks explicit success criteria, side-effect disclosure, and any reference to sibling tools, which would improve agent decision-making. Overall it is sufficient for basic use but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since schema coverage is 0%, the description fully compensates by documenting the smtp_config fields (host, port, secure, username, password, from_email) and stating the override behavior, including fallback to environment variables. This is actionable for an agent populating the argument. It does not provide data types or exact environment variable names, a modest gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with the specific verb phrase 'Test SMTP connection', which clearly identifies the target resource and distinguishes it from sibling testing tools. It goes beyond the name by describing the optional configuration override and the return type. However, it stops short of explaining what the connection test actually does (e.g., authenticates, sends a probe email, or just checks readability).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when this tool should be chosen over alternatives such as test_imap_connection or the sending tools. The description advises that smtp_config is optional and falls back to environment variables, but it does not indicate scenarios for using a config override versus relying on defaults. An agent must infer usage context entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv2.0.0
    • First observedsend_custom_email
    • First observedsend_simple_email
    • First observedtest_smtp_connection

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    F
    maintenance
    An MCP server that enables AI assistants to send emails through SMTP protocol by providing server credentials, recipient information, subject, and message content.
    1
    19 npm
    1
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    -
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server for EmailJS that enables AI agents to send emails, validate configurations, and query email history through natural language.
    3
    5 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A production-ready MCP server that empowers AI agents to securely send emails via SMTP, supporting plain text, HTML, and attachments.
    MIT