macOS-only MCP server that exposes iMessage chat.db to Claude and exports per-chat history to an Obsidian vault.
Server has 14 tools with complete input schemas and descriptions. Naming follows verb_noun convention (list_, get_, search_, send_, mark_, confirm_, export_). Descriptions are present and substantive (avg ~120 chars), explaining WHAT and WHEN. However, parameter descriptions are sparse or missing for several tools (e.g., get_chat's 'chat_id' lacks format guidance; search_messages lacks explanation of FTS query syntax). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance. Draft+confirm pattern for send_message is good (pattern:confirmation-request), but confirm_send lacks explicit error cases. Security: no secrets in params (good), but no audit logging visible. Overall: solid foundation, but incomplete for production LLM agents.
Confirm and send a previously-staged draft message.
Export iMessage chats to Obsidian vault as Markdown files.
Return one chat's metadata + participants by ROWID or guid.
Return messages surrounding a given ROWID in the same chat.
Return every message in a reply thread.
Return unread inbound messages across all chats (newest first).
Return FDA + chat.db reachability + Whisper status + search index status.
Output schemas not documented. LLMs cannot predict response structure for any tool. Downstream tool chaining requires explicit field documentation (e.g., does list_chats return chat_id, chat_guid, or both?).
Parameter descriptions lack format/constraint guidance. 'chat_id' in get_chat does not specify whether it accepts ROWID (integer) or guid (string) or both. 'query' in search_messages lacks FTS5 syntax explanation.
Error handling absent. No recovery guidance for common failures (e.g., 'chat not found', 'invalid FTS query', 'draft expired'). Agents cannot self-correct on errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | 2026-07-28+ | v2 |
List attachments, filterable by chat or recency.
List chats sorted by most recent activity. Adds resolved display names.
Pull recent messages for one chat, scrubbed and (optionally) CRM-enriched.
Mark a chat read via Messages.app. One-step (low-consequence).
Find handles by substring; enriches with Contacts.app names + CRM context.
FTS5 full-text search over messages. Refreshes the index by default.
Stage a message for sending (draft pattern). Returns draft_id for later confirmation.
confirm_send lacks explicit error cases and timeout behavior. Draft TTL is 1 hour (code: DRAFT_TTL_SEC = 3600.0), but this is not documented in the tool description. Agents may retry expired drafts without knowing why.
No audit logging visible. Tools that modify state (mark_chat_read, send_message, confirm_send, export_to_vault) do not log who called them, when, or with what parameters. Compliance and debugging are compromised.