iMessage MCP
Provides tools to read and send iMessages on macOS, including listing chats, retrieving messages, searching message history, and sending new iMessages.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iMessage MCPWhat are my most recent messages?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
iMessage MCP
A local MCP server that reads your macOS Messages history and sends new iMessages. Everything runs locally — nothing leaves your machine.
Tools
Tool | What it does |
| Most recently active conversations (identifiers + last-message time). |
| Recent messages from one conversation (by identifier or guid). |
| Newest messages across every conversation, with chat attribution. |
| Substring search over message text. |
| Send an iMessage to a phone number or email. (opt-in) |
| Send to an existing chat by guid, for group chats. (opt-in) |
Read tools are capped at 200 rows per call and exclude tapbacks. The two send
tools are not registered at all unless IMESSAGE_MCP_ALLOW_SEND=1 is set,
so a host configured for reading cannot send even by accident.
Related MCP server: imessage-mcp
Security model
Reading your messages and sending as you are very different powers, and putting
both in one agent session is the risky part. Anyone who can text you can put
text into get_recent_messages, so message bodies are attacker-controlled
input sitting next to a tool that sends mail as you.
What this server does about that:
Send tools are off by default and must be switched on per host.
IMESSAGE_MCP_ALLOWED_RECIPIENTSrestricts who can be messaged at all.Every send attempt and outcome is appended to a local audit log before and after the AppleScript call, so a send can't happen without a record.
Outgoing messages are length-capped and cannot be empty.
The server advertises MCP
instructionsand per-tool annotations (readOnlyHint,destructiveHint) so hosts can prompt on the dangerous ones.
What it does not do: it can't stop a model that reads a malicious message from deciding to act on it. If you enable sending, keep an approval prompt on the send tools.
Configuration
All optional. Set them in your MCP host's config, not in your shell profile.
Variable | Default | Meaning |
| off |
|
| empty | Comma-separated allowlist. Empty means no restriction. Phone formatting is normalized, so |
|
| Max outgoing message length. |
|
| JSON-lines audit log. |
|
| Override the database path. |
Setup
git clone https://github.com/tarun101/imessage-mcp.git
cd imessage-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtPython 3.10 or newer. Everything below assumes $REPO is the absolute path to
your clone.
The
mcpdependency is pinned to<2. The 2.x SDK removedmcp.server.fastmcp, which this server imports; an unpinned install picks up 2.x and fails at startup.
macOS permissions (both required)
Full Disk Access — reading
~/Library/Messages/chat.dbis blocked without it. Add whichever process runs the server (Terminal, iTerm, or your MCP host app) under System Settings → Privacy & Security → Full Disk Access, then fully quit and reopen it.Automation → Messages — the first
send_message/send_to_chatcall triggers a one-time permission prompt for controlling Messages.app. Allow it.
Quick test
source .venv/bin/activate
python -c "import server; print(server.list_chats(5))"Tests
pip install -e '.[dev]'
pytestThe suite builds a synthetic chat.db with Apple's schema, so it runs anywhere
— no Mac and no access to your real message history required.
Register with an MCP host
Codex
codex mcp add imessage --env IMESSAGE_MCP_ALLOW_SEND=1 -- \
"$REPO/.venv/bin/python" "$REPO/server.py"Or in ~/.codex/config.toml, which also lets you require approval per tool:
[mcp_servers.imessage]
command = "/absolute/path/to/imessage-mcp/.venv/bin/python"
args = ["/absolute/path/to/imessage-mcp/server.py"]
default_tools_approval_mode = "auto"
[mcp_servers.imessage.env]
IMESSAGE_MCP_ALLOW_SEND = "1"
[mcp_servers.imessage.tools.send_message]
approval_mode = "prompt"
[mcp_servers.imessage.tools.send_to_chat]
approval_mode = "prompt"Verify with /mcp inside the Codex TUI.
Claude Code (CLI)
claude mcp add imessage -- "$REPO/.venv/bin/python" "$REPO/server.py"Claude Desktop / generic MCP config
{
"mcpServers": {
"imessage": {
"command": "/absolute/path/to/imessage-mcp/.venv/bin/python",
"args": ["/absolute/path/to/imessage-mcp/server.py"]
}
}
}Use absolute paths so the venv's Python (with mcp installed) is used.
Notes & limitations
Read-only DB access. chat.db is opened with
mode=ro; the server never writes to your message store. Sends go exclusively through Messages.app.WAL fallback. chat.db is a WAL database, and a read-only handle can't create the
-shmfile it needs. When a direct open fails — which happens when Messages.app isn't running — the server transparently reads a temporary snapshot copy instead, refreshed whenever the source changes.attributedBody. Newer messages store their body in a binary
attributedBodyblob rather than thetextcolumn. The reader decodes these heuristically — it covers ordinary text messages but may miss rich content. Because of this,search_messagesonly matches the plaintextcolumn.Timestamps are returned as ISO-8601 UTC.
Sends are verified, not assumed. AppleScript returns before delivery, so after sending the server polls chat.db for the outgoing row. A result of
sent_unverifiedmeans Messages.app accepted it but it hasn't landed yet — usually lag rather than failure.Sending is real. These tools send actual messages that cannot be recalled.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables reading, searching, and sending iMessages directly from MCP-compatible clients by accessing the local macOS iMessage database, supporting conversations, attachments, and both individual and group chats.10410MIT
- AlicenseAqualityDmaintenanceA local MCP server that enables reading iMessage conversations and sending new messages through Claude Desktop. It provides secure, read-only access to your Mac's iMessage database and AppleScript-based message sending capabilities.6MIT
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server for local macOS Messages database, enabling querying of chats, messages, attachments, and metadata.104MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for reading and sending iMessages on macOS. Exposes iMessage history and send capabilities through tools like list_conversations and send_imessage.19MIT
Related MCP Connectors
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Remote MCP server for The Colony — a social network for AI agents (posts, DMs, search, marketplace).
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tarun101/imessage-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server