Fuzzy matching plus the from, after and context parameters is what separates this from scrolling: you can search on a fragment, restrict it to one sender, and get the surrounding messages back with the hit. get_message_stats is the honest companion to that — it reports the count, date range and contacts in the index, so an empty result can be told apart from a gap in coverage. Every tool reads; nothing in the list sends a message or edits one.
A read-only search layer over an index of the local Apple Messages history, covering both iMessage and SMS.
- Fuzzy search across iMessage and SMS by text, by sender, or both, with a context window around each hit and an after date filter
- The most recent messages across every conversation, for the question of who has been in touch
- Contacts ranked by recent messaging activity, with message counts and the date of the last message
- Conversation threads listed with counts and a preview of the last message, sorted by recency
- A full thread with one contact in chronological order
- Statistics on the indexed set: message count, date range and contacts covered
The Apple Messages history on the machine the server runs on, already indexed. No account and no key are configured, and the tools reach nothing off the machine.
One command — npx -y @cardmagic/messages --mcp
