mac-messages-mcp
The Mac Messages MCP server allows interaction with the macOS Messages app, enabling users to:
Retrieve Recent Messages: Fetch messages with optional filtering by contact or time range
Send Messages: Send to individuals (via phone number, email, or contact name) or group chats (using chat ID)
Find Contacts: Search for contacts by name using fuzzy matching
List Contacts: Retrieve available contacts from the address book
List Group Chats: Get available group chats in the Messages app
Diagnose Access Issues: Check for and troubleshoot database and AddressBook access problems
API Integration: Integrate with tools like Claude Desktop or Cursor for messaging workflows
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., "@mac-messages-mcpsend a message to Mom saying I'll be home by 7 PM"
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.
Mac Messages MCP
Use Claude, Codex, Cursor, VS Code, or any local MCP client to search, read, and send messages through the macOS Messages app.
Mac Messages MCP runs locally on your Mac. It opens the Messages and Contacts databases read-only, returns only the data a client asks for, and uses Messages.app automation only when the client explicitly calls the send tool.
This server is macOS-only. Reading messages requires Full Disk Access. Sending requires a Mac signed into Messages plus permission for the launching app to automate Messages.
What it can do
Read recent messages across all conversations or filter by contact or group chat
Fuzzy-search message text across a time window, including all available history
Find Contacts by approximate name and return send-ready phone numbers
List named group chats and use their chat IDs for reads or sends
Send iMessage, with SMS/RCS fallback for eligible phone recipients
Check whether a recipient appears reachable through iMessage before sending
Find attachments by date, sender, and MIME type
Return small images inline, convert HEIC images to PNG, or return a local path for larger and non-image files
Diagnose Messages and Contacts database permissions from inside the MCP client
Related MCP server: mac-messages-mcp
Quick start
1. Install uv
brew install uvConfirm that the launcher is available:
uvx --versionPython 3.10 or newer is required. uvx can provision a compatible Python and
installs Mac Messages MCP in an isolated environment, so you do not need to
create a virtual environment first.
2. Grant macOS permissions
Open System Settings → Privacy & Security → Full Disk Access and enable the app that will launch the MCP server:
Claude Desktop, Cursor, VS Code, or the ChatGPT desktop app when configured in that app
Terminal, iTerm2, Ghostty, or another terminal when using Claude Code or Codex CLI from that terminal
Quit and reopen the app after changing Full Disk Access. On the first contact lookup or send, macOS may separately ask for access to Contacts or permission to control Messages. Allow those prompts.
Also make sure Messages.app is open, signed in, and already able to send a normal message.
3. Add the server to your MCP client
The server command is the same everywhere:
uvx mac-messages-mcpChoose your client below.
Claude Desktop
Open Claude → Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"mac-messages": {
"command": "uvx",
"args": ["mac-messages-mcp"]
}
}
}Preserve any other servers already in claude_desktop_config.json, save the
file, and restart Claude Desktop.
Claude Desktop also supports installable .mcpb extensions. See
Build the Claude Desktop extension if you
want to package this repository as one.
Claude Code
Add it once at user scope so it is available in every project:
claude mcp add --transport stdio --scope user mac-messages -- uvx mac-messages-mcpVerify it:
claude mcp get mac-messagesInside Claude Code, run /mcp to inspect the connection and tools.
Codex CLI, Codex IDE extension, and ChatGPT desktop app
Codex clients on the same Mac share MCP configuration. Add the server with:
codex mcp add mac-messages -- uvx mac-messages-mcpThen verify it:
codex mcp listYou can also add it directly to ~/.codex/config.toml:
[mcp_servers.mac-messages]
command = "uvx"
args = ["mac-messages-mcp"]Restart the desktop app or IDE extension after changing the configuration. In
Codex CLI, use /mcp to view the active server.
Cursor
Or open Cursor Settings → Tools & MCP → New MCP Server and use:
{
"mcpServers": {
"mac-messages": {
"command": "uvx",
"args": ["mac-messages-mcp"]
}
}
}Restart the server from Cursor's MCP settings after saving.
VS Code / GitHub Copilot
Open the Command Palette and run MCP: Add Server. Choose Command
(stdio), enter uvx as the command, add mac-messages-mcp as the argument,
and install it globally.
Or add it from a terminal:
code --add-mcp '{"name":"mac-messages","command":"uvx","args":["mac-messages-mcp"]}'The equivalent user or workspace mcp.json entry is:
{
"servers": {
"mac-messages": {
"type": "stdio",
"command": "uvx",
"args": ["mac-messages-mcp"]
}
}
}VS Code uses a top-levelservers object. Claude Desktop and Cursor
use mcpServers.
Other stdio MCP clients
Use this generic server definition:
{
"command": "uvx",
"args": ["mac-messages-mcp"]
}If a GUI client reports that uvx cannot be found, run which uvx in Terminal
and replace "uvx" with the returned absolute path. Homebrew commonly installs
it at /opt/homebrew/bin/uvx on Apple silicon and /usr/local/bin/uvx on Intel
Macs.
4. Verify the connection
Ask your client to call tool_check_db_access, then tool_check_addressbook.
Once both succeed, try prompts such as:
Show me my messages from the last two hours.Find messages from Carter about dinner in the last 30 days.Find PDFs sent to me this month, but do not open any yet.Find Jordan in my contacts and draft a message saying I am running 10 minutes
late. Do not send it until I confirm.The first uvx launch can take longer while it downloads and caches Python
dependencies.
Available tools
Tool | Purpose | Side effect |
| Read recent messages, optionally filtered by contact or group chat ID | Read-only |
| Search message bodies by approximate text match; defaults to 30 days, or use | Read-only |
| Fuzzy-match a name in Contacts and return phone numbers | Read-only |
| List named group chats and their identifiers | Read-only |
| Find attachment metadata by date, contact, MIME type, and limit | Read-only |
| Fetch one attachment by ID, inline when supported or as a local path | Read-only |
| Check likely iMessage availability for a phone number or email | Read-only |
| Diagnose access to | Read-only |
| Return a contact count and a small sample | Read-only |
| Diagnose Contacts/AddressBook database access | Read-only |
| Send one direct or group message through Messages.app | Sends a real message |
The server also exposes two MCP resources:
messages://recent/{hours}messages://contact/{contact}/{hours}
Working with contacts, chats, and attachments
Recipients
For direct messages, E.164 phone numbers are the most reliable format:
+14155551234The server normalizes bare numbers with a country code and converts 10-digit US
numbers to +1.... It also accepts email addresses, contact names, and
contact:N selections returned after an ambiguous contact search.
For a group conversation, call tool_get_chats, pass its chat ID to
tool_send_message, and set group_chat=true. Use the same ID as chat_id in
tool_get_recent_messages to read that conversation.
Attachments
Attachment access is deliberately split into three steps:
Message reads and searches add compact markers such as
[attachments: #42 image/jpeg (invitation.jpg)].tool_search_attachmentssearches metadata without loading file contents.tool_get_attachmentfetches one selected attachment.
Images up to 5 MB are returned inline by default. HEIC images are converted to
PNG. Larger images, PDFs, video, and audio are returned as local filesystem
paths so the MCP client can decide whether to open them. Stickers, link-preview
payloads, and .pluginPayloadAttachment containers are filtered out.
Privacy and security
Messages and Contacts SQLite connections use read-only mode and SQLite
query_only.The server does not upload, mirror, index, or maintain its own message archive.
Results are written to the local MCP stdio connection started by your client.
Message bodies are sanitized and bounded before being returned.
Attachment bytes are returned only after an explicit fetch and are size-limited for inline images.
Sending is isolated in
tool_send_message, escapes AppleScript inputs, and uses a bounded execution timeout.Full Disk Access is broader than Messages access. Grant it only to MCP clients you trust and review the destination before approving a send.
See SECURITY.md to report a vulnerability privately.
Troubleshooting
uvx or spawn uvx ENOENT
The GUI app cannot see your shell's Homebrew path. Run:
which uvxUse that full path as the MCP command, then restart the client.
Operation not permitted, unable to open database file, or no messages
Grant Full Disk Access to the app that launches the server, not just to
Messages.app. Completely quit and reopen the launcher afterward, then call
tool_check_db_access again.
For Claude Code or Codex CLI, the launcher is normally your terminal. For a desktop or IDE integration, it is normally Claude Desktop, Cursor, VS Code, or the ChatGPT desktop app itself.
Contacts are empty or contact lookup fails
Allow the launching app to access Contacts if macOS prompts. Confirm Full Disk
Access, restart the app, and call tool_check_addressbook followed by
tool_check_contacts.
Reading works but sending fails
Open Messages.app and send a message manually to confirm the account and recipient work.
Check System Settings → Privacy & Security → Automation and allow the launching app to control Messages.
Prefer an E.164 number such as
+14155551234for a direct recipient.Use
tool_check_imessage_availabilityto inspect the likely route.
An attachment is listed but cannot be opened
Messages may retain database metadata after macOS has offloaded the file. Open
the conversation in Messages.app and download the attachment, then retry
tool_get_attachment.
The server appears to hang when run in Terminal
That is normal for an MCP stdio server: it waits for protocol input from a client. Use your client's MCP status view, or launch the MCP Inspector:
yarn dlx @modelcontextprotocol/inspector uvx mac-messages-mcpInstall as a standalone tool
MCP clients can launch the package directly with uvx; a permanent installation
is optional.
uv tool install mac-messages-mcp
mac-messages-mcpUpgrade or remove it with:
uv tool upgrade mac-messages-mcp
uv tool uninstall mac-messages-mcpPython API
The MCP server is the primary interface, but the package also exports its core read/send functions:
from mac_messages_mcp import get_recent_messages, send_message
recent = get_recent_messages(hours=48)
print(recent)
result = send_message(
recipient="+14155551234",
message="Hello from Mac Messages MCP!",
)
print(result)These calls use the same macOS permissions and can send real messages.
Development
git clone https://github.com/carterlasalle/mac_messages_mcp.git
cd mac_messages_mcp
uv sync --frozen --extra dev
uv run pytest
uv run black --check .
uv run isort --check-only .
uv buildTests mock AppleScript and use temporary database fixtures; they must never read a contributor's real Messages or Contacts data. See CONTRIBUTING.md for the contribution checklist and VERSIONING.md for releases.
Build the Claude Desktop extension
The repository includes an MCPB manifest.json and a build script that can
bundle an architecture-specific uv binary:
yarn global add @anthropic-ai/mcpb
uv run python scripts/build_mcpb.pyFor an Intel build:
uv run python scripts/build_mcpb.py --arch x86_64Install the generated .mcpb from Claude Desktop → Settings → Extensions →
Advanced settings → Install Extension…. A bundled extension still needs
network access on first launch to download Python and the package dependencies.
Use --no-bundle to package against the system uv, or run
uv run python scripts/build_mcpb.py --help for every option.
Docker
The included Dockerfile is for package and catalog validation. A Linux container cannot access macOS TCC permissions or automate Messages.app, so Docker is not a supported way to read or send messages on the host Mac.
License
MIT © Carter Lasalle
Contributing
Issues and focused pull requests are welcome. Do not include real message contents, contacts, phone numbers, database files, or attachments in bug reports or fixtures.
Changelog · Contributing · Security · PyPI
Available Tools
9 toolstool_check_addressbookC
Diagnose AddressBook access issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states the tool diagnoses issues but does not specify what 'diagnose' entails—e.g., whether it performs read-only checks, requires permissions, returns error details, or has side effects. This leaves critical behavioral traits unclear for safe and effective use.
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, efficient sentence ('Diagnose AddressBook access issues.') that is front-loaded and wastes no words. It could be slightly improved by adding context or usage hints, but it effectively conveys the core purpose without unnecessary elaboration, earning a high score for conciseness.
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 diagnostic nature, lack of annotations, and no output schema, the description is incomplete. It does not explain what the diagnosis returns, how results are structured, or any behavioral constraints. For a tool that likely involves system checks, more context is needed to ensure the agent understands its operation and outputs.
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 tool has 0 parameters, and schema description coverage is 100%, meaning no parameters need documentation. The description does not add parameter details, which is appropriate here. A baseline score of 4 is assigned as the description does not need to compensate for any parameter gaps, aligning with the rule for zero parameters.
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 'Diagnose AddressBook access issues' clearly states the tool's purpose with a specific verb ('diagnose') and target ('AddressBook access issues'), avoiding tautology. However, it does not distinguish this from sibling tools like 'tool_check_contacts' or 'tool_check_db_access', which might have overlapping diagnostic functions, leaving room for ambiguity in tool selection.
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 no guidance on when to use this tool versus alternatives. It does not mention prerequisites, context for diagnosing access issues, or refer to sibling tools for related tasks, such as 'tool_check_contacts' for contact-specific checks. This lack of usage context could lead to incorrect tool selection by an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_check_contactsB
List available contacts in the address book.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states the tool lists contacts but doesn't reveal any behavioral traits like whether it requires permissions, how it handles errors, or what the output format might be. This is a significant gap for a tool with zero annotation coverage.
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, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy to parse quickly.
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 lack of annotations and output schema, the description is incomplete. It doesn't explain what 'available contacts' means, how results are returned, or any limitations, which is inadequate for a tool that interacts with data. More context is needed to fully understand its behavior.
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 tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and a baseline of 4 is appropriate as it doesn't mislead or omit necessary information in this context.
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') and resource ('available contacts in the address book'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'tool_check_addressbook' or 'tool_find_contact', which likely have overlapping functionality, so it doesn't achieve full distinction.
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 no guidance on when to use this tool versus alternatives such as 'tool_find_contact' or 'tool_check_addressbook'. It lacks explicit context, exclusions, or prerequisites, leaving the agent without direction on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_check_db_accessC
Diagnose database access issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It implies a read-only diagnostic operation but doesn't disclose traits like whether it performs active tests, returns structured results, requires permissions, or has side effects, which is inadequate for a tool with zero annotation coverage.
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, efficient sentence with zero waste, front-loading the core purpose without unnecessary elaboration. It's appropriately sized for a simple diagnostic tool with no parameters.
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 lack of annotations and output schema, the description is incomplete. It doesn't explain what 'diagnose' entails behaviorally, what results to expect, or how it differs from other check tools, leaving significant gaps for an agent to understand its use in context.
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 tool has 0 parameters with 100% schema description coverage, so no parameter documentation is needed. The description doesn't add param details, but this is appropriate given the empty schema, warranting a baseline score above minimum viable.
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 'Diagnose database access issues' clearly states the tool's purpose with a specific verb ('diagnose') and target ('database access issues'), avoiding tautology. However, it doesn't differentiate this diagnostic tool from other 'check' siblings like tool_check_addressbook or tool_check_contacts, leaving ambiguity about scope.
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 no guidance on when to use this tool versus alternatives. It doesn't specify prerequisites, context (e.g., after connection errors), or exclusions, nor does it reference sibling tools for comparison, leaving usage entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_check_imessage_availabilityA
Check if a recipient has iMessage available.
This tool helps determine whether to send via iMessage or SMS/RCS.
Useful for debugging delivery issues or choosing the right service.
Args:
recipient: Phone number or email to check for iMessage availability
| Name | Required | Description | Default |
|---|---|---|---|
| recipient | Yes |
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 of behavioral disclosure. It mentions the tool's purpose and use cases but lacks details on behavioral traits like what 'availability' means (e.g., online status, service registration), potential errors (e.g., invalid recipient format), or side effects (e.g., rate limits, privacy implications). For a tool with no annotation coverage, this is a significant gap.
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 appropriately sized and front-loaded: it starts with the core purpose, followed by usage context and parameter details in a structured 'Args:' section. Every sentence adds value without redundancy, making it efficient and easy to parse.
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 moderate complexity (1 parameter, no output schema, no annotations), the description is adequate but incomplete. It covers purpose, usage, and parameter semantics but lacks behavioral details (e.g., return format, error handling) and doesn't leverage sibling context to clarify distinctions. It meets minimum viability but has clear gaps.
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 0%, so the description must compensate. It adds meaning by explaining that the 'recipient' parameter is a 'Phone number or email to check for iMessage availability,' which clarifies the expected input format beyond the schema's generic string type. However, it doesn't cover validation rules or examples, leaving some ambiguity.
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's purpose: 'Check if a recipient has iMessage available.' It specifies the verb ('check') and resource ('iMessage availability'), making the action explicit. However, it doesn't distinguish this tool from sibling tools like 'tool_check_contacts' or 'tool_check_addressbook' in terms of scope or domain, which prevents a perfect score.
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: 'Useful for debugging delivery issues or choosing the right service.' It implies usage scenarios (debugging and service selection) but does not explicitly state when not to use it or name alternatives among siblings, such as 'tool_send_message' for actual sending, which would be needed for a score of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_find_contactC
Find a contact by name using fuzzy matching.
Args:
name: The name to search for
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
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 of behavioral disclosure. It mentions 'fuzzy matching,' which hints at approximate search behavior, but fails to detail critical aspects like error handling, permissions needed, rate limits, or what happens if no matches are found. For a search tool with zero annotation coverage, this is a significant gap in transparency.
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 appropriately sized and front-loaded, with the core purpose stated first. The two-sentence structure is efficient, and the 'Args:' section adds clarity without redundancy. While it could be slightly more detailed, it avoids unnecessary verbosity, earning a high score for conciseness.
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 complexity (a search operation), lack of annotations, and no output schema, the description is incomplete. It doesn't explain return values, error cases, or behavioral nuances like how 'fuzzy matching' works. This leaves gaps that could hinder an AI agent's ability to use the tool effectively, especially compared to more comprehensive descriptions.
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 description adds minimal semantics beyond the input schema. It explains that 'name' is 'The name to search for,' which clarifies the parameter's purpose. However, with 0% schema description coverage and only one parameter, this is adequate but not exceptional. The baseline for a single parameter with low coverage is met, but no additional details like format or constraints are provided.
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's purpose: 'Find a contact by name using fuzzy matching.' It specifies the verb ('Find'), resource ('contact'), and method ('fuzzy matching'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'tool_check_contacts' or 'tool_fuzzy_search_messages', which prevents a perfect score.
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 no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'tool_check_contacts' or 'tool_fuzzy_search_messages', nor does it specify prerequisites, exclusions, or contextual cues for selection. This lack of comparative information limits its utility for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_fuzzy_search_messagesA
Fuzzy search for messages containing the search_term within the last N hours.
Returns messages that match the search term with a similarity score.
Args:
search_term: The text to search for in messages.
hours: How many hours back to search (default 24). Must be positive.
threshold: Similarity threshold for matching (0.0 to 1.0, default 0.6). Lower is more lenient.
| Name | Required | Description | Default |
|---|---|---|---|
| search_term | Yes | ||
| hours | No | ||
| threshold | No |
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 mentions the tool returns messages with similarity scores, which is useful, but lacks critical details like whether this is a read-only operation, potential rate limits, authentication requirements, pagination behavior, or what happens if no matches are found. The description provides basic functionality but misses important operational context.
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 efficiently structured with a clear purpose statement followed by a parameter breakdown. Every sentence adds value: the first defines the tool's function, and the parameter explanations provide necessary context without redundancy. It's appropriately sized for a 3-parameter tool.
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 moderate complexity (fuzzy search with scoring), no annotations, and no output schema, the description is partially complete. It covers parameters well but lacks behavioral details (e.g., read-only status, error handling) and output format clarification (e.g., structure of returned messages with scores). For a search tool with no structured output documentation, this leaves gaps.
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 description adds significant value beyond the input schema, which has 0% description coverage. It explains the purpose of each parameter: search_term ('text to search for in messages'), hours ('how many hours back to search'), and threshold ('similarity threshold for matching') with practical guidance like 'Lower is more lenient' and default values. This fully compensates for the schema's lack of descriptions.
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 specific action ('fuzzy search for messages'), resource ('messages'), and scope ('within the last N hours'). It distinguishes from siblings like tool_get_recent_messages (which likely retrieves without search) and tool_get_chats (which focuses on chat threads rather than message content).
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 through the time-bound search context ('within the last N hours') but doesn't explicitly state when to use this tool versus alternatives like tool_find_contact (for contacts) or tool_get_recent_messages (for unfiltered recent messages). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_get_chatsB
List available group chats from the Messages app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states the action ('List') but does not specify whether this is a read-only operation, what permissions are needed, how results are returned (e.g., pagination, format), or any rate limits. This leaves significant gaps for an agent to understand the tool's behavior.
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, clear sentence with no wasted words. It is front-loaded with the core action and resource, making it highly efficient and easy to parse for an agent.
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 (0 parameters, no output schema, no annotations), the description is minimally adequate. It states what the tool does but lacks details on behavior, output format, and usage context, which are needed for full completeness in a no-annotation scenario.
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 tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description does not need to add parameter semantics, and it appropriately avoids unnecessary details, earning a high baseline score for this dimension.
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 verb ('List') and resource ('available group chats from the Messages app'), making the purpose specific and understandable. However, it does not explicitly differentiate from sibling tools like 'tool_get_recent_messages' or 'tool_fuzzy_search_messages', which prevents a perfect score.
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 no guidance on when to use this tool versus alternatives such as 'tool_get_recent_messages' for recent messages or 'tool_fuzzy_search_messages' for searching. There is no mention of prerequisites, context, or exclusions, leaving usage unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_get_recent_messagesA
Get recent messages from the Messages app.
Args:
hours: Number of hours to look back (default: 24)
contact: Filter by contact name, phone number, or email (optional)
Use "contact:N" to select a specific contact from previous matches
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| contact | No |
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 mentions default values and optional filtering, but doesn't disclose critical behavioral traits such as rate limits, authentication needs, pagination, error handling, or what 'recent messages' includes (e.g., message count limits). This leaves significant gaps for an agent.
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 appropriately sized and front-loaded with the purpose, followed by structured parameter details. Every sentence adds value, though it could be slightly more concise by integrating the purpose and parameters more seamlessly.
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 moderate complexity (2 parameters, no annotations, no output schema), the description is partially complete. It covers parameters well but lacks information on return values, error cases, and behavioral constraints, making it adequate but with clear gaps for effective agent use.
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?
With 0% schema description coverage, the description fully compensates by explaining both parameters: 'hours' as 'Number of hours to look back (default: 24)' and 'contact' with detailed filtering options including a specific syntax. This adds substantial meaning beyond the bare schema.
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's purpose: 'Get recent messages from the Messages app.' It specifies the verb ('Get') and resource ('recent messages'), but doesn't explicitly distinguish it from sibling tools like 'tool_fuzzy_search_messages' or 'tool_get_chats', which prevents a perfect score.
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 through parameter explanations (e.g., 'hours' for time range, 'contact' for filtering), but doesn't explicitly state when to use this tool versus alternatives like 'tool_fuzzy_search_messages' or 'tool_get_chats'. It provides some context but lacks clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_send_messageB
Send a message using the Messages app.
Args:
recipient: Phone number, email, contact name, or "contact:N" to select from matches
For example, "contact:1" selects the first contact from a previous search
message: Message text to send
group_chat: Whether to send to a group chat (uses chat ID instead of buddy)
| Name | Required | Description | Default |
|---|---|---|---|
| recipient | Yes | ||
| message | Yes | ||
| group_chat | No |
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 mentions the tool sends messages but doesn't cover critical aspects like whether it requires authentication, potential rate limits, error conditions (e.g., invalid recipient), or what happens on success/failure. The description adds some context about recipient formats but misses key behavioral traits needed for safe invocation.
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 appropriately sized and front-loaded with the core purpose in the first sentence. The parameter explanations are organized in a clear list format, making it easy to scan. While efficient, it could be slightly more concise by integrating the parameter details more seamlessly, but overall it avoids unnecessary verbosity.
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 complexity of a message-sending tool with 3 parameters, 0% schema coverage, no annotations, and no output schema, the description is moderately complete. It covers parameter semantics well but lacks behavioral context (e.g., side effects, errors) and output information. For a tool that performs a write operation, more completeness around success criteria and potential impacts would be beneficial.
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 0%, so the description must compensate. It provides meaningful semantics for all three parameters: 'recipient' explains formats (phone, email, contact name, 'contact:N'), 'message' clarifies it's text to send, and 'group_chat' indicates it uses chat ID instead of buddy. This adds substantial value beyond the bare schema, though it could include examples for the message parameter or more details on group_chat behavior.
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 ('Send a message') and resource ('using the Messages app'), making the purpose immediately understandable. It distinguishes itself from sibling tools like tool_fuzzy_search_messages or tool_get_recent_messages by focusing on sending rather than retrieving messages. However, it doesn't explicitly differentiate from potential message-related tools that might exist elsewhere.
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 through the parameter explanations (e.g., 'contact:N' for selecting from matches), suggesting when to use certain recipient formats. However, it lacks explicit guidance on when to use this tool versus alternatives like tool_get_chats for viewing chats or tool_find_contact for contact lookup, and doesn't mention prerequisites such as needing the Messages app available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but tool_check_addressbook and tool_check_contacts could cause confusion as both relate to address book diagnostics and listing. The other tools like send_message, fuzzy_search_messages, and get_recent_messages are clearly differentiated by their specific functions.
The naming follows a consistent verb_noun pattern with snake_case throughout, such as tool_check_addressbook and tool_send_message. However, there is a minor deviation with tool_find_contact (using 'find' instead of 'check' or 'get'), which slightly breaks the pattern but remains readable.
With 9 tools, the count is well-scoped for a Messages app integration, covering diagnostics, contact management, message retrieval, and sending. Each tool serves a clear purpose without feeling excessive or insufficient for the domain.
The toolset provides good coverage for messaging operations, including sending, searching, and retrieving messages, as well as contact management and diagnostics. A minor gap is the lack of tools for updating or deleting messages, but agents can work around this for typical use cases.
Maintenance
Related MCP Connectors
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Agent communication platform for agent to agent messaging via MCP. Messages, channels, skills.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA macOS app that provides an MCP server to your Messages, Contacts, and more1,532MIT
- AlicenseNot gradedqualityDmaintenanceEnables sending and reading iMessages and SMS messages through the macOS Messages app via MCP.MIT
- AlicenseNot gradedqualityDmaintenanceEnables reading, sending, and managing iMessage conversations on macOS through MCP.1MIT
- 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
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/carterlasalle/mac_messages_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server