Skip to main content
Glama

MiniMail MCP Server

FastMCP Version Ruff Linted with Biome Built with Just

Multi-service email platform for MCP-compatible clients.

Version 0.3.1 FastMCP 3.1.0+; mailing list tools; MCP sampling + prompts + skills (optional)

See CHANGELOG.md for version history.

Features

Email Services

  • SMTP/IMAP: Standard email providers (Gmail, Outlook, Yahoo, iCloud, ProtonMail)

  • Transactional APIs: SendGrid, Mailgun, Resend, Amazon SES, Postmark

  • Local Testing: MailHog, Mailpit, MailCatcher, Inbucket

  • Webhook Integration: Slack, Discord, Telegram, GitHub

Core Functionality

  • Send emails via multiple service types

  • Check inbox via IMAP and service APIs

  • Mailing list presets (mailing_lists_catalog, mailing_list_latest): named folders/filters (e.g. newsletters) via EMAIL_MCP_MAILING_LISTS JSON

  • Dynamic service configuration at runtime

  • Email header decoding (UTF-8, Base64, Quoted-Printable)

  • Async operations with connection pooling

  • Service health monitoring and testing

Standards Compliance

  • FastMCP 3.1.0 protocol support

  • MCPB packaging for Claude Desktop

  • Zed extension support

  • Conversational tool returns

  • Structured logging with JSON output

Related MCP server: io.github.p-w-4-z/inbox-mcp

Standards Compliance

This minimail-mcp implements current MCP server standards:

MCPB Packaging (Claude Desktop)

  • Complete manifest.json with tool definitions

  • Prompt templates for Claude Desktop integration

  • Self-contained source code packaging

  • Icon and documentation assets

Glama Integration

  • glama.json configuration for Glama MCP client discovery

  • Feature categorization and capability descriptions

  • Code review and documentation generation configuration

  • Status and development information

CI/CD Pipeline

  • GitHub Actions workflow with multi-Python version testing (3.10, 3.11, 3.12)

  • Automated linting with Ruff

  • Type checking with MyPy

  • Test coverage reporting

  • Security scanning with Bandit

  • Package building and MCPB creation

  • PyPI publishing requires account setup

Monitoring Stack

  • Health check system for email services

  • Performance metrics collection

  • System resource monitoring

  • Service availability tracking

Development Standards

  • Testing suite with pytest

  • Code quality enforcement with Ruff and MyPy

  • Project structure with src/ layout

  • Dependency management with pyproject.toml

  • Documentation and examples

Supported Services

Standard Email Providers

  • Gmail - SMTP/IMAP with App Passwords

  • Outlook/Hotmail - SMTP/IMAP

  • Yahoo Mail - SMTP/IMAP

  • iCloud Mail - SMTP/IMAP

  • ProtonMail - SMTP/IMAP (requires ProtonMail Bridge for free accounts, or paid account for direct access)

Transactional Email APIs

  • SendGrid - Enterprise email delivery

  • Mailgun - Developer-friendly email API

  • Resend - Modern email API

  • Amazon SES - AWS email service

  • Postmark - Reliable transactional email

Local Testing Services

  • MailHog - Web UI for email testing

  • Mailpit - Modern mail testing

  • MailCatcher - Ruby-based testing

  • Inbucket - Lightweight testing

Webhook/Dev Services

  • Slack - Send emails as Slack messages

  • Discord - Send emails as Discord messages

  • Telegram - Bot message forwarding

  • GitHub - Email to issue/PR comments

Installation

Prerequisites

  • uv installed (RECOMMENDED)

  • Python 3.12+

Quick Start

Run immediately via uvx:

uvx email-mcp

Claude Desktop Integration

Add to your claude_desktop_config.json:

"mcpServers": {
  "email-mcp": {
    "command": "uv",
    "args": ["--directory", "D:/Dev/repos/email-mcp", "run", "email-mcp"]
  }
}

Installation

Prerequisites

  • uv installed (RECOMMENDED)

  • Python 3.12+

Quick Start

Run immediately via uvx:

uvx email-mcp

Claude Desktop Integration

Add to your claude_desktop_config.json:

"mcpServers": {
  "email-mcp": {
    "command": "uv",
    "args": ["--directory", "D:/Dev/repos/email-mcp", "run", "email-mcp"]
  }
}

Claude Desktop (MCPB)

  1. Download the minimail-mcp.mcpb package (when built)

  2. Drag and drop into Claude Desktop settings

  3. The server will be automatically configured

Glama Client

The server is automatically discoverable by Glama.ai's GitHub scraping system through the glama.json configuration.

Gmail Integration

