iMessage MCP
Allows reading and sending iMessages from the local Messages database on macOS.
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 MCPsend a text to my wife that I'm on my way"
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
An MCP server that reads the local iMessage database and sends messages through Messages.app on macOS.
It runs over stdio for local use and over HTTP for remote use, so a phone or tablet can reach the same server that the laptop uses. That is the point of the project: the desktop-only iMessage integrations work well, but the desktop is the wrong place — the messages worth acting on arrive while you are away from it.
Status
Early. The read layer is being built; the HTTP transport, auth, and deployment
are not written yet. See docs/scope.md for the design, the measurements behind
it, and what is deliberately deferred.
Related MCP server: multimodal-imessage-mcp
Requirements
macOS, with Messages signed in
Python 3.12+ and uv
Full Disk Access for the Python interpreter, to read
~/Library/Messages/chat.db
Sending additionally needs permission to control Messages, which macOS prompts for the first time a message is sent.
Development
uv sync --extra test
uv run pytestThe test suite is offline and runs against a synthetic database built from Apple's schema. It never opens the real one, so it works on a machine that has never sent an iMessage.
License
MIT
Available Tools
7 toolsget_attachmentsA
List attachment metadata: name, type, size, direction and date.
The files themselves are not read, so this says what was sent, not what is in it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of attachments to return (default: 20) | |
| offset | No | Number of attachments to skip from the start (default: 0) | |
| chat_guid | No | Restrict to one conversation (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and it does disclose a key behavioral trait: the tool does not read file contents, only metadata. It also lists the metadata fields returned. It does not mention ordering, authentication, or rate limits, but the most important behavior is clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the action and output fields, followed by an important caveat. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only metadata-listing tool with three optional parameters and no output schema, the description is adequate: it names the output fields and clarifies the tool does not expose file content. It could be slightly richer by noting ordering or pagination behavior, but those are partly covered by the schema defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter details in the description. The description adds no parameter-specific semantics; it only describes the output fields, which is relevant but not needed to understand limit, offset, or chat_guid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and names the exact resource ('attachment metadata') plus the fields returned (name, type, size, direction, date). This clearly distinguishes it from sibling tools focused on chats, messages, and participants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this to see attachment metadata, not file contents. The caveat 'files themselves are not read' implies when to choose this tool over content-oriented alternatives, though it does not explicitly name a sibling tool or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesA
Read messages from one conversation, newest first.
Tapbacks and system events such as group renames are excluded: they are stored as messages but are not things anybody said.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to return (default: 50) | |
| offset | No | Number of messages to skip from the start (default: 0) | |
| chat_guid | Yes | The conversation's guid, from list_chats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds transparency beyond the schema by noting that tapbacks and system events are excluded. With no annotations, this is important behavioral context. It could go further (e.g., pagination behavior, rate limits), but the key exception is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and no wasted words. The exclusion note is valuable and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple with 3 parameters and full schema coverage. The description covers the main behavior and a key exception. It lacks explicit mention of return format, but that is not required given the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds no additional parameter meaning beyond what is in the schema. The baseline of 3 is appropriate because the schema fully documents parameters, though the description does not enhance their semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads messages from a conversation, newest first. It does not explicitly differentiate from siblings but is unambiguous about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving messages from a specific conversation and excludes tapbacks and system events. It does not explicitly mention alternatives, but the exclusion clarifies scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_participantsB
List who is in a conversation, with their handles and service.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_guid | Yes | The conversation's guid, from list_chats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool lists participants, but it doesn't disclose any behavioral traits such as whether it's read-only, if it requires specific permissions, or if it returns all participants or only some. For a read-like operation, it's missing details about the return format or any limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded. It states the action and the key output (handles and service) without any fluff. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is adequate but not complete. It doesn't mention what the output looks like beyond 'handles and service', and it doesn't provide any context about the conversation scope or any edge cases. For a simple tool, it's acceptable, but it could be more informative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, and the only parameter chat_guid is described as 'The conversation's guid, from list_chats'. The description adds the context that it's from list_chats, which is helpful. Since the schema already covers the parameter, the description doesn't need to add much, but it does provide a useful reference to the source of the guid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists participants in a conversation with their handles and service. It specifies the resource (conversation) and the action (list), and the mention of 'handles and service' adds detail. It doesn't explicitly distinguish from siblings, but the purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to know who is in a conversation, but it doesn't explicitly state when to use this vs alternatives. The sibling tools like list_chats and get_messages are related, but no exclusions or alternatives are mentioned. The context is clear but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unreadA
List received messages that have not been read yet, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses that it lists unread messages and orders them newest first, which is basic behavior. It does not disclose potential side effects (likely none for a read operation), or details about pagination, but given the simple nature, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence that conveys the action, resource, and ordering. No unnecessary words. Front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one parameter and no output schema, the description is adequate. It doesn't explain the return format or fields, but the tool is simple and the schema covers the input. Given the low complexity, this is acceptable, though slightly more detail about the output could be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers 100% of the parameter (limit) with a clear explanation of default value. The description doesn't add extra information about the parameter, but the schema already provides sufficient meaning, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List received messages'), the specific resource ('not been read yet'), and the ordering ('newest first'). It distinguishes from siblings like get_messages (which likely returns all messages) and search_messages (which filters by query).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when needing unread messages) and explicitly states the ordering. However, it doesn't explicitly mention alternatives or when not to use it, but the purpose is clear enough to infer the use case from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsA
List conversations, most recently active first.
Each entry carries the chat_guid needed by the other tools, the other participant's name where it is known, how many unread messages it holds, and a preview of the last message.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of conversations to return (default: 20) | |
| offset | No | Number of conversations to skip from the start (default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description is the only source of behavioral context. It does disclose useful behavior such as recency-based ordering and that entries contain metadata rather than full messages, but it does not explicitly state that this is a read-only operation, whether the result is paginated, or any constraints on the returned preview. The verbal 'List' start implies non-mutating behavior, but it is not fully explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the operation and ordering, and the second sentence explains exactly what each result entry contains. There is no filler or unnecessary repetition of the schema names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two optional parameters and no output schema, the description is nearly sufficient: it names the most important result fields and clarifies that chat_guid links to the other tools. It does not describe the top-level response envelope or pagination behavior, but the schema and list-like nature of the tool keep those gaps minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (limit and offset) already have clear descriptions in the schema. The tool description does not add extra meaning to those parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List conversations') and adds the sorting key ('most recently active first'). It also distinguishes itself from sibling tools by enumerating what each returned entry contains, such as the chat_guid and unread message count, which frames this as the chat-overview tool rather than a message-level or search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the main usage context clear: list chats to get chat_guid and summary data that other tools need. It does not explicitly state exclusions or when to prefer a sibling tool instead, but the connection to chat_guid, participants, unread counts, and last-message preview provides a strong sense of when this should be the first tool invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesA
Search message text across conversations, case-insensitively.
The entire history is searched, not a recent window, so a total of 0 means the text is genuinely not there. The total is a true count of matches; limit bounds only how many are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matches to return (default: 20) | |
| query | Yes | Text to look for | |
| offset | No | Number of matches to skip from the start (default: 0) | |
| chat_guid | No | Restrict the search to one conversation (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that search is case-insensitive, covers full history, and that 'total' is an exact count while 'limit' only affects returned results. This is valuable context that helps the agent interpret results correctly. No contradiction with annotations since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no wasted words. It front-loads the core purpose and immediately adds critical behavioral details about search scope and result semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a read-only search operation, and the description covers the key behavioral aspects: case sensitivity, scope, and result counting. With no output schema, it could mention the structure of returns, but the description is adequate for a search tool with these parameters. Minor gap is lack of detail on return format or sorting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema. The description adds some value by clarifying the behavior of 'limit' and 'total', but it doesn't explain the meaning of 'offset' or 'chat_guid' beyond what the schema already states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool searches message text across conversations with case-insensitivity. It distinguishes from siblings like list_chats and get_messages by emphasizing full-text search across all conversations, though it doesn't directly name a sibling as an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: searching is case-insensitive and covers the entire history, meaning a zero result is definitive. However, it doesn't explicitly state when to use this tool versus alternatives like get_messages or list_chats, which are for reading specific messages or listing conversations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageA
Send a message to an existing conversation.
Only conversations that already exist can be addressed, by the chat_guid from list_chats. There is no way to start a new conversation, so this cannot reach somebody who has not been talked to before.
A sent message cannot be recalled.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The message to send | |
| chat_guid | Yes | The conversation's guid, from list_chats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals two critical constraints: messages cannot be recalled and new conversations cannot be initiated. This adds meaningful context beyond the schema, though it does not mention error states, authentication, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the core action, the second explains the existential constraint, and the third notes irreversibility. No filler or redundant phrasing; the structure is front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters and no output schema, the description covers the essential operational context: what it does, the prerequisite for existing conversations, and the irreversible nature of sending. It omits potential error handling or side effects, but these are not critical given the tool's simplicity and the complete parameter coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already offers 100% parameter coverage with concise descriptions for both text and chat_guid. The description adds value by reinforcing that chat_guid must come from list_chats and be an existing conversation, giving the agent a clearer semantic understanding of the parameter's provenance and validity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Send a message to an existing conversation,' clearly identifying the verb (send), resource (message), and scope (existing conversation). This distinguishes it from sibling read-only tools like get_messages and search_messages, which focus on retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states that only existing conversations can be addressed and that there is no way to start a new conversation, providing clear when-to-use and when-not-to-use guidance. It also references list_chats as the source for chat_guid, implying the correct workflow, though it does not explicitly contrast with alternative send-related tools (none exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
v0.1.0- First observed
get_attachments - First observed
get_messages - First observed
get_participants - First observed
get_unread - First observed
list_chats - First observed
search_messages - First observed
send_message
TDQS
Each tool targets a distinct aspect of iMessage: listing chats, reading messages, searching, participants, unread, attachments, and sending. There is no overlap in purpose, and the descriptions clarify boundaries (e.g., get_messages excludes tapbacks, get_attachments only lists metadata).
All tool names follow a consistent verb_noun pattern: list_chats, get_messages, search_messages, get_participants, get_unread, get_attachments, send_message. The verbs are uniform (list/get/search/send) and nouns are clear, making the set predictable.
Seven tools is well-scoped for an iMessage server: it covers the core read and send operations without redundancy. Each tool earns its place, and the count is within the ideal 3-15 range.
The surface covers the main iMessage workflows: listing chats, reading/searching messages, checking unread, viewing participants and attachments, and sending. The only notable gap is the inability to start a new conversation, which is explicitly documented and may be a platform limitation, but it is a real dead end for reaching new contacts.
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 Connectors
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
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.97510MIT
- AlicenseBqualityBmaintenanceEnables reading, searching, sending iMessages, viewing image attachments, and managing conversations, with full support for modern macOS attributedBody parsing.141MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for reading and sending iMessages on macOS. Exposes iMessage history and send capabilities through tools like list_conversations and send_imessage.16MIT
- FlicenseNot gradedqualityCmaintenanceLocal MCP server for macOS Messages + Contacts: send messages, read chat history, wait for replies, and manage Contacts.app entries.1-
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/duanefields/imessage-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server