MCP server for reading and sending iMessages and SMS through the Messages app on macOS
Strong tool definitions with complete schemas and descriptions across all 16 tools. All tools have proper JSON Schema with type constraints, enums, and min/max bounds. Descriptions are clear and action-oriented (avg ~120 chars). Tool names follow verb_noun convention (list_, get_, send_, search_, react_to_). Error handling is present but recovery guidance is minimal. Security model is sound (no secrets in params). Main gaps: output schemas not documented, some parameter descriptions could be more prescriptive about format/constraints, and no batch variants for common multi-call patterns.
Check the bundled imsg version and local Messages integration status.
Get identity, service and participant information for one chat.
Inspect locally recorded Messages background metadata and cached asset state for one chat.
Read messages from one chat with optional date bounds and attachment metadata.
Get buffered live message and reaction events after an opaque watcher cursor. An expired cursor is reported explicitly after app restart, watcher restart, or any continuity break.
Inspect pending, sent, delivered or failed state and available read timestamp for an outgoing message GUID.
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields without knowing response structure. All 16 tools lack documented return types.
Error recovery guidance missing. Tools return errors but do not guide LLM on next steps (retry, lookup alternative, ask user). E.g., 'chat_id not found' should suggest 'call list_chats() first'.
Parameter descriptions lack format/constraint details. E.g., 'start' and 'end' in get_messages say 'ISO 8601' but do not clarify timezone handling, whether times are UTC, or what happens if start > end.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
List recent iMessage and SMS conversations, including names, participants and unread counts.
List iMessage account logins observed in local Messages history. This is historical, not a live signed-in account check.
List future Send Later messages recorded by Messages.
Infer a phone number or email's preferred service from local history and resolve its local Contacts name when available.
Calculate message and optional media statistics globally or for one chat.
Send a standard tapback to the most recent incoming message in a chat. This uses Messages UI automation and may bring Messages to the foreground.
Read an attachment returned by get_messages. Images are returned directly; other files return metadata.
Search local Messages history by text.
Send text and/or one attachment through Messages.app to an existing chat, canonical E.164 phone number, or email address.
Wait a bounded time for the next incoming non-reaction message in one chat. This does not keep a completed Codex task alive.
No batch variants for multi-call patterns. Agents calling send_message in a loop to send to multiple recipients waste tokens and latency. A send_message_batch tool would improve efficiency.
Destructive operations (send_message, react_to_latest) lack confirmation/dry-run pattern. Agents can send unintended messages or reactions without a safety gate.