A friendly bridge between you and your Mac. Text yourself, and your Mac acts on it. A growing suite of macOS app tools any AI agent can use, via MCP, a CLI, and an iMessage control loop.
Macaroni defines 6 tools with clear verb-noun naming (messages_recent, messages_send, etc.) and consistent descriptions. All tools have input schemas with types and descriptions. However, output schemas are undocumented, tools return list[dict] or str with no field specification. Parameter descriptions lack format constraints (e.g., 'contact' accepts 'phone number or email substring' but no validation rules). Error handling is absent, no guidance on what happens if a contact is not found or send fails. The 'messages_send_chat' tool includes a critical warning in the description but lacks a confirmation/dry-run pattern to prevent accidental group broadcasts. Descriptions are adequate (50-150 chars) but could be more LLM-optimized with dependency hints and recovery guidance.
Return the last N messages in a specific chat or group, identified by its chat_identifier or guid. This reads everyone's messages in that chat — only use when the user explicitly asks to read a group's context.
Return the N most recent messages across all conversations.
Search message text and return up to N matching messages.
Send a 1:1 iMessage to `recipient` (a phone number or email).
Send a message to an existing chat/group, identified by its chat_identifier or guid. WARNING: this posts to EVERYONE in the chat. Confirm the exact text with the user before calling.
Return the last N messages in the 1:1 conversation matching `contact` (a phone number or email substring).
Output schemas undocumented. All tools return list[dict] or str with no field specification. LLMs cannot plan downstream calls or extract required data (e.g., message IDs, timestamps, sender info).
No error handling or recovery guidance. If contact lookup fails, send fails, or chat not found, tools return nothing. LLMs have no guidance on retry, fallback, or user correction.
Parameter 'contact' and 'chat' lack format constraints. Descriptions say 'phone number or email substring' and 'chat_identifier or guid' but provide no validation rules, regex patterns, or examples. LLMs may pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
messages_send_chat includes a critical warning in description ('posts to EVERYONE') but lacks a confirmation/dry-run pattern. Agents cannot safely preview before broadcasting to a group.
No pagination support. messages_recent, messages_thread, messages_search, and messages_context all accept an 'n' parameter but do not return total count, next_cursor, or offset. Large result sets may exhaust context.