Email MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_EMAIL_ADDRESS | Yes | Email address (required) | |
| MCP_EMAIL_IMAP_TLS | No | IMAP TLS | true |
| MCP_EMAIL_PASSWORD | Yes | Password or app password (required) | |
| MCP_EMAIL_SMTP_TLS | No | SMTP TLS | true |
| MCP_EMAIL_USERNAME | No | Login username (defaults to email) | |
| MCP_EMAIL_FULL_NAME | No | Display name | |
| MCP_EMAIL_IMAP_HOST | Yes | IMAP server hostname (required) | |
| MCP_EMAIL_IMAP_PORT | No | IMAP port | 993 |
| MCP_EMAIL_SMTP_HOST | Yes | SMTP server hostname (required) | |
| MCP_EMAIL_SMTP_PORT | No | SMTP port | 465 |
| MCP_EMAIL_RATE_LIMIT | No | Max sends per minute | 10 |
| MCP_EMAIL_ACCOUNT_NAME | No | Account name | default |
| MCP_EMAIL_SMTP_STARTTLS | No | SMTP STARTTLS | false |
| MCP_EMAIL_SMTP_VERIFY_SSL | No | Verify SSL certificates | true |
| MCP_EMAIL_SMTP_POOL_ENABLED | No | Enable SMTP transport pooling | true |
| MCP_EMAIL_SMTP_POOL_MAX_MESSAGES | No | Max messages per pooled connection | 100 |
| MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS | No | Max pooled SMTP connections | 1 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": true,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_accountsA | List all configured email accounts. Call this first to discover available account names for use with other tools. |
| list_mailboxesA | List all mailbox folders for an account with unread counts and special-use flags. Use list_accounts first to get the account name. |
| list_emailsA | List emails in a mailbox with optional filters. Returns paginated results with metadata (read/unread π΅, flagged β, replied β©οΈ, attachments π, labels π·οΈ). List or machine-generated mail is marked π° newsletter / π€ automated from its RFC headers, with the unsubscribe URI when the sender offers one β personal mail carries no marker. Use get_email to fetch full body content. ProtonMail note: labels are represented as IMAP folders β use list_labels to discover them, then list_emails with mailbox="Labels/X" to find labeled emails. |
| get_emailA | Get the full content of a specific email by ID. Does NOT mark the email as seen (uses IMAP BODY.PEEK β non-destructive). format: text (default) = HTML converted to readable text with markdown; stripped = text minus quoted replies and signatures; full = raw body part (HTML mail returns raw HTML). Body is capped at 10000 chars by default β pass maxLength (0 = unlimited) to change. Set markRead=true only when you want to explicitly mark the email as read. A Bulk: line appears for list or machine-generated mail (π° newsletter / π€ automated), derived from RFC headers, with the unsubscribe URI when the sender offers one. |
| get_emailsA | Fetch the full content of multiple emails in a single call (max 20). More efficient than calling get_email repeatedly when triaging or summarising several emails. Does NOT mark emails as seen. Defaults to format="text" (HTML stripped) for compact, AI-friendly output. Each message carries the same π° newsletter / π€ automated marker as get_email. |
| get_email_statusA | Get the current read/flag/label state of an email without fetching its body. Much cheaper than get_email when you only need to check whether an email is unread, flagged, or which labels it has. Also useful to confirm the result of a mark_email call. Does NOT mark the email as seen. |
| search_emailsA | Search emails by keyword across subject, sender, and body β and, where the local mirror is enabled, attachment filenames (searching "report" finds an email carrying Q3-report.pdf). Omit query (or pass an empty string) to use it as a pure filter β e.g. find all emails from a specific sender without a keyword. Supports additional filters for sender, recipient, date range (since/before β INTERNALDATE; sent_since/sent_before β Date: header), attachments, size, and reply status. At least one of query/from/to/since/before/sent_since/sent_before/has_attachment/larger_than/smaller_than/answered must be set; otherwise the call errors (use list_emails to browse without filters). Results carry the same π° newsletter / π€ automated markers as list_emails. |
| download_attachmentA | Download an email attachment by filename or part id. First use get_email to see available attachments with their filenames and partIds (partId is unambiguous β use it for duplicate filenames and inline cid images). Returns base64-encoded content for files β€5MB. saveToDownloadDir is unavailable β no attachment download directory is configured on this server. |
| extract_contactsA | Extract unique contacts from recent email headers. Returns contacts sorted by frequency (most frequent first). Useful for finding frequent correspondents or building an address book. |
| get_threadA | Reconstruct a full email conversation thread by following References and In-Reply-To headers. Returns all related messages. Does NOT mark emails as seen. format: text (default) = HTML converted to readable text with markdown; stripped = text minus quoted replies; full = raw body part. Each body is capped at 5000 chars by default β pass maxLength (0 = unlimited) to change. Use newestFirst=true to show the most recent message in full and older messages as header-only summaries. Use get_email first to obtain the message_id. Each message carries a Bulk line when it is list or machine-generated mail. |
| list_templatesA | List all available email templates. Templates are TOML files in ~/.config/email-mcp/templates/ with {{variable}} placeholders for subject and body. |
| extract_calendarB | Extract calendar events (ICS/iCalendar) from an email. Returns structured event data including time, location, attendees, and status. |
| add_to_calendarA | Add an email event to the local calendar (macOS Calendar.app / Linux via xdg-open). Automatically extracts event data from the email: ICS attachments, meeting URL (Zoom/Teams/Meet), conference dial-in / ID / passcode, attendees, and email body excerpt. All relevant email attachments (PDFs, docs, etc.) are saved locally and linked in the event notes. A native confirmation dialog is shown on macOS before the event is written. Returns one of: added | cancelled | timed_out | no_display. |
| check_calendar_permissionsA | Check whether the local calendar is accessible. On macOS, verifies Calendar.app access (requires Privacy & Security β Calendars permission). Returns granted status and step-by-step setup instructions if access is denied. |
| list_calendarsA | List all available local calendars (macOS Calendar.app / Linux default). Use the returned calendar names with add_to_calendar to target a specific calendar. |
| list_eventsA | List local calendar events with optional filters. Search by title, date range, or calendar name. Use to check for existing events before creating new ones, or to verify a recently added event. Returns event id, title, start/end time, location, and calendar name. |
| list_remindersA | List reminders from macOS Reminders.app with optional filters. Search by title or list name. By default only shows incomplete reminders. Use to check for existing reminders before creating new ones, or to verify a recently added reminder. Returns reminder id, title, due date, completion status, priority, and list name. |
| create_reminderA | Create a reminder in macOS Reminders.app from an email. Shows a native confirmation dialog before adding. The reminder notes include a message: deep link that reopens the source email in Mail.app. Use for action items, deadlines, and follow-up tasks extracted from emails. Use analyze_email_for_scheduling first to let the AI decide if a reminder is appropriate. |
| analyze_email_for_schedulingA | Analyze an email to detect calendar events and/or reminder-worthy content. Returns structured analysis so the AI can decide whether to call add_to_calendar, create_reminder, both, or neither. Use this as the first step before creating any scheduling resource. |
| get_email_statsA | Get email statistics and analytics for a mailbox. Shows volume, top senders, daily trends, and read/flagged counts. |
| check_healthA | Check connection health, quota, and capabilities for email accounts, plus local cache size, coverage and hit ratio. Useful for diagnosing issues. |
| find_email_folderA | Find a real mailbox folder an email belongs to. Required before move_email or delete_email when the email was found in a virtual folder (e.g., "All Mail", "Starred"). Returns the first real folder path found, to use as sourceMailbox; on a label-based server a message may also sit in other folders. |
| get_watcher_statusB | Get the status of IMAP IDLE watcher connections and recent activity. |
| list_presetsA | List all available AI triage presets with their descriptions and suggested labels. |
| get_hooks_configA | Get the current AI hooks configuration including preset, rules, and custom instructions. |
| check_notification_setupA | Diagnose desktop notification support on this platform. Checks if required OS tools are available and provides setup instructions to enable notification permissions (macOS, Linux, Windows). |
| test_notificationA | Send a test desktop notification to verify that OS permissions are correctly configured. Use check_notification_setup first to diagnose any issues. |
| configure_alertsA | Update alert/notification settings at runtime. Changes take effect immediately. Use save=true to persist changes to the config file. Omit any field to leave it unchanged. |
| get_verification_codeA | Find the newest verification code (OTP/2FA) or sign-in magic link in recent mail, using false-positive-resistant scoring (EN/DE). Use wait_seconds (max 45) to wait for a mail still in flight; if nothing arrives, simply call again. Works without the watcher via polling β with [settings.watcher] enabled, hits land within ~1 second. Set copy_to_clipboard=true to also place the value on the clipboard (concealed from clipboard managers, auto-cleared). The code/link is returned in the result by design. |
| check_clipboard_setupA | Diagnose the clipboard integration used for caught verification codes: platform tools, concealed-write support, current [settings.verification] values, and the watcher prerequisite. With test_write=true it performs a harmless clipboard round-trip (writes a test string, reads it back, clears it). |
| configure_verificationA | Update [settings.verification] at runtime β changes take effect immediately, including starting/stopping the ambient catcher via |
| send_emailB | Send a new email. Supports plain text or HTML body, CC, and BCC. |
| reply_emailA | Reply to an email with proper threading (In-Reply-To & References headers). Use get_email first to read the original. The original message is quoted below the reply by default (Thunderbird/Outlook style) β set quoteOriginal=false for the bare body only. |
| forward_emailA | Forward an email to new recipients with optional additional message. The original is converted to readable text and "> "-quoted below your note; its attachments are re-attached unless includeAttachments is false. Set html=true to also send an HTML part carrying the original HTML in a blockquote. |
| move_emailA | Move an email to a different mailbox folder. The sourceMailbox must be a real folder, not a virtual one like "All Mail". Use find_email_folder first if the email was discovered in a virtual folder. |
| delete_emailA | Delete an email. By default moves to Trash. Set permanent=true for permanent deletion (β οΈ irreversible). The mailbox must be a real folder. Use find_email_folder first if the email was found in a virtual folder. |
| mark_emailA | Change email flags β mark as read/unread, flag/unflag. Idempotent: marking an already-read email as read is a no-op. |
| list_labelsA | List available labels for an email account. Auto-detects the label system: ProtonMail folder-labels, Gmail X-GM-LABELS, or IMAP keywords. ProtonMail note: labels are represented as IMAP folders under the Labels/ prefix. Use list_emails with mailbox="Labels/" to find emails tagged with a ProtonMail label. |
| add_labelA | Add a label to an email. For ProtonMail, this copies the email into the corresponding Labels/ folder. For Gmail and standard IMAP, this sets a keyword flag on the message. |
| remove_labelA | Remove a label from an email. For ProtonMail, this removes the email from the label folder. For Gmail and standard IMAP, this removes a keyword flag. |
| create_labelA | Create a new label. For ProtonMail, creates a folder under Labels/. For standard IMAP keywords, labels are auto-created on first use β this is a no-op. |
| delete_labelA | Delete a label. For ProtonMail, deletes the label folder. For standard IMAP keywords, labels cannot be deleted server-wide β use remove_label on individual emails. |
| bulk_actionA | Batch operation on multiple emails by UID list. Supports mark_read, mark_unread, flag, unflag, move, and delete. Max 100 IDs per call. Returns success/failure counts. |
| save_draftA | Save an email draft to the Drafts folder. Compose over time, then use send_draft to send it. Use list_emails with the Drafts mailbox to see saved drafts. |
| send_draftA | Send an existing draft email and remove it from Drafts. The draft is fetched, sent via SMTP, then deleted. Use list_emails with the Drafts mailbox to find draft IDs. |
| create_mailboxA | Create a new mailbox (folder). Use '/' as separator for nested folders (e.g., 'Work/Projects'). Use list_mailboxes to see existing folders. |
| rename_mailboxA | Rename an existing mailbox (folder). Use list_mailboxes to see current folder paths. |
| delete_mailboxA | β οΈ DESTRUCTIVE: Permanently delete a mailbox and ALL its contents. This cannot be undone. Use list_mailboxes to verify the folder path. |
| apply_templateA | Apply an email template with variable substitution. Use action "preview" to see the result, "draft" to save as draft, or "send" to send immediately. |
| schedule_emailA | Schedule an email to be sent at a specific time in the future. The email is queued locally and sent automatically when the time arrives. |
| list_scheduledB | List scheduled emails. Shows pending, sent, or all scheduled emails. |
| cancel_scheduledA | Cancel a scheduled email. Removes it from the queue and deletes the associated draft. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| triage_inbox | Analyze unread emails and categorize by urgency. Produces a structured triage report with recommended actions. |
| summarize_thread | Summarize an email conversation thread. Produces a structured report with participants, timeline, decisions, and action items. |
| compose_reply | Draft a professional reply to an email with tone control. Fetches the original email and optionally the full thread for context. |
| draft_from_context | Compose a new email about a topic, searching past emails for relevant context to reference naturally. |
| extract_action_items | Scan recent emails and extract action items, deadlines, and commitments. Produces a structured task list with source references. |
| summarize_meetings | Scan recent emails for calendar invites and produce a meeting overview grouped by timeframe. |
| cleanup_inbox | AI-guided inbox cleanup β categorizes emails and suggests or executes organization actions. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| accounts | List of all configured email accounts |
| scheduled | List of pending scheduled emails |
| default β Mailbox tree | Folder structure and message counts for user@example.com |
| default β Unread summary | Unread email counts by folder for user@example.com |
| default β Inbox Stats | Email statistics snapshot for user@example.com |
TDQS
Scored across 52 tools
Many tools target the same resource with overlapping actionsβe.g., list_emails vs search_emails, get_email vs get_emails vs get_email_status, and mark_email vs bulk_actionβso an agent could easily misselect despite detailed descriptions. Calendar/reminder tools (extract_calendar, analyze_email_for_scheduling, add_to_calendar) also have blurry boundaries. Some overlap exists but descriptions help.
Tool names consistently use snake_case and mostly follow a verb_noun pattern (list_emails, send_email, create_label, delete_mailbox). A few deviations like bulk_action (noun phrase) and list_scheduled (missing noun) are minor. The convention is predictable overall.
52 tools is far beyond the 3β15 typical for a well-scoped server and exceeds the 50+ threshold for extreme mismatch. Even accounting for the broad email+calendar+reminders scope, the surface is heavily overloaded with many niche configuration and diagnostic tools.
Email lifecycle is thoroughly covered: list/get/search/send/reply/forward/move/delete/mark/label/draft/schedule/templates. However, calendar and reminder operations lack update/delete tools, and account management (add/remove) is absent, leaving some dead ends.