MiniMail MCP Server
MiniMail MCP Server
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) viaEMAIL_MCP_MAILING_LISTSJSONDynamic 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.jsonwith tool definitionsPrompt templates for Claude Desktop integration
Self-contained source code packaging
Icon and documentation assets
Glama Integration
glama.jsonconfiguration for Glama MCP client discoveryFeature 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-mcpClaude 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-mcpClaude 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)
Download the
minimail-mcp.mcpbpackage (when built)Drag and drop into Claude Desktop settings
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
Enable 2-Factor Authentication on Gmail account
Generate App Password at https://myaccount.google.com/apppasswords
Use App Password for SMTP authentication
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
Download ProtonMail Bridge: https://proton.me/mail/bridge
Install and configure Bridge with your ProtonMail account
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
Enable SMTP/IMAP access in ProtonMail settings
Use your regular ProtonMail password (no app passwords needed)
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.pyWith 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:
Create PyPI account: Visit https://pypi.org/account/register/
Generate API token: Go to https://pypi.org/manage/account/token/
Add to GitHub: Add
PYPI_API_TOKENsecret to repository settingsEnable publishing: Change CI/CD condition from
falseto proper tag conditionTag 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
printstatements in core handlers (T201).Webapp (UI): Biome for sub-millisecond linting. Strict
noConsoleLogenforcement.Protocol Compliance: Hardened
stdout/stderrisolation to ensure crash-resistant JSON-RPC communication.Automation: Justfile recipes for all fleet operations (
just lint,just fix,just dev).Security: Automated audits via
banditandsafety.
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:
Navigate to the
webappdirectory.Run
start.bat(Windows) or.\start.ps1(PowerShell). The script starts uvicorn on 10813 first, waits until that port accepts TCP (colduv runcan take tens of seconds), then starts Vite on 10812 — so the/apiproxy does not fail with connection refused during startup.Open
http://localhost:10812in your browser. If the backend window shows a traceback, fix that before expecting API routes to work.
Available Tools
10 toolscheck_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
| Name | Required | Description | Default |
|---|---|---|---|
| service | No | default | |
| folder | No | INBOX | |
| limit | No | ||
| unread_only | No | ||
| from_contains | No | ||
| subject_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | Yes | ||
| config | Yes | ||
| enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 serviceNotes: - 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
| Name | Required | Description | Default |
|---|---|---|---|
| service | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | ||
| limit | No | ||
| unread_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| subject | Yes | ||
| body | Yes | ||
| service | No | default | |
| html | No | ||
| cc | No | ||
| bcc | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description 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.
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.
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.
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.
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.
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.
10 tool updates
v0.3.1- First observed
check_inbox - First observed
configure_service - First observed
email_agentic_assist - First observed
email_help - First observed
email_status - First observed
list_services - First observed
mailing_list_latest - First observed
mailing_lists_catalog - First observed
send_email - First observed
suggest_email_subject
TDQS
Scored across 10 tools
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.
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.
10 tools cover essential email operations plus extras (help, subject suggestions, mailing list presets) without being overwhelming.
Core send/receive and service management are covered, but lacks email deletion, folder movement, and attachment support, which are common email tasks.
Maintenance
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Hosted email MCP for AI agents with inboxes, send/receive, memory, recovery, and credits.
Hosted email for AI agents: create inboxes, send, receive, and reply over MCP with scoped API keys
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA 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-
- AlicenseAqualityDmaintenanceProvider-agnostic email MCP server that connects any IMAP mailbox to AI assistants, enabling email management through natural language.8AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceCross-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 npm1MIT
- AlicenseBqualityBmaintenanceEnables 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.14MIT