The minimail-mcp supports Gmail SMTP with App Password authentication:

Configuration

{
  "SenderEmail": "your-email@gmail.com",
  "SenderName": "Your Name",
  "SmtpServer": "smtp.gmail.com",
  "SmtpPort": 587,
  "SmtpUsername": "your-email@gmail.com",
  "SmtpPassword": "your-gmail-app-password"
}

Setup Steps

  1. Enable 2-Factor Authentication on Gmail account

  2. Generate App Password at https://myaccount.google.com/apppasswords

  3. Use App Password for SMTP authentication

  4. Configure using configure_service() or environment variables

Supported Features

  • SMTP email sending with TLS encryption

  • HTML and plain text email formats

  • CC/BCC recipient support

  • Authentication with App Passwords

  • Error handling and connection testing

ProtonMail Integration

The minimail-mcp supports ProtonMail with different setup requirements based on your account type:

Free Accounts (ProtonMail Bridge Required)

Free ProtonMail accounts require the ProtonMail Bridge application:

Setup Steps

  1. Download ProtonMail Bridge: https://proton.me/mail/bridge

  2. Install and configure Bridge with your ProtonMail account

  3. Bridge creates local SMTP/IMAP servers (default ports: 1025 SMTP, 1143 IMAP)

Configuration

{
  "SenderEmail": "your@protonmail.com",
  "SenderName": "Your Name",
  "SmtpServer": "127.0.0.1",
  "SmtpPort": 1025,
  "SmtpUsername": "your-username",
  "SmtpPassword": "your-protonmail-password",
  "ImapServer": "127.0.0.1",
  "ImapPort": 1143,
  "ImapUsername": "your-username",
  "ImapPassword": "your-protonmail-password"
}

Environment Variables

export SMTP_SERVER="127.0.0.1"
export SMTP_PORT="1025"
export SMTP_USER="your-username"
export SMTP_PASSWORD="your-protonmail-password"
export IMAP_SERVER="127.0.0.1"
export IMAP_PORT="1143"
export IMAP_USER="your-username"
export IMAP_PASSWORD="your-protonmail-password"

Paid Accounts (Direct Access)

Paid ProtonMail accounts support direct SMTP/IMAP access:

Configuration

{
  "SenderEmail": "your@protonmail.com",
  "SenderName": "Your Name",
  "SmtpServer": "mail.protonmail.com",
  "SmtpPort": 587,
  "SmtpUsername": "your@protonmail.com",
  "SmtpPassword": "your-protonmail-password",
  "ImapServer": "mail.protonmail.com",
  "ImapPort": 993,
  "ImapUsername": "your@protonmail.com",
  "ImapPassword": "your-protonmail-password"
}

Environment Variables

export SMTP_SERVER="mail.protonmail.com"
export SMTP_PORT="587"
export SMTP_USER="your@protonmail.com"
export SMTP_PASSWORD="your-protonmail-password"
export IMAP_SERVER="mail.protonmail.com"
export IMAP_PORT="993"
export IMAP_USER="your@protonmail.com"
export IMAP_PASSWORD="your-protonmail-password"

Setup Steps for Paid Accounts

  1. Enable SMTP/IMAP access in ProtonMail settings

  2. Use your regular ProtonMail password (no app passwords needed)

  3. Configure using configure_service() or environment variables

Supported Features

  • SMTP email sending with TLS encryption

  • IMAP inbox checking and management

  • HTML and plain text email formats

  • CC/BCC recipient support

  • Automatic email header decoding

  • Error handling and connection testing

Notes

  • Free accounts: ProtonMail Bridge must be running for email access

  • Paid accounts: Direct SMTP/IMAP access available without additional software

  • Security: ProtonMail uses end-to-end encryption for all communications

  • Compatibility: Works with all Email MCP features including AI collaboration

Configuration

Basic SMTP/IMAP (Backward Compatible)

Set environment variables for standard email providers:

export SMTP_SERVER="smtp.gmail.com"
export SMTP_PORT="587"
export SMTP_USER="your-email@gmail.com"
export SMTP_PASSWORD="your-app-password"
export IMAP_SERVER="imap.gmail.com"
export IMAP_USER="your-email@gmail.com"
export IMAP_PASSWORD="your-app-password"

API Services

Configure transactional email APIs:

# SendGrid
export SENDGRID_API_KEY="your-sendgrid-api-key"
export SENDGRID_FROM_EMAIL="noreply@yourdomain.com"

# Mailgun
export MAILGUN_API_KEY="your-mailgun-api-key"
export MAILGUN_DOMAIN="yourdomain.com"
export MAILGUN_FROM_EMAIL="noreply@yourdomain.com"

