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.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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
    
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?

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

A3.7/5.0
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

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

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
    48
    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
    A
    maintenance
    An MCP server for EmailJS that enables AI agents to send emails, validate configurations, and query email history through natural language.
    3
    16
    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

Latest Blog Posts

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