Search and read your Apple Messages history from any MCP client. Read-only, runs on your Mac, no native dependencies.
Strong foundational quality with comprehensive schemas and descriptions across all 8 tools. All tools have clear action-verb naming (get_, list_, search_, resolve_, sync_, analyze_) following the verb_noun convention (baseline: 90% of A+ tools). All tools include detailed descriptions (range: 95-220 chars, baseline 194 avg). Input schemas are fully specified with types, enums, and descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) present across all tools, signaling current spec awareness. Output schemas are partially documented (visible in successSchema structure). Composition is clean, each tool has a single responsibility (search_messages searches, list_conversations lists, etc.). Privacy mode parameter consistently applied across all tools for data sensitivity control, demonstrating thoughtful design. Key gaps: output schemas defined programmatically but not explicitly documented for LLM understanding in descriptions; error handling focuses on validation but lacks recovery guidance (no 'try X' hints); some parameters like 'timezone' lack range/constraint documentation; no batch variants offered despite many tools accepting arrays.
Analyze communication patterns (message counts, response times, streaks, or initiation rates) with optional filtering by date range and timezone.
Retrieve an attachment file by its attachment ID, with optional format conversion for images and media.
Get events (messages, reactions, receipts, system events) from a specific conversation with optional filtering and pagination.
List conversations with optional filters for date range, participants, service type, and search query. Returns paginated results with conversation metadata.
Resolve a contact query (name or handle) and return matching contact candidates with their handles and matching strategy.
Search messages across the archive by text, conversation names, or attachment filenames with support for different search modes and ordering.
Output schemas are programmatically defined (successSchema, contactCandidateSchema, etc.) but LLM-facing descriptions do not document return types or field structures. LLMs cannot infer what list_conversations returns without explicit output documentation in tool description.
Error handling emphasizes validation (invalid arguments caught by recoverInvalidInput) but lacks recovery guidance in tool descriptions. No 'try X alternative' or retry guidance for agents. Pattern:recovery-guide not implemented.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | B | 70 | 2025-06-18+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Get comprehensive information about the iMessage MCP server status, including API version, package version, privacy ceiling, source mode, detected services, schema capabilities, contacts availability, and index state.
Sync messages and related changes (edits, reactions, receipts, retractions, group events) since a checkpoint cursor with optional filtering.
Parameter 'timezone' appears in multiple tools (list_conversations, get_conversation, search_messages, analyze_communication) with description 'Timezone for date interpretation' but no constraint documentation. LLMs do not know: is 'UTC' valid? 'America/New_York'? What format? Min/max length?
analyze_communication has conditional parameter dependency: 'conversation_id' is 'required if scope is per_conversation'. Described as 'Specific conversation to analyze (required if scope is per_conversation)' but not clearly marked optional in schema. LLMs may pass conversation_id when scope='global' (redundant) or omit it when scope='per_conversation' (error).
No batch variants. Tools like search_messages and get_conversation accept pagination but do not support batch operations. Agents needing to search multiple queries or fetch multiple conversations must make N sequential calls, wasting tokens and latency.
get_attachment format parameter lists enum ['native', 'jpeg', 'webp', 'png'] with description 'Optional format conversion for images'. Does not clarify: what happens if format='jpeg' on a non-image? Is conversion performed server-side or returned unconverted? Do all formats apply to all attachment types?