MiniMail MCP Server
MiniMail MCP Server enables sending, receiving, and managing emails via multiple providers, with AI-assisted features, automation, and a web dashboard.
Core Email Operations
Send emails via SMTP/IMAP (Gmail, Outlook, ProtonMail), transactional APIs (SendGrid, Mailgun, Resend, Amazon SES), local testing servers (MailHog, Mailpit), or webhooks (Slack, Discord, Telegram) — with HTML, CC, and BCC support
Check inbox from IMAP or local testing servers, with filters for folder, unread status, sender, and subject
Fetch full email detail, search emails (IMAP full-text), delete emails, and mark as read
Service Management
Dynamically configure, list, remove, and test SMTP, API, local, and webhook services at runtime
Check connectivity and credential health for one or all services
AI & Automation
AI-powered assistance: Compose via natural language, rewrite emails with style/length/mood controls, auto-generate subject lines
Agentic workflows: Multi-step email planning via LLM sampling (Anthropic, OpenAI, Ollama, Google)
Auto-reply: Rule-based and AI-powered auto-responders with spam detection and spoof mode
Mail Watcher: Background IMAP polling that triggers webhook notifications
Management & Organization
Draft management: Save, edit, and send drafts
Folder management: Create, rename, delete IMAP folders
Contact import: CSV, vCard, Google People API, Microsoft Graph API, plus curated lists (US Congress, EU, Austria)
Bulk send: Multiple recipients with rate limiting and anti-spam safeguards
Mailing list presets: Configure newsletter folders and fetch latest messages
Web Dashboard & Testing
Full React SPA at
localhost:10812with inbox, compose, search, AI chat, auto-reply, services, settings, and help pagesMail Lab: Throwaway SMTP server with AI-generated test messages
Creative workflows: Generate love letters, complaints, ASCII art, and SVG cards
Dual transport: Claude Desktop via stdio + web UI via HTTP
Native desktop app (Tauri 2.0) bundling the webapp and Python backend
Security: Two-layer prompt injection defense (Unicode stripping + safety boundary wrapping)
Enables sending transactional emails using the Amazon SES (Simple Email Service) platform.
Allows forwarding or sending email notifications directly to Discord channels as messages.
Integrates with GitHub to convert emails into comments for issues and pull requests.
Supports sending and receiving emails through Gmail using SMTP and IMAP with App Password authentication.
Enables email sending and inbox management for iCloud Mail accounts using standard email protocols.
Provides transactional email delivery and management through the Mailgun developer-friendly API.
Supports sending and checking emails on ProtonMail via direct SMTP/IMAP or through the ProtonMail Bridge.
Enables email sending and management through the Resend modern transactional email API.
Supports enterprise-grade email delivery and management via the SendGrid API.
Allows sending email alerts and notifications directly to Slack channels using incoming webhooks.
Enables forwarding email content and notifications to Telegram bots.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MiniMail MCP ServerSend an email to sarah@example.com about the project kickoff"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Email MCP Server
A full-featured email server for MCP clients. Send and receive mail through SMTP/IMAP, transactional APIs (SendGrid, Mailgun, Resend), local test servers (MailHog), and webhooks (Slack, Discord). Includes a web dashboard with AI-assisted compose, a throwaway SMTP lab, folder management, contact import, background mail watching, and creative AI workflows (love letters, complaints, ASCII art, SVG cards).
v0.4.1 -- 188 tests passing, 42 MCP tools, FastMCP 3.4+, dual transport (stdio + HTTP).
Quick Start
.\start.ps1Opens the web dashboard at http://localhost:10812. Backend runs on port 10813.
Requirements: Python 3.12+, uv. Start configuring services from the Settings page.
For Claude Desktop setup, MCPB packaging, and manual configuration see docs/quickstart.md.
Related MCP server: io.github.p-w-4-z/inbox-mcp
Supported Email Systems
Type | Providers | Guide |
Microsoft Graph | Personal Outlook/Hotmail (basic SMTP/IMAP auth disabled) | |
SMTP/IMAP | Gmail, Outlook/M365, Yahoo, iCloud, ProtonMail | |
Transactional APIs | SendGrid, Mailgun, Resend, Amazon SES | |
Local Testing | MailHog, Mailpit, MailCatcher, Inbucket | |
Webhooks | Slack, Discord, Telegram |
Documentation
Document | Contents |
Installation, Claude Desktop setup, first email | |
All env vars, mailing lists, dynamic config | |
Full 39-tool reference with REST surface | |
Architecture, commands, contribution patterns | |
Symptom lookup, diagnostics endpoints | |
Prompt injection defense architecture | |
Background IMAP polling + webhook notifications | |
Integrate with robofang for TTS/light alerts | |
Gmail app password setup | |
Outlook/Hotmail — Graph API (OAuth) + SMTP/IMAP | |
aiwatcher + robofang fleet event connectors | |
ProtonMail Bridge & direct access | |
SendGrid, Mailgun, Resend, SES | |
MailHog, Mailpit for dev | |
Slack, Discord, Telegram |
Features
42 MCP tools: send, receive, search, delete, move, copy, forward, mark-read, folder CRUD, manage email services, contacts, auto-respond, workflows, mail lab, fleet connectors
Web dashboard: full React SPA at
localhost:10812Microsoft Graph support: send/receive for personal Outlook/Hotmail via Graph REST API (OAuth device flow, public client ID — no Azure registration)
Folder treeview: expandable sidebar with unread badges + inline folder CRUD
AI assistant: natural language email commands (Ollama, OpenAI, Anthropic, Google)
AI Improve: rewrite email body with style/length/mood controls
AI Assist: describe a service in plain language, LLM fills the config form
Auto-Respond: rule-based + AI-powered auto-reply with spam detection and spoof mode
Bulk Send: paste email lists with rate limiting and anti-spam safeguards
Dual transport: stdio (Claude Desktop) + HTTP streamable (web)
Draft management: save/compose/send from the webapp
Toast notifications: live feedback for all actions
Prompt injection defense: two-layer sanitization (Unicode stripping + safety boundary wrapping)
Mail Lab: throwaway SMTP server for testing with AI-generated messages
Mail Watcher: background IMAP polling with webhook notifications for robofang/fleet-agent integration
Contact import: CSV, vCard, Google People API, Microsoft Graph API + curated lists (US Congress, EU, Austria)
Creative Workflows: 7 AI letter presets with ASCII art and SVG card output
Folder management: create, rename, delete IMAP folders from the webapp
Quick Setup: one-click Gmail/Outlook/Yahoo/iCloud/ProtonMail/Zoho/GMX/Fastmail with email+password
Web Dashboard
Page | Route | Purpose |
Dashboard |
| KPI cards, recent activity, service health |
Inbox |
| Read, filter, delete, auto-refresh |
Email Detail |
| Full email with HTML body, reply/delete |
Compose |
| Send with drafts, HTML toggle, AI Improve, AI subject, Expander, Bulk Send |
Search |
| Full-text IMAP search |
AI Chat |
| Natural language email assistant with creative workflows |
Mail Lab |
| Throwaway SMTP server, AI message generator, mail watcher |
Contacts |
| Import CSV/vCard/Google/Office 365, search, groups, curated lists |
Auto-Reply |
| Rule-based + AI auto-reply, spam detection, spoof mode, pending approval |
Services |
| Form-based add/remove/test with AI Assist presets |
Tools |
| Execute MCP tools from the browser |
Settings |
| AI provider config, email credentials |
Help |
| Tabbed documentation (6 tabs) |
Tools
Tool | Description |
| Send via any service |
| Read IMAP inbox |
| Get full email with body |
| IMAP full-text search |
| Remove email (IMAP) |
| Move between folders (COPY + DELETE) |
| Copy to another folder, original stays |
| Forward with optional comment |
| Toggle read status |
| Fleet events: aiwatcher ingest / robofang hook / status |
| Test connectivity |
| List configured services |
| Manage services |
| One-click Gmail/Outlook/Yahoo/iCloud |
| IMAP folder CRUD |
| Usage help and documentation |
| List newsletter presets |
| Fetch from a preset |
| AI subject line (sampling) |
| Multi-step email plan |
| Contact management |
| Background IMAP polling |
| Creative email generation |
| Auto-respond rules |
| Pending reply management |
Ports
Service | Port |
Web dashboard frontend | 10812 |
Backend API + MCP HTTP | 10813 |
Native Desktop App (Tauri 2.0)
A standalone Windows desktop app is available, bundling the webapp + Python backend into a single installer (~15 MB).
# Build everything in one command:
just build-native
# Installer lands at:
# native/target/release/bundle/nsis/Email MCP_0.1.0_x64-setup.exeRequires Rust, Node.js 20+, and Visual Studio Build Tools (for C++ compilation). The backend is compiled via PyInstaller and bundled as a Tauri sidecar -- no Python runtime needed.
Development
# Install all dependencies
uv sync --extra test --extra dev
# Start the web dashboard
.\start.ps1
# Run all backend tests
.venv\Scripts\pytest.exe tests -q
# Run Playwright e2e tests
cd webapp && npx playwright test && cd ..
# Full test suite
.venv\Scripts\pytest.exe tests -q && cd webapp && npx playwright test && cd ..
# Build MCPB package
uv run python build_mcpb.py
# Lint
uv run ruff check srcSee docs/quickstart.md for full setup guide.
License
MIT
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.
TDQS
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.
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.
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.321MIT
- 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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sandraschi/email-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server