# Resend
export RESEND_API_KEY="your-resend-api-key"
export RESEND_FROM_EMAIL="noreply@yourdomain.com"

Local Testing Services

Enable local email testing:

# MailHog
export MAILHOG_ENABLED="true"
export MAILHOG_SMTP_HOST="localhost"
export MAILHOG_SMTP_PORT="1025"
export MAILHOG_HTTP_URL="http://localhost:8025"

Webhook Services

Configure chat/webhook integrations:

# Slack
export SLACK_WEBHOOK_URL="https://example.com/docs/slack-incoming-webhook"

Mailing lists (newsletters)

Point each subscription at an IMAP folder (recommended: Gmail filter label folder name) or use optional from_contains / subject_contains to post-filter after fetch.

Env: EMAIL_MCP_MAILING_LISTS JSON array, or EMAIL_MCP_MAILING_LISTS_FILE path to the same JSON.

[
  {
    "id": "alphasignal",
    "service": "default",
    "folder": "INBOX",
    "limit": 5,
    "unread_only": true,
    "from_contains": null,
    "subject_contains": null
  }
]

Tools: mailing_lists_catalog() then mailing_list_latest(list_id="alphasignal"). For one-off filters, use check_inbox(folder="...", from_contains="...", subject_contains="...").

Cursor IDE Configuration

Add to your mcp.json:

{
  "mcpServers": {
    "minimail-mcp": {
      "command": "python",
      "args": ["-m", "email_mcp.server"],
      "env": {
        "PYTHONPATH": "D:/Dev/repos/minimail-mcp/src"
      }
    }
  }
}

Usage Examples

Conversational Usage

Send a basic email:

"Send an email to user@example.com with subject 'Hello World' and body 'This is a test message'"

Send HTML email via SendGrid:

"Send a welcome email to newuser@company.com using SendGrid. Subject: 'Welcome to Our Service'. Include HTML content with a welcome header and thank you message."

Send notification to Slack:

"Send an alert message to the #dev-alerts Slack channel about high CPU usage detected on production server."

Check unread emails:

"Check my inbox and show me the last 10 unread emails."

Test email service:

"Is my Gmail service configured correctly? Test the connection."

Configure new service:

"Add SendGrid as a new email service with my API key. From email should be noreply@mydomain.com."

List available services:

"What email services do I have configured?"

##  API Reference

### Tools

| Tool | Description | Services Supported |
|------|-------------|-------------------|
| `send_email` | Send emails via any service | All services |
| `check_inbox` | Check inbox via IMAP/API | SMTP, Local services |
| `email_status` | Test service connectivity | All services |
| `configure_service` | Add services dynamically | Runtime configuration |
| `list_services` | List configured services | Service management |
| `email_help` | Get help and documentation | Documentation |

### Service Types

| Type | Description | Examples | Inbox Support |
|------|-------------|----------|----------------|
| `smtp` | Standard SMTP/IMAP | Gmail, Outlook, Yahoo |  |
| `api` | Transactional APIs | SendGrid, Mailgun, Resend |  |
| `local` | Testing services | MailHog, Mailpit |  |
| `webhook` | Chat integrations | Slack, Discord |  |

## Architecture

- Multi-service email support (SMTP/IMAP, transactional APIs, local testing, webhooks)
- Dynamic service configuration without restart
- Backward compatible with existing SMTP/IMAP configurations
- Async operations for non-blocking email handling
- Extensible design for adding new service types

## Features

- Support for multiple email service types (SMTP, API, local testing, webhooks)
- Dynamic service configuration at runtime
- Async operations with connection pooling
- Email header decoding and error handling
- Service health monitoring  

## Development

From a clone of the repo (fork URL if you use a fork):

