mail-calendar-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mail_app_statusA | Check whether Mail.app is running and responding to Automation. Use this before other Mail tools to distinguish "app not running/asleep" from a genuine data error. |
| calendar_app_statusA | Check whether Calendar.app is running and responding to Automation. Use this before other Calendar tools to distinguish "app not running/asleep" from a genuine data error. |
| mail_list_accountsA | List every Mail account configured in Mail.app (iCloud, Google, Exchange, IMAP, etc.) with type, enabled state, and email addresses. |
| mail_get_accountA | Get details for a single Mail account by name. |
| mail_get_account_statsA | Get unread message counts for an account, broken down by mailbox (recursive). |
| mail_list_mailboxesA | List the full mailbox/folder tree (including nested subfolders and unread counts) for a Mail account. |
| mail_create_mailboxB | Create a new mailbox/folder under an account, optionally nested under an existing parent mailbox path. |
| mail_rename_mailboxA | Rename an existing mailbox/folder. Confirmed via testing to be unreliable via AppleScript/JXA on at least some accounts — expect a PLATFORM_LIMITATION error and rename manually in Mail.app as a fallback. |
| mail_delete_mailboxA | [IRREVERSIBLE] Permanently delete a mailbox/folder and everything in it. Known to be unreliable for cloud-synced accounts (iCloud/Exchange/IMAP) due to a Mail.app scripting limitation — may fail with PLATFORM_LIMITATION. Requires confirm:true. |
| mail_search_messagesA | Search/list messages in a mailbox with optional filters (read status, flagged status, subject/sender substring). Paginated: default limit 50, max 500. |
| mail_get_messageC | Get full metadata and plaintext body for a single message. |
| mail_get_message_sourceA | Get the full raw RFC822 source (headers + MIME body) of a message. Use this to extract HTML bodies or inspect MIME structure. |
| mail_get_message_headersB | Get just the raw header block of a message. |
| mail_list_attachmentsA | List attachments on a message (name, size, download state) without downloading them. |
| mail_get_attachmentA | Save one attachment (by its index from mail_list_attachments) to a local directory. Refuses attachments that would need more than a reasonable size — check size via mail_list_attachments first for anything large. |
| mail_set_read_statusC | Mark a message as read or unread. |
| mail_set_flaggedB | Flag or unflag a message. |
| mail_set_flag_colorB | Set a message's colored-flag index (-1 clears the flag; 0-6 select a color per Mail.app's flag palette). |
| mail_move_messageB | Move a message to a different mailbox (recoverable — just relocates it). |
| mail_copy_messageA | Copy a message to a different mailbox, leaving the original in place. |
| mail_delete_messageA | Move a message to Trash. Recoverable — it stays in the account's Trash mailbox until emptied. |
| mail_permanently_delete_messageA | [IRREVERSIBLE] Permanently delete a message, bypassing/purging Trash. This cannot be undone. Requires confirm:true. |
| mail_create_draftA | Create a new draft email (saved to the account's Drafts mailbox). Returns a composeSessionId usable with mail_send_message, mail_update_draft — valid only until Mail.app next restarts. |
| mail_create_reply_draftA | Create a reply draft to an existing message, with quoted original content prefilled. |
| mail_create_forward_draftB | Create a forward draft of an existing message. |
| mail_update_draftA | Update fields (subject/content/recipients) of an open draft compose session by composeSessionId. |
| mail_list_draftsA | List persisted drafts in an account's Drafts mailbox. |
| mail_delete_draftA | Delete a persisted draft from the Drafts mailbox (recoverable via Trash, like mail_delete_message). |
| mail_send_messageA | [IRREVERSIBLE] Send an email. Either pass composeSessionId to send an existing draft from this Mail.app session, or pass to/subject/content directly to compose and send in one call. Requires confirm:true. |
| mail_list_signaturesA | List all Mail signatures (name + content). |
| mail_create_signatureC | Create a new Mail signature. |
| mail_update_signatureC | Update an existing Mail signature's content. |
| mail_delete_signatureC | Delete a Mail signature. |
| mail_list_rulesA | List existing Mail rules (name, enabled state). Read-only: creating/editing rules is not achievable via AppleScript/JXA — Mail's rule automation only supports rules invoking a script as an action, not external rule creation. Manage rules in Mail.app > Settings > Rules. |
| calendar_list_calendarsA | List every calendar across all accounts (iCloud/Google/Exchange/etc.) with its index (use for calendar_* tools when names are ambiguous), writability, and description. |
| calendar_create_calendarA | Create a new calendar. Verifies the calendar actually exists after creation before reporting success (Calendar's scripting dictionary has known flaky spots). |
| calendar_rename_calendarB | Rename an existing calendar. |
| calendar_delete_calendarA | [IRREVERSIBLE] Permanently delete a calendar and everything in it. Confirmed via testing to be unreliable via scripting on at least some calendars — expect a PLATFORM_LIMITATION error and delete manually in Calendar.app as a fallback. Requires confirm:true. |
| calendar_list_eventsA | List events in a calendar within a bounded date range (max 366 days — required, not optional, to avoid multi-year recurrence-expansion queries hanging). Paginated. |
| calendar_search_eventsA | Search events in a calendar by summary text within a bounded date range (max 366 days). |
| calendar_get_eventA | Get a single event by its uid (stable iCalendar identifier — see calendar_list_events output). |
| calendar_create_eventA | Create a new event. Verifies the event actually exists (by uid) after creation before reporting success — Calendar's scripting dictionary has known flaky spots for event creation. |
| calendar_update_eventA | Update fields on an existing event by uid. Verifies changed fields actually took effect on re-read before reporting success — recurrence edits on already-recurring events are a known-flaky area. |
| calendar_delete_eventA | [IRREVERSIBLE] Delete an event by uid. Confirmed via testing: deleting a RECURRING event silently reports success without actually deleting it on this platform — this tool detects that and returns PLATFORM_LIMITATION instead of a false success; delete recurring events manually in Calendar.app (where you can choose 'this event' vs 'all future events'). Requires confirm:true. |
| calendar_add_alarmB | Add a display/sound/email alarm to an event, N minutes before it starts. |
| calendar_list_alarmsC | List all alarms (display/sound/mail) on an event. |
| calendar_remove_all_alarmsC | Remove every alarm from an event. |
| calendar_list_attendeesA | List attendees on an event. Note: once any attendee is added to an event you organize, an extra entry with a null email (the organizer/self) commonly appears — flagged as isLikelyOrganizerSelf, not a bug. |
| calendar_add_attendeeA | Add an attendee (by email) to an event. This has historically been an unreliable area of Calendar's AppleScript/JXA dictionary — the tool verifies the attendee actually appears on re-read before reporting success. |
| calendar_remove_attendeeA | Remove an attendee (by email) from an event. Unverified/experimental — treat failures as a real platform limitation, not a bug in this tool. |
| calendar_get_availabilityA | Compute free/busy gaps across one or more calendars within a bounded date range (max 366 days). This is computed locally from calendar_list_events-equivalent data, not a native Calendar.app feature — Calendar's scripting dictionary has no free/busy API. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/mathewcsims/mail-calendar-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server