Apple Tools MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| APPLE_TOOLS_INDEX_DAYS_BACK | No | Number of days back to index when building the search index | 30 |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| smart_searchA | Intelligent search across Mail, Messages, and Calendar. Automatically determines which sources to search based on your query. Returns results grouped by time when multiple sources match. Use this for complex queries that might span multiple data sources. |
| mail_searchB | Semantic search for emails using AI embeddings. Finds emails by meaning, not just keywords. Supports filtering by sender, recipient, attachments, mailbox, sent/received, and flagged. |
| mail_recentA | Get most recent emails without semantic search. Use this when the user asks for 'recent emails', 'latest emails', 'what emails did I get', or 'unread emails'. |
| mail_dateB | Get all emails from a specific date. Supports natural language like 'today', 'yesterday', 'November 13', 'last Friday'. Use this when the user asks for emails on a specific date. |
| mail_readA | Read full email content. Use the file_path from mail_search or mail_recent results. |
| mail_findA | Exact email lookup in Mail's own database (not the semantic index, so it never waits on indexing and matches filters exactly). Returns JSON: one row per copy (the same Message-ID in INBOX and Sent is two rows) with message_id, subject, from, to, received, mailbox, account_id. Needs at least one of subject_prefix, subject_contains, from, to, message_ids. Trash is excluded unless include_trash or mailboxes asks for it. Pair with mail_trash message_ids to clear what it finds. |
| mail_linksA | Links in one email, decoded: each http(s) link with its visible text, from the HTML anchors (quoted-printable and base64 decoded, & unescaped) and bare URLs in the plain-text part. Use the id from mail_find. mail_read strips HTML, so it loses link targets; use this when you need the URL behind a button such as a sign-in or confirm link. Reads Mail's message file directly and never waits on the index. downloaded:false means Mail has not saved the file yet. |
| messages_searchB | Semantic search for iMessages/SMS using AI embeddings. Finds messages by meaning. Supports filtering by contact, group chats, specific group name, and attachments. |
| messages_recentA | Get most recent messages without semantic search. Use this when the user asks for 'recent messages', 'latest texts', or 'what messages did I get'. My own messages show a To: line naming the contact or group chat they were sent to. |
| messages_conversationA | Get full conversation history with a specific contact. Shows messages in chronological order. |
| calendar_searchB | Semantic search for calendar events using AI embeddings. Finds events by meaning. Supports filtering by calendar name and all-day events. |
| calendar_dateA | Get all events on a specific date. Supports natural language dates like 'today', 'tomorrow', 'next Tuesday', 'Jan 15'. |
| calendar_free_timeB | Find free time slots on a specific date. Analyzes calendar to find available time windows. |
| mail_sendersB | List most frequent email senders. Helps identify who you communicate with most. |
| rebuild_indexA | Rebuild the search index for one or more data sources. This clears the existing index and re-indexes all content from scratch. Use this if search results are stale, missing, or if the index is corrupted. Can rebuild emails, messages, calendar, or all sources at once. |
| audit_indexB | Audit search index against source data with 0% tolerance. Reports missing items, orphaned entries, and duplicates with detailed file paths and remediation suggestions. Validates 100% of source data. |
| messages_contactsB | List all contacts you've messaged, sorted by most recent. Shows message count and last message date. |
| calendar_upcomingA | Get next N upcoming events across all calendars. Simpler than calendar_search for quick schedule overview. |
| calendar_weekA | Get all events for the current week or a future week. Shows events grouped by day. |
| mail_threadB | Get all emails in a conversation thread. Finds related emails by matching subject lines. |
| calendar_recurringB | List recurring events (events that appear multiple times). Shows upcoming occurrences. |
| contacts_searchB | Search your contacts by name, email, phone, or organization. Returns matching contacts with all their details. |
| contacts_lookupB | Look up a specific contact by email, phone number, or name. Returns full contact details including all emails and phone numbers. |
| person_searchA | Search ALL communication with a specific person across Mail, Messages, and Calendar. Automatically finds their emails and phone numbers from Contacts to search all sources. |
| mail_sendA | Send an email through Mail.app. Success requires Sent/Outbox verification, not merely an AppleScript return. Multiple recipients require confirm=true. Durable claims never expire uncertainty or automatically retry; changing/removing a key cannot bypass pending or terminal not_sent lineage. Read structuredContent.mail_send: suppression/replay is not a new delivery and cannot advance a page ledger. Legacy pending claims cannot be reconciled. A later retry after terminal not_sent needs separate protected single-use authorization, not confirm or a new key. |
| mail_send_reconcileB | No-send claim adjudication. Legacy claims are always ineligible. begin establishes a persistent global writer fence before fresh evidence is collected; commit requires protected administrator-provisioned approval, complete Sent AND Outbox evidence, and exclusion of all old/queued/script writers. Missing authority refuses. Neither action sends, retries, wakes Mail, changes the page ledger, or issues retry permission. |
| mail_draftA | Save an email to Drafts without sending it. Drafts are never delivered, so no recipient confirmation is required. |
| mail_replyA | Reply to an existing email. The reply text is pasted above the quoted original in a visible Mail window (System Events focus on the message body, then Command-Up and clipboard paste — not Cmd-A, which would replace the quote; AppleScript content is not set because Mail 16 leaves it empty). reply_all=true fans out to every original recipient and requires confirm=true. A real send is verified in Sent/Outbox before success. A send hang is a timeout, not TCC, unless Mail reports -1743/-10004; hang recover uses In-Reply-To. Clients must Sent-check before retrying a timed-out send. |
| mail_forwardA | Forward an existing email to new recipients. An optional note is pasted above the forwarded original in a visible Mail window (same System Events prepend as mail_reply; AppleScript content is not set). More than one recipient requires confirm=true. A real send is verified in Sent/Outbox before success. A send hang is a timeout, not TCC, unless Mail reports -1743/-10004; hang recover matches intended To plus Fwd: subject or original Message-ID. Clients must Sent-check before retrying a timed-out send. |
| mail_markC | Mark an email as read or unread. |
| mail_archiveC | Move an email to its account's Archive mailbox. |
| mail_trashA | Move email to Trash. Destructive: requires confirm=true, otherwise the call only reports what would be trashed. One message: message_id or file_path. Many: message_ids (up to 500, e.g. from mail_find) moves every copy of each (INBOX, Sent, Archive...) to that account's Trash; each copy's Message-ID is re-checked before it moves. A bulk call stops starting new moves after ~35s and reports 'remaining'; run it again for the rest. |
| messages_sendA | Send an iMessage or SMS. Address it with 'to' (E.164 phone numbers like +15551234567, or Apple ID emails) or with 'chat_id' (a chat GUID from chat.db, e.g. 'iMessage;-;+15551234567' or 'iMessage;+;chat123456'). Group chats and multiple recipients require confirm=true. |
| calendar_list_calendarsA | List the calendars in Calendar.app with their writability, so events land on the intended calendar instead of the default. |
| calendar_addB | Create a calendar event. Times must be explicit local datetimes (YYYY-MM-DD HH:MM). Supports recurrence (FREQ=DAILY/WEEKLY/MONTHLY/YEARLY with INTERVAL, COUNT or UNTIL, BYDAY) and alerts in minutes before the start. Returns the new event id. |
| calendar_editA | Update an existing event by id. Pass only the fields to change. Setting alerts_minutes_before replaces the event's existing alerts. |
| calendar_removeA | Delete a calendar event by id. Destructive: requires confirm=true, otherwise the call only reports what would be deleted. |
| calendar_rsvpB | Respond to a calendar invitation: accept, decline, or tentative. |
| contacts_addC | Create a contact in Contacts.app. Returns the new contact id. |
| contacts_editB | Update a contact by id. Emails and phones are added unless replace_emails / replace_phones is set; replacing with an empty list removes them and requires confirm=true. |
| contacts_removeA | Delete a contact by id. Destructive: requires confirm=true, otherwise the call only reports what would be deleted. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 41 tools
Most tools have sharply distinct purposes and the descriptions explicitly disambiguate the risky pairs (mail_search semantic vs mail_find exact vs mail_recent vs mail_date; calendar_search vs calendar_date vs calendar_week vs calendar_upcoming). Remaining friction is the sheer number of near-sibling retrieval tools per domain, plus contacts_search vs contacts_lookup and person_search vs smart_search, but the descriptions give clear selection cues in each case.
There is a strong, predictable domain-prefix scheme (mail_*, messages_*, calendar_*, contacts_*) which makes grouping obvious. Suffixes mix patterns though — noun_verb (mail_search, calendar_search) alongside noun_adj/noun_noun (mail_recent, calendar_date, mail_links) and unprefixed outliers (smart_search, person_search, rebuild_index, audit_index).
41 tools is heavy for what is four Apple data domains plus index maintenance; each domain carries 7-10 tools including many overlapping read paths. Some are clearly niche (mail_send_reconcile with a dense claim-adjudication contract, rebuild_index, audit_index) and inflate the surface beyond what most agents need.
Coverage is genuinely broad: mail read/search/send/draft/reply/forward/archive/trash/mark, messages read/search/send, calendar full CRUD plus RSVP, recurring, free-time and calendar listing, and contacts CRUD plus search/lookup. Gaps are minor but real — no flag/star setter despite a flagged search filter, no draft listing/retrieval or sending an existing draft, no mail move (only archive/trash), and no contact list-all.