Skip to main content
Glama
email

email

by eleanorreem

Email MCP Server

A Model Context Protocol (MCP) server that enables Claude Desktop to manage emails via SMTP and IMAP. Send emails, fetch unread messages, and create draft replies directly from conversations.

Features

  • Send Emails - Send emails via SMTP with subject and body

  • Fetch Unread Emails - Retrieve unread messages from your inbox

  • Create Draft Replies - Generate and save draft responses to emails

  • Multi-Provider Support - Works with Gmail, Outlook, and Yahoo

  • Input Validation - Comprehensive validation and sanitization

  • Type Safety - Full TypeScript implementation with runtime type guards

Related MCP server: Gmail MCP Server

Architecture

Built with a clean, modular architecture following SOLID principles:

src/
├── index.ts                  # Main server entry point
├── config/
│   └── email-config.ts       # Multi-provider configuration
├── services/
│   ├── smtp-service.ts       # SMTP operations
│   ├── imap-service.ts       # IMAP operations (async/await)
│   └── email-formatter.ts    # Email formatting utilities
├── tools/
│   ├── send-email.ts         # Send email tool
│   ├── get-unread.ts         # Fetch unread emails tool
│   └── create-draft.ts       # Create draft reply tool
├── types/
│   ├── email.types.ts        # TypeScript type definitions
│   └── type-guards.ts        # Runtime type validation
└── utils/
    ├── validation.ts         # Input validation & sanitization
    └── text-utils.ts         # Text processing utilities

Installation

Prerequisites

  • Node.js 18+

  • An email account with SMTP/IMAP access

  • For Gmail: App Password (not your regular password)

Setup

  1. Clone the repository

    git clone https://github.com/yourusername/email-mcp-server.git
    cd email-mcp-server
  2. Install dependencies

    npm install
  3. Build the project

    npm run build
  4. Configure environment variables (optional for standalone testing)

    cp .env.example .env
    # Edit .env with your credentials

Configuration

Claude Desktop Setup

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "email": {
      "command": "node",
      "args": ["/absolute/path/to/email-mcp-server/build/index.js"],
      "env": {
        "EMAIL_USER": "your-email@gmail.com",
        "EMAIL_APP_PASSWORD": "your-16-character-app-password",
        "EMAIL_PROVIDER": "gmail"
      }
    }
  }
}

Supported Providers

  • Gmail (default)

    • SMTP: smtp.gmail.com:587

    • IMAP: imap.gmail.com:993

    • Requires App Password

  • Outlook

    • SMTP: smtp-mail.outlook.com:587

    • IMAP: outlook.office365.com:993

  • Yahoo

    • SMTP: smtp.mail.yahoo.com:587

    • IMAP: imap.mail.yahoo.com:993

Set EMAIL_PROVIDER to gmail, outlook, or yahoo.

Usage

Once configured, Claude Desktop can use these tools:

Send Email

Send an email to user@example.com with subject "Meeting Tomorrow"
and body "Let's meet at 2 PM to discuss the project."

Fetch Unread Emails

Show me my last 5 unread emails

Create Draft Reply

Create a draft reply to email ID 123 from user@example.com

Security

  • Input Validation: Email addresses, subject lines, and body content are validated

  • Size Limits:

    • Subject lines: 998 characters (RFC 2822)

    • Email body: 500KB

  • Content Sanitization: Control characters removed to prevent injection

  • No Credential Storage: Credentials passed via environment variables only

  • Type Safety: Runtime type guards prevent invalid tool arguments

Development

Building

npm run build       # Compile TypeScript
npm run watch      # Watch mode for development

Project Structure

  • Functional Programming: All services use pure functions, no classes

  • Separation of Concerns: Clear boundaries between config, services, tools, and utilities

  • Type Guards: Runtime validation with TypeScript type narrowing

  • Error Handling: Comprehensive error messages with context

Technical Highlights

Async/Await IMAP

Converted callback-based IMAP library to clean async/await:

export async function getUnreadEmails(limit: number = 10): Promise<Email[]> {
  const imap = await createConnection();
  try {
    await openBox(imap, "INBOX", false);
    const results = await search(imap, ["UNSEEN"]);
    // ... fetch and parse
  } finally {
    imap.end();
  }
}

Runtime Type Validation

Type guards ensure type safety at runtime:

export function isSendEmailParams(args: unknown): args is SendEmailParams {
  const obj = args as Record<string, unknown>;
  return (
    typeof obj === "object" &&
    obj !== null &&
    typeof obj.to === "string" &&
    typeof obj.subject === "string" &&
    typeof obj.body === "string"
  );
}

Multi-Provider Configuration

Easily switch between email providers:

export function getProvider(): EmailProvider {
  const provider = process.env.EMAIL_PROVIDER?.toLowerCase() || "gmail";
  switch (provider) {
    case "gmail": return { /* Gmail config */ };
    case "outlook": return { /* Outlook config */ };
    // ...
  }
}

License

MIT

Contributing

Contributions welcome! Please ensure:

  • TypeScript compiles without errors

  • Code follows functional programming patterns

  • Input validation is maintained

  • No credentials are committed

Available Tools

3 tools
create_draft_replyA

Save a draft reply to an email in Gmail. Generate the reply content in our conversation first, then use this tool to save it.

Inputs: email_id (required), email_from (required), reply_body (required), email_subject (required), +1 more.

get_unread_emailsB

Fetch unread emails from inbox

Inputs: limit.

send_emailB

Send an email via SMTP

Inputs: to (required), body (required), subject (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 3 tools

    Disambiguation5/5

    Each tool targets a clearly distinct operation: sending an email, fetching unread emails, and saving a draft reply. There is no meaningful overlap in purpose or action.

    Naming Consistency5/5

    All tool names follow a consistent snake_case verb_noun pattern: send_email, get_unread_emails, create_draft_reply. The naming is predictable and easy to infer.

    Tool Count5/5

    Three tools is a compact but well-scoped set for a basic email server. Each tool serves a distinct and necessary function without redundancy.

    Completeness3/5

    Core send, fetch unread, and draft reply operations are covered, but common email workflows like marking messages as read, deleting emails, sending drafts, or searching are missing. Agents can work around some gaps but will hit dead ends for basic inbox management.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      A Model Context Protocol server that provides a seamless email management interface through Claude, allowing users to search, read, and send emails directly through natural language conversations.
      4
      114
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol (MCP) server that enables Claude Desktop to interact with Gmail through secure OAuth 2.0 authentication. Send emails, search messages, read emails, and manage multiple Gmail accounts directly from Claude Desktop.
      124 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol (MCP) server that enables Claude Desktop to interact with iCloud email accounts. This server provides full email functionality including reading, sending, and managing emails through your iCloud account.
      1
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      Local IMAP/SMTP MCP server that lets Claude read, search, draft, send, flag, and move mail across multiple IMAP mailboxes. Credentials stay on your machine.
      -