imessage-mcp
Allows reading, searching, and sending iMessages and SMS messages, as well as managing attachments and conversations.
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-mcpshow my last 5 conversations"
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 connects Claude Desktop to iMessage on macOS — read conversations, search messages, send texts, and access attachments.
Prerequisites
macOS
Node.js 18+
Full Disk Access granted to Claude Desktop (required to read
~/Library/Messages/chat.db)
Granting Full Disk Access
Open System Settings → Privacy & Security → Full Disk Access
Add Claude to the list and enable it
Restart Claude Desktop
Related MCP server: iMessage MCP Server
Installation
1. Add to Claude Desktop config
Open ~/Library/Application Support/Claude/claude_desktop_config.json and add:
{
"mcpServers": {
"imessage": {
"command": "npx",
"args": ["-y", "@kamk95/imessage-mcp"]
}
}
}2. Restart Claude Desktop
Manual install (alternative)
If you prefer to run from source:
git clone https://github.com/kamrenkennedy/imessage-mcp.git
cd imessage-mcp
npm installThen use this config instead:
{
"mcpServers": {
"imessage": {
"command": "node",
"args": ["/absolute/path/to/imessage-mcp/index.js"]
}
}
}Tools
get_conversations
List recent iMessage conversations.
Parameter | Type | Description |
| number | Max conversations to return (default: 20) |
get_messages
Get messages from a specific conversation.
Parameter | Type | Description |
| string | Required. Chat ID from |
| number | Max messages to return (default: 50) |
search_messages
Search across all messages by text.
Parameter | Type | Description |
| string | Required. Text to search for |
| number | Max results to return (default: 20) |
get_chat_participants
Get the participants in a conversation.
Parameter | Type | Description |
| string | Required. Chat ID from |
send_message
Send an iMessage or SMS.
Parameter | Type | Description |
| string | Required. Phone number, email, or contact name |
| string | Required. Text to send |
get_attachments
List attachments from a conversation.
Parameter | Type | Description |
| string | Required. Chat ID from |
| number | Max attachments to return (default: 20) |
save_attachment
Save an attachment from a message to disk.
Parameter | Type | Description |
| string | Required. Attachment ID from |
| string | Required. Full path where the file should be saved |
Notes
Messages are read directly from
~/Library/Messages/chat.dbusing SQLite — no AppleScript required for readsSending uses AppleScript via
osascriptContact names are resolved from AddressBook automatically
US phone numbers are normalized (leading 1 stripped from 11-digit numbers)
Available Tools
7 toolsget_attachmentsA
Get attachments (images, files, links) from a conversation. Filter by mime type (e.g. 'image' for photos, 'application/pdf' for PDFs). Returns file paths that can be read or saved.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max attachments to return (default 20) | |
| contact | No | Contact name, phone number, or email | |
| chat_guid | No | Chat GUID for direct lookup | |
| mime_filter | No | Filter by mime type prefix: 'image' for photos, 'video' for videos, 'application/pdf' for PDFs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It reveals that the tool returns file paths that can be read or saved, and that filtering by mime type is supported. This adds meaningful context beyond a bare 'get attachments' statement, though it does not detail pagination, error conditions, or the relationship between contact and chat_guid.
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 three concise sentences, each adding value: the primary action, the filtering capability, and the return format. There is no redundant or filler content.
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 tool with 4 parameters, no output schema, and no annotations, the description provides a solid overview of purpose, filtering, and return type. It could be improved by explaining how to specify a conversation (contact vs chat_guid) and mentioning the default limit, but overall it is sufficient for an agent to understand the tool's capabilities.
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 parameter descriptions already explain each field. The tool description adds little beyond repeating the mime_filter example and mentions return behavior (file paths). It does not explain the distinction between contact and chat_guid or the default limit, but the schema covers these adequately.
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 it retrieves attachments (images, files, links) from a conversation, distinguishing it from sibling tools like get_messages and get_conversations. It uses a specific verb and resource (get attachments from a conversation) and gives concrete examples of attachment types.
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 attachments and provides filter examples, but it does not explicitly mention when not to use it or name alternatives like get_messages for text content. The context is clear enough for an agent to select this tool when attachments are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chat_participantsA
Get participants of a chat with resolved contact names. Useful for group chats.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Group chat name to search for | |
| chat_id | No | Chat ROWID from get_conversations | |
| chat_guid | No | Chat GUID (e.g. 'any;+;chat123...') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It indicates a read-only operation ('Get') and mentions a specific behavior (resolving contact names), but it does not disclose error behavior, authentication needs, or return format details. It adds some value beyond the tool name, but leaves ambiguity.
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 short sentences with no redundant words. Every phrase earns its place: it states what the tool does, the output enrichment, and a typical use case. Highly scannable and efficient.
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 schema shows all three parameters as optional, but the description does not clarify that at least one identifier is needed to select a chat. Since there is no output schema, the description should hint at the return structure; it says 'resolved contact names' but not whether it returns an array, an object, or how empty results are handled. The description is adequate for a simple getter but leaves this operational gap.
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 includes descriptions for all three parameters (100% coverage), so the description does not need to repeat them. The schema provides clear meanings for 'name', 'chat_id', and 'chat_guid' (with example), so the description adds no extra parameter-level detail. 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 a specific verb ('Get') and resource ('participants of a chat'), and the added detail 'with resolved contact names' clarifies the output. It also explicitly mentions 'useful for group chats,' distinguishing it from sibling tools about conversations, messages, and attachments.
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 gives clear usage context with 'Useful for group chats,' indicating when this tool is appropriate. However, it does not explicitly name alternatives or exclude other scenarios, but the provided context is sufficient for basic selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationsA
List recent conversations (individual and group) with resolved contact names. Shows group chats with participant counts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of conversations to return (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses that conversations include resolved contact names and group participant counts, which adds useful output behavior. However, it does not mention scope (e.g., current user), ordering, or any rate limits, leaving some behavioral uncertainty.
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 short sentences, front-loaded with the main action. Every word adds value, no redundancy.
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 one optional parameter and no output schema, the description covers the key features (individual/group, contact names, participant counts). However, it omits details like ordering or scope, so it's not fully complete.
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 single parameter 'limit' is fully documented in the schema with a default of 20. The description does not add additional meaning, which is appropriate given the 100% schema coverage.
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 ('List') and resource ('conversations'), and distinguishes from siblings by noting individual/group chats, resolved contact names, and participant counts. This clearly sets it apart from get_messages and other sibling tools.
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 this tool is for displaying recent conversations, but it does not explicitly mention when to prefer it over siblings like get_messages or search_messages. There are no exclusions or alternative recommendations, so it provides clear context without explicit selection guidance.
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 a conversation. Search by contact name, phone number, email, or group name. Shows resolved sender names in group chats and includes attachment info.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of messages to return (default 50) | |
| contact | Yes | Contact name, phone number, email, or group chat name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds valuable behavioral details: 'Shows resolved sender names in group chats' and 'includes attachment info', disclosing output nuances beyond a simple read. It does not cover pagination, error handling, or auth, but for a read-only tool this is a reasonable disclosure.
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 core action immediately. Every sentence earns its place, adding search identifiers and output features without redundancy.
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 tool with two parameters and no output schema, the description provides sufficient context: identifiers, resolved sender names, and attachment info. It lacks explicit pagination/limit discussion, but the schema covers that, and the tool is straightforward.
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 the description essentially repeats the schema's contact description ('Contact name, phone number, email, or group chat name' appears in both). The limit parameter is not elaborated in the description, so it adds no new meaning beyond the schema baseline.
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 'Read messages from a conversation' with a specific verb and resource, and it distinguishes itself from siblings like search_messages (which searches across conversations) and get_conversations (which lists conversations). It also specifies search identifiers (contact name, phone number, email, or group name), making the scope unambiguous.
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 reading messages from a specific conversation identified by contact/group, but it does not explicitly exclude alternatives like search_messages or get_attachments. There is clear context for when to use this tool, but no explicit when-not-to-use statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_attachmentA
Save/copy a message attachment to a destination (defaults to Desktop). Use after get_attachments to save files.
| Name | Required | Description | Default |
|---|---|---|---|
| destination | No | Destination path or directory (defaults to ~/Desktop) | |
| source_path | Yes | Full path to the attachment file (from get_attachments results) |
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 notes the default destination (~/Desktop) but fails to disclose potential side effects like overwriting existing files, directory creation, or required permissions. This is a significant gap for a file-saving operation.
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 immediately conveys the action and key default. It contains no redundant words and is 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 tool with two parameters and no nested objects, the description provides enough context: it states the purpose, the default destination, and the prerequisite tool. It does not explain return values, but the absence of an output schema makes this less critical. It could mention what happens on success/failure, but overall it is sufficiently complete for the tool's simplicity.
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 covers both parameters with 100% description coverage, including the source_path origin and destination default. The description adds little beyond restating these facts ('defaults to Desktop' and 'from get_attachments results'), so it meets the baseline without enhancing meaning.
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 ('Save/copy') and clearly identifies the resource ('a message attachment') and destination. It distinguishes from sibling tools like get_attachments, which retrieves rather than saves.
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 by stating 'Use after get_attachments to save files,' which gives sequencing. However, it does not explicitly mention when not to use or name alternative tools beyond the prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesA
Search all messages for a keyword or phrase. Shows resolved contact names and attachment info.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 30) | |
| query | Yes | Text to search for |
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 discloses useful return context (resolved contact names and attachment info), but lacks details on result ordering, scope limitations, or whether attachment content is searchable. It covers basics without being thorough.
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, front-loaded sentence with no wasted words. It efficiently conveys the purpose and key output details.
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 (2 parameters, no output schema), the description covers the essential purpose and highlights return fields. It lacks details on pagination or ordering, but for a search tool this is largely sufficient.
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% with descriptions for both query and limit. The description adds minimal extra meaning ('keyword or phrase' vs 'Text to search for'), so the baseline of 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 ('Search') and the resource ('all messages') with a specific scope ('keyword or phrase'). It distinguishes itself from sibling tools like get_messages (which lists messages) and get_attachments (which retrieves attachments) by emphasizing cross-message search.
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 ('Search all messages') but does not explicitly state when to prefer this tool over alternatives like get_messages or get_attachments. No when-not-to-use information or alternative tool mentions are provided.
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 (iMessage, SMS, or RCS) to a contact or group chat. Accepts contact names, phone numbers, emails, or chat GUIDs. Can also send file attachments.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Optional array of absolute file paths to send as attachments (images, PDFs, etc.) | |
| message | Yes | Message text to send | |
| recipient | Yes | Contact name, phone number, email, group name, or chat GUID (e.g. 'any;+;chat123...') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It covers recipient resolution and attachment support, but omits important details such as message irreversibility, delivery failures, or permission requirements. This is a significant gap for a send operation.
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 concise sentences, front-loaded with the primary action and no filler. Every sentence contributes meaningful information.
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 input side is well covered, but the tool has no output schema and the description does not explain return values or error behavior. For a send tool, knowing what the response contains (e.g., success status, message ID) is important, leaving a moderate gap.
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 describes all three parameters at 100% coverage. The description adds minimal value by rephrasing the recipient types and mentioning file attachments, which the schema already documents. 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 identifies the action ('Send a message') and the resource (contact or group chat), and specifies the message channels (iMessage, SMS, RCS). This clearly distinguishes it from the read-oriented sibling tools like get_messages and search_messages.
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 for when to use the tool: to send messages or file attachments to contacts/groups. It does not explicitly mention alternatives or exclusions, but the sibling tools are all retrieval operations, making the send functionality self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct aspect of messaging: listing conversations, reading messages, searching, sending, viewing participants, and handling attachments. No two tools have overlapping purposes, making selection unambiguous.
All tools follow a consistent verb_noun naming pattern (e.g., get_conversations, send_message, search_messages), making the API predictable and easy to navigate.
With 7 tools, the server is well-scoped for an iMessage interface, covering the core workflows without unnecessary bloat or insufficient functionality.
The tool set covers the essential lifecycle of messaging: listing, reading, searching, sending, and managing attachments. No critical operations are missing for the stated purpose.
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
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Related MCP Servers
- AlicenseBqualityDmaintenanceA local server that enables Claude Desktop to interact with your macOS Contacts and Messages apps, allowing you to search contacts and send iMessages through natural language commands.21629MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to send and read iMessages on macOS, with smart contact lookup, message history retrieval, and cross-conversation search using natural language commands.5MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to read iMessage history and send messages on macOS. Supports conversation listing, message search with keyword and semantic modes, contact lookup, and sending messages to existing conversations.1311MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to send and read iMessages on macOS, with human approval required for sending and no auto-replies.31Apache 2.0
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/kamrenkennedy/imessage-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server