```powershell
git clone https://github.com/sandraschi/email-mcp.git
Set-Location email-mcp
# Install (uv)
uv sync --extra test --extra dev

# Lint / test / run MCP (see justfile)
uv run ruff check src tests
uv run --extra test pytest tests

# Sync packaged tree: src/email_mcp  mcp-server/src/email_mcp (server, mailing_lists, skills)
uv run python copy_server.py

With just: just sync, just check, just copy-mcp, just run.

MCP extras (optional): suggest_email_subject and email_agentic_assist use sampling when the host supports it; prompts (email_compose_request, email_help_request) and skills/ (skill://email-mcp/...) are optional core SMTP/IMAP works without them.

PyPI Publishing Setup (Optional)

When ready to publish to PyPI:

  1. Create PyPI account: Visit https://pypi.org/account/register/

  2. Generate API token: Go to https://pypi.org/manage/account/token/

  3. Add to GitHub: Add PYPI_API_TOKEN secret to repository settings

  4. Enable publishing: Change CI/CD condition from false to proper tag condition

  5. Tag release: git tag v0.2.1 && git push origin v0.2.1

🛡️ Industrial Quality Stack

This project adheres to SOTA 14.1 industrial standards for high-fidelity agentic orchestration:

  • Python (Core): Ruff for linting and formatting. Zero-tolerance for print statements in core handlers (T201).

  • Webapp (UI): Biome for sub-millisecond linting. Strict noConsoleLog enforcement.

  • Protocol Compliance: Hardened stdout/stderr isolation to ensure crash-resistant JSON-RPC communication.

  • Automation: Justfile recipes for all fleet operations (just lint, just fix, just dev).

  • Security: Automated audits via bandit and safety.

License

MIT

Webapp Dashboard

This MCP server includes a free, premium web interface for monitoring and control. By default, the web dashboard runs on port 10812. (Assigned ports: 10812 (Web dashboard frontend), 10813 (Web dashboard backend))

To start the webapp:

  1. Navigate to the webapp directory.

  2. Run start.bat (Windows) or .\start.ps1 (PowerShell). The script starts uvicorn on 10813 first, waits until that port accepts TCP (cold uv run can take tens of seconds), then starts Vite on 10812 — so the /api proxy does not fail with connection refused during startup.

  3. Open http://localhost:10812 in your browser. If the backend window shows a traceback, fix that before expecting API routes to work.

Available Tools

10 tools
check_inboxA

Check inbox via specified email service.

Retrieves emails from the specified service and folder. Supports IMAP-based services, local testing services with web APIs, and service-specific inbox checking.

Args: service: Email service to check. Options: - "default": Default IMAP service (from env vars) - "mailhog": Local MailHog testing service - "mailpit": Local Mailpit testing service - Custom service names that support inbox checking folder: Mail folder name to check. Default: "INBOX". Common folders: - "INBOX": Main inbox folder - "Sent": Sent items folder - "Drafts": Draft messages folder - "Trash": Deleted messages folder Folder names are case-sensitive and provider-specific. limit: Maximum number of emails to return. Default: 10. unread_only: If True, only returns unread emails. Default: False. from_contains: Optional case-insensitive substring filter on From (IMAP scans recent mail). subject_contains: Optional case-insensitive substring filter on Subject.

Returns: Dictionary with service-specific results: { "success": bool, # True if inbox check succeeded "emails": [ # List of email dictionaries { "id": str, # Message ID "subject": str, # Email subject "from": str, # Sender address "date": str, # Email date "read": bool # Read status } ], "count": int, # Number of emails returned "service": str, # Service used "folder": str, # Folder checked "error": str # Error message if success is False }

Examples: # Check default IMAP inbox check_inbox() # Returns: {"success": True, "emails": [...], "count": 10, "service": "default"}

# Check MailHog testing inbox
check_inbox(service="mailhog", limit=20)
# Returns emails from local testing service

# Check unread emails only
check_inbox(unread_only=True, limit=5)

Notes: - Not all services support inbox checking (API/webhook services typically don't) - Local testing services provide web UIs for viewing emails - IMAP services support standard folder names - Results are sorted with most recent first

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceNodefault
folderNoINBOX
limitNo
unread_onlyNo
from_containsNo
subject_containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Despite no annotations, the description fully explains the return format, sorting order (most recent first), and limitations (e.g., non-supporting services). It does not cover authentication or rate limits, but given the tool's simplicity, the disclosure is substantial.

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 somewhat lengthy but well-structured with clear sections (Args, Returns, Examples, Notes). The opening sentence is direct, and each component serves a purpose. Minor redundancy could be trimmed, but overall it's efficient.

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 presence of an output schema (described in detail), 6 parameters, and zero annotations, the description completely covers usage, behavior, and return values. Examples and notes further enrich completeness, leaving no critical gaps for agent invocation.

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?

All 6 parameters are thoroughly described with valid options, defaults, and behavior (e.g., case-insensitive filters for from_contains). Since schema description coverage is 0%, the description carries the full burden and excels, adding meaning far beyond the bare schema types.

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 tool description explicitly states 'Check inbox via specified email service' and details the retrieval of emails from a service and folder. It distinguishes itself from sibling tools like send_email and email_help by focusing solely on reading emails, with no overlap in functionality.

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

Usage Guidelines4/5

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

The description provides clear parameter options (services, folders) with defaults and examples. It notes that not all services support inbox checking, offering guidance on when the tool may not be applicable. However, it does not explicitly compare with alternatives like email_status or suggest_email_subject.

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

configure_serviceA

Configure a new email service dynamically.

Adds a new email service configuration at runtime. The service will be available for sending emails and inbox checking immediately.

Args: name: Unique name for the service (e.g., "my-sendgrid", "dev-mailhog") type: Service type - "smtp", "api", "local", or "webhook" config: Service-specific configuration dictionary enabled: Whether the service should be enabled (default: True)

Returns: Dictionary with configuration result: { "success": bool, "service": str, # Service name "type": str, # Service type "message": str # Success/error message }

Examples: # Configure SendGrid API service configure_service( name="my-sendgrid", type="api", config={ "api_key": "your-sendgrid-key", "api_url": "https://api.sendgrid.com/v3/mail/send", "from_email": "noreply@yourdomain.com", "service_type": "sendgrid" } )

# Configure local MailHog for testing
configure_service(
    name="local-testing",
    type="local",
    config={
        "smtp_server": "localhost",
        "smtp_port": 1025,
        "http_url": "http://localhost:8025",
        "service_type": "mailhog"
    }
)

Notes: - Service names must be unique - Configuration is stored in memory (not persisted) - Use list_services() to see available services

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeYes
configYes
enabledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that configuration is stored in memory (not persisted) and becomes available immediately. It also notes service name uniqueness. Missing details on error handling if name duplicates or if type is invalid, but overall good transparency.

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 clear sections (Args, Returns, Examples, Notes). It is front-loaded with the purpose. While slightly lengthy due to examples, the structure and clarity justify the length.

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 tool's complexity (4 params, nested objects, output schema), the description covers parameters, return format, examples, and important notes. It mentions the output schema structure. Missing validation details for 'type' values (e.g., accepted strings) but examples cover common ones.

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?

The input schema has 0% description coverage. The description provides detailed parameter explanations in Args (name, type, config, enabled) and includes comprehensive examples. This adds substantial meaning beyond the 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 'Configure a new email service dynamically.' with a specific verb and resource. It distinguishes from sibling tools like list_services, send_email, etc., by focusing on service configuration rather than usage.

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

Usage Guidelines4/5

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

The description explains when to use the tool (to add a new email service) and provides notes on uniqueness and persistence. It references list_services() to see available services, implicitly suggesting when not to add a duplicate. However, it lacks explicit alternatives for modifying existing services.

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

email_agentic_assistB

Plan a short multi-step email workflow using sampling (agentic assist).

Uses the host LLM via sampling when available; optional Anthropic fallback if configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

Discloses use of host LLM sampling and optional Anthropic fallback, which is behavioral info. However, it omits what the tool returns (plan vs. execution) and side effects, given no annotations.

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?

Two sentences, front-loaded with main purpose. No wasted words, but could be slightly more informative without lengthening.

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

Completeness2/5

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

Lacks essential details: output format (despite output schema existence), prerequisites, and clarification that it only plans, not executes. Given complexity of LLM-assisted planning, coverage is insufficient.

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

Parameters3/5

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

Input schema has one 'goal' parameter with 0% description coverage. The description implies goal is the workflow objective, but provides no format guidance or examples, requiring compensation.

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?

Description states it plans a multi-step email workflow using sampling, which is a specific verb+resource. It distinguishes from siblings like send_email or check_inbox, but could be more explicit about what constitutes a workflow.

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 clear guidance on when to use this tool versus alternatives like send_email or suggest_email_subject. The description only explains technical behavior (sampling/fallback), not usage context.

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

email_helpA

Get help and usage information for email MCP tools and services.

Returns comprehensive help information including available tools, supported services, usage examples, configuration requirements, and common use cases.

Returns: Dictionary with service and tool information: { "server": str, # Server name "version": str, # Server version "description": str, # Server description "supported_services": { # Available service types "smtp": str, # Description of SMTP services "api": str, # Description of API services "local": str, # Description of local services "webhook": str # Description of webhook services }, "tools": [...], # List of available tools "examples": [...], # Usage examples "notes": [...] # Important notes and tips }

Examples: # Get comprehensive help email_help() # Returns full documentation for all services and tools

Notes: - Use list_services() to see currently configured services - Use email_status() to test service connectivity - Use configure_service() to add new services dynamically

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It describes the return structure and includes examples and notes, which gives good behavioral insight. However, it doesn't explicitly state that the tool is read-only or safe, which would be helpful.

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 well-organized: starts with purpose, then detailed return schema, examples, and notes. Every sentence adds value, and it is front-loaded with the core function.

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 no parameters and an output schema provided in the description, the tool is fully explained. The description covers what it returns and provides usage context, making it complete for an agent.

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 tool has zero parameters, so the baseline is 4. The description adds meaning by detailing the output structure, which goes beyond the empty input 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 the verb ('Get help and usage information') and specific resource ('email MCP tools and services'). It distinguishes from sibling tools like list_services and email_status by noting they have different purposes.

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

Usage Guidelines4/5

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

It provides context on when to use this tool (to get help) and mentions related tools (list_services, email_status, configure_service) for other tasks. However, it does not explicitly state when not to use it.

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

email_statusA

Get email service status and test connectivity.

Tests connectivity for specified service or all configured services. Verifies that credentials are correct and services are reachable.

Args: service: Specific service to test, or None for all services.

Returns: Dictionary with service status information: { "server": str, # Server name "version": str, # Server version "services": { # Service-specific status "service_name": { "configured": bool, "connected": bool, "error": str, # Error message if connection failed "type": str # Service type (smtp, api, local, webhook) } }, "total_services": int, "configured_services": int, "connected_services": int }

Examples: # Check all services email_status() # Returns status for all configured services

# Check specific service
email_status(service="sendgrid")
# Returns status only for SendGrid service

Notes: - Tests actual connectivity, not just configuration presence - Connection tests are quick (timeout after 5-10 seconds) - API keys and passwords are not exposed in results

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the burden of behavioral disclosure. It reveals that the tool tests actual connectivity, mentions timeout of 5-10 seconds, and states that API keys/passwords are not exposed. This provides complete transparency for a read-only diagnostic tool.

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 well-structured with clear sections: overall description, Args, Returns, Examples, Notes. Every sentence adds value, and the length is appropriate for the tool's complexity.

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?

The description is fully complete given the presence of an output schema. It includes the return structure, notes on behavior, and usage examples. No gaps remain for the agent to infer.

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?

Despite 0% schema description coverage, the description thoroughly explains the single 'service' parameter: 'Specific service to test, or None for all services,' with examples. This adds significant meaning beyond the schema's type definition.

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 'Get email service status and test connectivity,' using specific verbs and resources. It distinguishes itself from sibling tools like check_inbox and list_services by emphasizing actual connectivity testing.

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

Usage Guidelines4/5

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

The description provides explicit usage guidance via Args and Examples, showing how to check all services or a specific service. It notes that it tests actual connectivity, not just configuration presence, which helps differentiate from list_services. However, it does not explicitly state when not to use 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.

list_servicesA

List all configured email services.

Returns information about all available email services, their types, and configuration status.

Returns: Dictionary with service information: { "services": { "service_name": { "type": str, # Service type "enabled": bool, # Whether service is enabled "configured": bool, # Whether properly configured "description": str # Human-readable description } }, "count": int, # Total number of services "enabled_count": int, # Number of enabled services "types": [str] # List of available service types }

Examples: # List all services list_services() # Returns: { # "services": { # "default": {"type": "smtp", "enabled": true, "configured": true, "description": "Default SMTP/IMAP service"}, # "sendgrid": {"type": "api", "enabled": true, "configured": true, "description": "SendGrid transactional email"} # }, # "count": 2, # "enabled_count": 2, # "types": ["smtp", "api", "local", "webhook"] # }

Notes: - Shows both automatically configured and manually added services - Configuration status indicates if required credentials are available - Use email_status() to test actual connectivity

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully covers behavior: it details the return structure, includes examples, and explains that the tool shows both automatically configured and manually added services and that configuration status indicates credential availability.

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 sections but is somewhat lengthy due to detailed output schema and examples. It is clear and front-loaded, but could be slightly more concise.

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?

The description is complete: it explains the tool's purpose, behavior, output format, and relationship to siblings. With zero parameters and no missing context, it fully covers what an agent needs to know.

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?

There are no parameters; the schema coverage is 100% and the description does not need to add parameter semantics. Baseline of 4 is appropriate for zero parameters.

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 states 'List all configured email services' with a specific verb and resource. It clearly differentiates from the sibling tool email_status by noting that email_status tests actual connectivity.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool vs alternatives, including 'Use email_status() to test actual connectivity.' It also notes what the tool shows and omits.

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

mailing_list_latestA

MAILING_LIST_LATEST — Fetch newest messages for a preset id (see mailing_lists_catalog).

Loads folder/service/filters from EMAIL_MCP_MAILING_LISTS. Typical use: newsletter drops in a dedicated IMAP folder (Alpha Signal, etc.). Optional limit/unread_only override entry defaults.

Args: list_id: Preset id from catalog (e.g. alphasignal). limit: Override max messages (default: from preset, usually 5). unread_only: Override UNSEEN-only (default: from preset, usually True for newest drop).

Returns: Same shape as check_inbox plus list_id and preset fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYes
limitNo
unread_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It explains that it loads from EMAIL_MCP_MAILING_LISTS and allows overrides, but does not disclose whether the operation is read-only or has side effects (e.g., marking messages as read). The return shape is mentioned but not detailed.

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 well-structured with a title line, usage context, explicit Args section, and Returns note. It is concise, front-loaded with purpose, and every sentence adds value without redundancy.

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?

The description covers purpose, parameters, and return shape (referencing check_inbox). However, it omits error conditions, prerequisites beyond the catalog, and behavior when limit/unread_only are null. The existence of an output schema reduces the burden, but some gaps remain.

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?

Despite 0% schema coverage, the description's Args section fully explains each parameter: list_id (preset id from catalog), limit (override max messages with default), and unread_only (override UNSEEN-only). This adds significant meaning beyond the schema's type-only definitions.

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 the tool's purpose: 'Fetch newest messages for a preset id', which is specific and distinct from sibling tools like check_inbox and mailing_lists_catalog. The verb 'Fetch' and resource 'newest messages' are precise.

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 provides context on typical use (newsletter drops in a dedicated IMAP folder) and references the catalog for preset ids, but does not explicitly state when not to use this tool versus alternatives like check_inbox. No exclusion criteria or alternative tools are mentioned.

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

mailing_lists_catalogA

MAILING_LISTS_CATALOG — List named mailing-list presets from EMAIL_MCP_MAILING_LISTS (JSON).

Configure labels/folders once (e.g. Gmail filter → IMAP folder), then use mailing_list_latest(id).

Returns: success, entries[] with id, service, folder, limit, unread_only, from_contains, subject_contains; or error if unset/invalid JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses the behavior: it reads from a JSON configuration, lists presets, and returns specific fields or an error if unset/invalid. Since no annotations are provided, the description carries full burden, and it adequately explains the return structure and error conditions.

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 concise, with each sentence adding value. It front-loads the purpose, then gives usage context, then outlines the return format. No redundant information.

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 no parameters and no annotations, the description is complete. It explains what the tool returns, how to use it (with reference to sibling tool), and potential errors. It fits well within the context of sibling tools.

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 tool has zero parameters, and the input schema is an empty object. The description adds value by explaining the return fields and possible error, which is sufficient given no parameters need explanation.

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 the tool's purpose: 'List named mailing-list presets from EMAIL_MCP_MAILING_LISTS (JSON).' It uses a specific verb ('List') and resource ('mailing-list presets'), and distinguishes itself from the sibling tool 'mailing_list_latest' by mentioning it returns configuration that can be used with that tool.

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

Usage Guidelines4/5

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

The description provides guidance on when to use this tool: 'Configure labels/folders once ... then use mailing_list_latest(id).' This implies the catalog should be used first to list presets before using the latest tool. However, it does not explicitly state when not to use it or mention alternatives.

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

send_emailA

Send an email via specified email service.

Sends an email using the specified email service. Supports SMTP, API-based services, local testing services, and webhook integrations. Automatically detects service capabilities and uses the appropriate sending method.

Args: to: Recipient email address(es). Can be: - Single address: "user@example.com" - Comma-separated: "user1@example.com, user2@example.com" - List: ["user1@example.com", "user2@example.com"] subject: Email subject line. Required. body: Plain text email body. Required. This serves as the fallback for email clients that don't support HTML. service: Email service to use. Options: - "default": Default SMTP/IMAP service (from env vars) - "sendgrid": SendGrid transactional email - "mailgun": Mailgun transactional email - "resend": Resend transactional email - "mailhog": Local MailHog testing service - "slack": Send to Slack webhook - "discord": Send to Discord webhook - Custom service names configured via EMAIL_SERVICES html: Optional HTML email body. If provided, the email will be sent as multipart/alternative with both text and HTML versions. Example: "TitleContent" cc: Optional CC (carbon copy) recipients. Same format as 'to'. bcc: Optional BCC (blind carbon copy) recipients. Same format as 'to'.

Returns: Dictionary with service-specific results: { "success": bool, # True if email sent successfully "status": str, # "sent" on success "service": str, # Service used "to": str, # Recipient address(es) "subject": str, # Email subject "error": str # Error message if success is False }

Examples: # Send via default SMTP service send_email( to="user@example.com", subject="Hello", body="This is a test email" )

# Send via SendGrid
send_email(
    to="user@example.com",
    subject="Welcome",
    body="Welcome to our service",
    service="sendgrid",
    html="<h1>Welcome!</h1><p>Thanks for joining.</p>"
)

# Send to Slack webhook
send_email(
    to="general",
    subject="Alert",
    body="System alert message",
    service="slack"
)

Notes: - Service availability depends on configuration - API services may have different rate limits and features - Local testing services don't send real emails - Webhook services convert emails to chat messages

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
subjectYes
bodyYes
serviceNodefault
htmlNo
ccNo
bccNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Despite no annotations, the description fully discloses behavior: supports multiple services, automatic detection, multipart emails, return format with success/error, and notes on service limitations. No contradictions.

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 Args, Returns, Examples, and Notes sections. It front-loads the main purpose and is appropriately detailed for a complex tool, though slightly verbose. Every sentence serves a purpose.

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 7 parameters, 3 required, no annotations, and an output schema, the description covers all aspects: parameter details, return format, examples, and notes. It fully equips an agent to use the tool correctly.

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?

The description adds extensive meaning beyond the schema's type/required fields: formats for email addresses, service options, HTML usage, and default values. It compensates for 0% schema description coverage with detailed parameter documentation.

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 an email via specified email service' and lists supported services. It distinguishes from sibling tools like check_inbox, configure_service, etc., by focusing on sending emails with various backends.

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

Usage Guidelines4/5

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

The description provides detailed usage guidance with parameter formats, service options, and examples. It implicitly tells when to use different services (e.g., webhooks for chat). However, it lacks explicit 'when not to use' or alternatives for sibling tools, though the context makes it clear.

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

suggest_email_subjectA

Suggest 1–3 concise email subject lines for the given body (uses MCP sampling when available).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations provided, the description must disclose behavioral traits. It mentions that the tool uses MCP sampling when available, which is a key behavior. However, it does not state what happens when sampling is unavailable, nor does it clarify if the tool is read-only or has any side effects. The description is adequate but lacks full transparency.

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 a single, efficient sentence with 14 words. It is front-loaded with the core action and concisely adds the sampling behavior. Every word contributes meaning without redundancy.

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 tool's low complexity (one parameter, output schema exists), the description covers the key aspects: it suggests 1-3 subject lines and mentions sampling. The existence of an output schema reduces the need to describe return values. However, it could be improved by clarifying the expected input format (e.g., full email body).

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

Parameters2/5

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

The input schema has 0% description coverage, meaning the parameter 'body' is not described. The description says 'for the given body' but does not explain what constitutes a valid body (e.g., email content, plain text, length limits). This is insufficient compensation for the missing param descriptions.

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 the tool's purpose: to suggest 1–3 concise email subject lines for a given body. The verb 'suggest' and resource 'email subject lines' are specific, and it distinguishes itself from sibling tools like 'send_email' or 'check_inbox' by focusing on subject line generation.

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 provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, conditions, or when not to use it. For example, it doesn't clarify if the tool is intended for drafting new emails or improving existing ones, nor does it compare with other email-related tools.

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. 10 tool updatesv0.3.1
    • First observedcheck_inbox
    • First observedconfigure_service
    • First observedemail_agentic_assist
    • First observedemail_help
    • First observedemail_status
    • First observedlist_services
    • First observedmailing_list_latest
    • First observedmailing_lists_catalog
    • First observedsend_email
    • First observedsuggest_email_subject

TDQS

A3.8/5.0

Scored across 10 tools

Disambiguation4/5

Most tools have distinct purposes (send, receive, configure, status, help), but mailing_list_latest overlaps slightly with check_inbox as a specialized variant. Descriptions help differentiate.

Naming Consistency3/5

Uses snake_case consistently, but mixes verb-first (check_inbox, list_services) with noun-first (email_help, email_status) patterns. Also 'mailing_' prefix vs 'email_' adds inconsistency.

Tool Count5/5

10 tools cover essential email operations plus extras (help, subject suggestions, mailing list presets) without being overwhelming.

Completeness3/5

Core send/receive and service management are covered, but lacks email deletion, folder movement, and attachment support, which are common email tasks.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server for unified email management that supports both Gmail and IMAP accounts via a single interface. It enables users to search across multiple accounts, list, read, send, and archive emails with integrated health monitoring and secure authentication.
    1
    -
  • A
    license
    A
    quality
    D
    maintenance
    Provider-agnostic email MCP server that connects any IMAP mailbox to AI assistants, enabling email management through natural language.
    8
    AGPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Cross-platform MCP server and CLI for email operations, including send, read, search, and contact management, compatible with Gmail, Outlook, Yahoo, and any IMAP/SMTP providers.
    23 npm
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables users to manage email accounts via IMAP/SMTP, including reading, searching, sending emails with attachments and calendar invites, all through natural language interactions with MCP-compatible clients.
    1
    4
    MIT