AI-optimized MCP server for iMessage on macOS. Read, search, and send messages.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP (Model Context Protocol) server for iMessage. It lets AI agents read, search, and send your messages, resolving phone numbers to contact names along the way.
Written in Swift. One binary, no runtime dependencies.
The project now ships a single Swift implementation:
The old Python package has been retired and removed from the repository.
Everything current lives under swift/.
Most iMessage tools expose raw database structures, requiring 3-5 tool calls per user intent. This MCP provides intent-aligned tools:
The tools work best when an agent uses them as short workflows instead of isolated one-off calls.
Agents should treat chat_id values like chat123 as internal handles for tool calls and exact sends. When explaining results to a person, use the returned chat name, group name, or participant-derived label instead of saying "Chat 123."
Use this when the person matters more than the exact thread id.
Use this when you know the topic but not where it was discussed.
Use this to surface unread threads and active conversations after a broad chat-list sweep.
Use list_attachments to find the message where files were shared. It returns exact attachment ids and says whether each file is on disk, so you know before you fetch.
For sensitive sends, prefer resolving the exact chat first and then using chat_id so the message lands in the intended thread.
For local development, advanced setup, and the signed install workflow, see:
iMessage Max is a dual-era MCP server. Both transports (stdio and HTTP) serve both eras concurrently, selected per request:
| Era | Revisions | Lifecycle | Selected by |
|---|---|---|---|
| Modern | 2026-07-28 | Stateless, per-request _meta | io.modelcontextprotocol/protocolVersion in the request _meta (or server/discover) |
| Legacy | 2025-03-26 β¦ 2025-11-25 | initialize + session | initialize request / Mcp-Session-Id |
Modern clients probe with server/discover and send the required
MCP-Protocol-Version, Mcp-Method, and (for tools/call) Mcp-Name
headers over HTTP. Legacy clients keep working unchanged. No client
migration is required, and legacy support stays as long as real clients
depend on it.
The server implements tools only. It has no prompts, resources,
completion, subscriptions, tasks, or MRTR flows, on purpose. The official
conformance suite runs against both eras with the documented baseline in
docs/conformance-baseline.yml.
iMessage Max ships icons for the main MCP protocol surface and the client packaging surfaces that use their own metadata:
2025-11-25 initialize responses include PNG serverInfo.icons..codex-plugin/plugin.json and uses
assets/codex/icon.png plus assets/codex/logo.png.mcpb/manifest.json and uses PNG
assets under mcpb/assets/.The committed PNG source set is under assets/icons/ at 16x16, 32x32,
64x64, 128x128, 256x256, and 512x512.
Required to read ~/Library/Messages/chat.db:
For Homebrew installs, the binary is at /opt/homebrew/Cellar/imessage-max/VERSION/bin/imessage-max (not the symlink at /opt/homebrew/bin/). Find it with:
For source builds, add .build/release/imessage-max from your clone directory.
After changing the grant, relaunch the server; macOS applies Full Disk Access only to processes started after the change.
In the file picker, press β+Shift+G and paste the path to go straight there.
Required to resolve phone numbers to names. The server only asks for access when it is started from a terminal; launchd and MCP clients start it headless, and a headless process never prompts. Grant access once with imessage-max --request-contacts-access from a terminal, then restart the service. --contacts-policy request|skip (or IMESSAGE_MAX_CONTACTS_POLICY) overrides the terminal detection.
System Settings β Privacy & Security β Contacts β add imessage-max is the manual alternative.
Add imessage-max to your MCP client's server configuration.
Many MCP clients use a JSON structure like this:
For Homebrew:
For source builds:
If your client uses a different config format, point it at the same binary path.
After saving the config, reconnect or restart your MCP client. The server should appear in the available tools, and you can verify the connection with diagnose.
Find chats by participants, name, or recent content.
By default, chats Messages.app has filtered into Unknown Senders or Junk are hidden. The response carries filtered_hidden, the number of chats the filter removed from this view; pass include_filtered=True to see them.
Inspect a known thread without opening the full conversation.
Retrieve messages with flexible filtering. Returns metadata for media. Explicit chat_id lookups are never filtered.
has filters by content type (links, attachments, images). links includes link messages Messages stores as URL preview balloons (the common case on macOS 26).
Group system messages (renames, members added or removed, someone
leaving) come back with text: null and an event object:
{"type": "rename", "title": "Trip"}, {"type": "participant_added", "participant": "Alice"},
{"type": "participant_removed", ...}, {"type": "left"}, or
{"type": "other", "item_type": N} for event kinds the server does not
name. Chat previews describe the same events in words
("renamed the group to Trip").
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/imessage-max)<a href="https://allmcps.com/mcp/imessage-max"><img src="https://allmcps.com/api/badge/imessage-max?style=directory" alt="Imessage Max on AllMCPs" /></a>