jons-mcp-imessage
Enables querying iMessage history, listing conversations, searching messages, getting message context, and sending messages to existing conversations on macOS through the local Messages.app database.
Uses OpenAI embeddings API for semantic search capabilities to find conceptually similar messages in iMessage history, complementing keyword-based search.
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., "@jons-mcp-imessagesearch for messages about dinner plans from last week"
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.
jons-mcp-imessage
A local MCP server for querying and sending iMessages on macOS.
This FastMCP server exposes tools through the Model Context Protocol (MCP), enabling AI assistants to read your iMessage history and send messages.
Requirements
macOS (tested on Tahoe 26.x, should work on recent versions)
Python 3.10+
Messages.app (for sending messages)
Related MCP server: iMessage Max
Permissions Required
This server requires specific macOS permissions to function. Permission issues are the most common cause of problems.
Full Disk Access (Required for Reading Messages)
The application running this server needs Full Disk Access to read ~/Library/Messages/chat.db.
To grant Full Disk Access:
Open System Settings (or System Preferences on older macOS)
Navigate to Privacy & Security → Full Disk Access
Click the lock icon and authenticate if needed
Click the + button
Add the appropriate application:
If using Claude Desktop: Add
Claude.app(usually in /Applications)If running from terminal: Add your terminal app (e.g.,
Terminal.app,iTerm.app,Zed.app)If running via another app: Add that specific application
Restart the application after granting access
How to verify: Run check_permissions tool - it will report whether database access is working.
Automation Permission (Required for Sending Messages)
To send messages via AppleScript, the application needs permission to control Messages.app.
This permission is prompted automatically the first time you try to send a message. Click "OK" to allow.
To manually grant or verify:
Open System Settings → Privacy & Security → Automation
Find your application (Terminal, Claude Desktop, etc.)
Ensure Messages is checked
Contacts Permission (Optional - For Contact Name Enrichment)
The server can enrich message responses with contact names from your Contacts app. This is optional - all features work without it, but you'll see phone numbers/emails instead of names.
To enable contact name enrichment:
Open System Settings (or System Preferences on older macOS)
Navigate to Privacy & Security → Contacts
Click the lock icon and authenticate if needed
Click the + button
Add the appropriate application:
If using Claude Desktop: Add
Claude.app(usually in /Applications)If running from terminal: Add your terminal app (e.g.,
Terminal.app,iTerm.app)
Restart the application after granting access
What you get with Contacts permission:
Message responses include
contact_namefield (e.g., "John Smith" instead of just "+15551234567")Conversation responses include
participant_namesfieldlookup_contacttool becomes available for explicit contact lookups
Without Contacts permission:
Contact name fields will be
nulllookup_contactreturns an error messageAll other functionality works normally (graceful degradation)
Installation
# Clone the repository
git clone <your-repo-url>
cd jons-mcp-imessage
# Install with uv
uv pip install -e .Running the Server
uv run jons-mcp-imessageAdding to Claude Code
# Register the MCP server with Claude Code
claude mcp add jons-mcp-imessage -- uv run --directory /path/to/jons-mcp-imessage jons-mcp-imessageAdding to Claude Desktop
Add the following to your Claude Desktop configuration file:
Location: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"jons-mcp-imessage": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/jons-mcp-imessage",
"jons-mcp-imessage"
],
"env": {
"OPENAI_API_KEY": "sk-your-openai-api-key"
}
}
}
}Notes:
Replace
/path/to/jons-mcp-imessagewith the actual path to this repositoryReplace
sk-your-openai-api-keywith your OpenAI API key (required for semantic search)If you don't have an OpenAI key, omit the
envsection entirely - keyword search will still workRestart Claude Desktop after modifying the config
Search Features
The search system combines two powerful search methods:
Keyword Search (FTS5)
Full-text search using SQLite FTS5 with BM25 ranking. Supports:
Phrase search:
"exact phrase"Prefix matching:
word*Proximity:
word1 NEAR word2Boolean:
word1 AND word2,word1 OR word2,NOT word
Semantic Search
AI-powered search using OpenAI embeddings to find conceptually similar messages, even when exact keywords don't match.
Setup
Basic Setup (keyword search only): Works out of the box
Full Setup (hybrid search): Set your OpenAI API key:
export OPENAI_API_KEY=your-api-key
Search Modes
hybrid(default): Combines keyword + semantic results using RRFkeyword: FTS5 only (no API key needed)semantic: Embedding similarity only (requires API key)
Index Management
The search index is stored separately from iMessage's chat.db at:
~/.local/share/jons-mcp-imessage/search_index.db
Tools available:
search_index_status- Check index health and sync statusrebuild_search_index- Full reindex (use if issues occur)
Troubleshooting
Issue | Solution |
"No results found" | Check if index is synced with |
Semantic search not working | Verify |
Slow first search | Index is building in background, try again shortly |
Stale results | chat.db may be locked by Messages app |
Available Tools
Reading Messages
Tool | Description |
| Verify database access and diagnose permission issues |
| List all conversations with metadata (participants, last message, etc.) |
| Get messages from a specific conversation by contact or chat_id |
| Get recent messages across all conversations |
| Get messages before/after a specific message in the same thread |
| Search messages by text content with optional filters |
| Search for contacts/handles by phone number or email in iMessage database |
| Look up contact name from Contacts app by phone/email (requires Contacts permission) |
Sending Messages
Tool | Description |
| Send a message to an existing conversation |
send_message Limitations
Important: The send_message tool has significant limitations:
Existing conversations only: Can only send to contacts you have previously messaged. New contacts require starting a conversation manually in Messages.app first.
No delivery confirmation: The tool reports success when the message is handed to Messages.app, but cannot confirm actual delivery. Messages may silently fail if:
The recipient has blocked you
The phone number/email is invalid
Network issues occur
Messages.app must be running: If Messages.app is not running, the tool will fail with a "Messages not running" error.
Service detection: By default, attempts iMessage first. Use
service="SMS"to force SMS for non-iMessage contacts.
Example Usage
# Check if permissions are configured correctly
check_permissions()
# List your 10 most recent conversations
list_conversations(limit=10)
# Get messages from a specific contact
get_conversation_messages(contact="+15551234567", limit=20)
# Search for messages containing specific text
search_messages(query="dinner plans", sender="+15551234567")
# Get context around a specific message (5 messages before and after)
get_message_context(rowid=12345, before=5, after=5)
# Send a message (to existing conversation only)
send_message(recipient="+15551234567", message="Hello!")Troubleshooting
"Permission denied" or "Unable to read database"
Cause: Full Disk Access not granted.
Fix: Follow the Full Disk Access instructions above. Make sure to:
Grant access to the correct application (the one actually running the server)
Restart the application after granting access
"Messages not running (-600)"
Cause: Messages.app is not running.
Fix: Open Messages.app before sending messages.
"Not allowed to send Apple events (-1743)"
Cause: Automation permission not granted.
Fix:
Go to System Settings → Privacy & Security → Automation
Find your application and enable Messages access
If not listed, try sending a message again to trigger the permission prompt
"Can't get buddy id" or "existing conversations only"
Cause: Trying to message a contact you haven't messaged before.
Fix: Start a conversation with this contact manually in Messages.app first, then try again.
Messages appear empty or "(non-text message)"
Cause: The message contains only attachments (images, videos) or is a system message (like "renamed the group").
Note: This is expected behavior. The server extracts text content only.
Privacy Considerations
This server accesses your local iMessage database and optionally your Contacts database. Be aware that:
All message history is accessible: The server can read all messages stored locally
Contact information is exposed: Phone numbers and email addresses are visible
Attachments are referenced: File paths to attachments (photos, videos) are included
No cloud access: Only locally-stored messages are accessible (not messages only on iCloud)
Contact Name Privacy
If you grant Contacts permission:
Contact names come from YOUR Contacts app: The server reads your personal contact list to enrich message responses
Names are NOT stored: Contact names are resolved at query time and are NOT stored in any database or search index
Names are cached in-memory only: The server loads all contacts into memory on first use, cache is cleared on restart
All Contacts databases are read: Includes main Contacts DB plus any per-source databases (iCloud, CardDAV, etc.)
Use appropriate caution when granting AI assistants access to this server.
Development
Setup
# Install with dev dependencies
uv pip install -e ".[dev]"Running Tests
# Run all tests
uv run pytest
# Run with coverage
uv run pytest --cov=src
# Run a specific test file
uv run pytest tests/test_parser.pyCode Quality
# Type check
uv run mypy src/jons_mcp_imessage
# Format code
uv run black src tests
# Lint code
uv run ruff check src testsProject Structure
jons-mcp-imessage/
├── src/
│ └── jons_mcp_imessage/
│ ├── __init__.py # Package exports
│ ├── constants.py # Configuration constants
│ ├── exceptions.py # Custom exceptions
│ ├── utils.py # Utility functions
│ ├── server.py # FastMCP server setup
│ ├── db/
│ │ ├── __init__.py # Database module exports
│ │ ├── connection.py # SQLite connection management
│ │ ├── models.py # Pydantic data models
│ │ ├── parser.py # attributedBody binary parser
│ │ └── queries.py # Query helpers and utilities
│ └── tools/
│ ├── __init__.py # Tool exports
│ ├── health.py # Permission checking
│ ├── contacts.py # Contact search
│ ├── conversations.py # Conversation tools
│ ├── messages.py # Message tools
│ └── send.py # Message sending
├── tests/
│ ├── test_parser.py # attributedBody parser tests
│ ├── test_db.py # Database utility tests
│ └── test_send.py # Send tool tests
├── docs/
│ └── IMESSAGE_DATABASE_FORMAT.md # Database format documentation
├── pyproject.toml # Project configuration
├── CLAUDE.md # AI assistant guidance
└── README.md # This fileLicense
MIT
Available Tools
13 toolscheck_permissionsA
Check if the server has the required permissions to access iMessage data.
This tool helps debug permission issues by checking:
Full Disk Access for ~/Library/Messages/chat.db
Access to ~/Library/Messages/Attachments
Returns: Dictionary with access status, paths checked, and any error messages. Includes macOS version for debugging.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 effectively describes the tool's behavior by specifying what it checks (permissions for specific paths) and what it returns (a dictionary with access status, paths checked, error messages, and macOS version). However, it lacks details on potential side effects, error handling, or performance characteristics like execution time.
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 well-structured and front-loaded with the main purpose in the first sentence, followed by bullet points for clarity and a returns 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 complexity (simple permission check with no parameters), the presence of an output schema (which handles return values), and the detailed description covering purpose, usage, and behavior, the description is complete enough. It provides all necessary context for an AI agent to understand and invoke the tool correctly.
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 the schema description coverage is 100%, so no parameter documentation is needed. The description does not add parameter-specific information, but this is appropriate given the lack of inputs. A baseline of 4 is assigned as it compensates adequately for the zero-parameter case.
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 with specific verbs ('check if the server has the required permissions') and resources ('iMessage data', 'Full Disk Access for ~/Library/Messages/chat.db', 'Access to ~/Library/Messages/Attachments'). It distinguishes itself from sibling tools (e.g., get_conversation_messages, send_message) by focusing on permission debugging rather than data retrieval or message operations.
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 this tool ('helps debug permission issues'), but it does not explicitly state when not to use it or name specific alternatives among the sibling tools. It implies usage for troubleshooting access problems without detailing prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversation_messagesA
Get messages from a specific conversation.
You can specify the conversation by either chat_id or contact identifier. If contact is provided, it will be normalized and used to find the chat. Messages are enriched with contact names for senders.
Args: chat_id: Database row ID of the chat (from list_conversations) contact: Phone number or email to find the conversation limit: Maximum number of messages to return (default: 50) offset: Number of messages to skip (default: 0)
Returns: Dictionary with messages list, conversation info, and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | No | ||
| contact | No | ||
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 adds useful context beyond basic functionality: it explains that messages are 'enriched with contact names for senders,' describes how contact normalization works, and mentions default values for limit and offset. However, it doesn't cover important aspects like error handling, rate limits, authentication needs, or whether this is a read-only operation, which are significant gaps for a tool with no annotations.
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 well-structured and appropriately sized: it starts with a clear purpose statement, followed by usage details, an 'Args' section with parameter explanations, and a 'Returns' section. Every sentence adds value, such as clarifying contact normalization and referencing sibling tools. However, it could be slightly more concise by integrating the parameter details more seamlessly, and the structure, while clear, isn't perfectly front-loaded with the most critical 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?
Given the complexity (a 4-parameter tool with no annotations but an output schema), the description is mostly complete. It covers the purpose, parameter semantics, and return value structure ('Dictionary with messages list, conversation info, and pagination'), which aligns with the output schema. The main gap is the lack of behavioral details like error handling or permissions, but the output schema reduces the need to explain return values, so it's reasonably comprehensive for the 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 schema description coverage is 0%, so the description must fully compensate. It successfully adds detailed meaning for all four parameters: it explains that 'chat_id' is a 'Database row ID of the chat (from list_conversations),' 'contact' is a 'Phone number or email to find the conversation' that gets normalized, and 'limit' and 'offset' control pagination with defaults. This provides clear semantics beyond what the bare schema offers, making it easy for an agent to understand how to use each parameter correctly.
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 messages from a specific conversation.' It specifies the verb ('Get') and resource ('messages from a specific conversation'), making the intent unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'get_recent_messages' or 'search_messages', which could provide similar functionality, so it doesn't reach the highest 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 some implied usage guidance by explaining that you can specify a conversation by 'chat_id or contact identifier' and mentioning that 'contact is normalized and used to find the chat.' It also references 'list_conversations' as a source for chat_id. However, it lacks explicit when-to-use rules, such as when to prefer this tool over 'get_recent_messages' or 'search_messages', and doesn't mention any prerequisites or exclusions, leaving room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_message_contextA
Get messages surrounding a specific message in the same conversation.
Use this to get context around a message found via search. Returns messages from the same chat/thread, ordered chronologically, with the target message marked.
Args: rowid: The rowid of the message to get context for before: Number of messages to fetch before the target (default: 5) after: Number of messages to fetch after the target (default: 5)
Returns: Dictionary with: - messages: List of messages in chronological order - target_index: Index of the target message in the list - chat_id: The chat ID for the conversation - chat_identifier: The chat identifier (phone/email/group)
| Name | Required | Description | Default |
|---|---|---|---|
| rowid | Yes | ||
| before | No | ||
| after | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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. It discloses key behavioral traits: it returns messages 'ordered chronologically' with the target 'marked', specifies the return structure, and implies it's a read-only operation (no destructive language). However, it doesn't mention permissions, rate limits, or error conditions, leaving some gaps.
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 front-loaded with the core purpose, followed by usage guidelines, then parameter details, and finally return values. Every sentence earns its place with no redundancy, making it efficient and well-structured for quick comprehension.
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 (3 parameters, 1 required), no annotations, and the presence of an output schema (implied by the 'Returns' section), the description is complete. It covers purpose, usage, parameters, and return structure, leaving no significant gaps for an agent to operate effectively.
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 0%, so the description must compensate. It fully documents all three parameters: 'rowid' as 'The rowid of the message to get context for', 'before' as 'Number of messages to fetch before the target', and 'after' as 'Number of messages to fetch after the target', including default values. This adds complete 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 specific action ('Get messages surrounding a specific message') and resource ('in the same conversation'), distinguishing it from siblings like 'get_conversation_messages' (which likely gets all messages) and 'search_messages' (which searches across conversations). The phrase 'surrounding a specific message' precisely defines the 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?
It explicitly states when to use this tool: 'Use this to get context around a message found via search.' This directly contrasts with 'search_messages' (for finding messages) and 'get_conversation_messages' (for getting all messages in a conversation), providing clear alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rebuild_progressA
Get the current progress of a background index rebuild.
Returns: Dictionary with rebuild progress information, or status indicating no rebuild is in progress.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 that the tool returns a dictionary with progress information or a status if no rebuild is in progress, which adds useful behavioral context. However, it doesn't cover aspects like error handling, rate limits, or authentication needs, leaving some gaps 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 highly concise and well-structured, consisting of two sentences that efficiently convey the purpose and return value. Every sentence earns its place by providing essential information without waste, making it easy to parse and understand.
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 (simple read operation with 0 parameters) and the presence of an output schema (which handles return value documentation), the description is reasonably complete. It covers the core purpose and behavioral output, though it could benefit from more context on usage relative to siblings. No annotations exist to fill gaps, but the output schema reduces the need for extensive description.
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 input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter details beyond the schema, but since there are no parameters, this is acceptable. A baseline of 4 is appropriate as it doesn't introduce confusion or redundancy.
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 the current progress of a background index rebuild.' It specifies the verb ('Get') and resource ('progress of a background index rebuild'), making it easy to understand. However, it doesn't explicitly differentiate from sibling tools like 'rebuild_search_index' or 'search_index_status', which prevents a score of 5.
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 by mentioning 'background index rebuild,' suggesting it should be used when monitoring such operations. However, it lacks explicit guidance on when to use this tool versus alternatives like 'rebuild_search_index' (which might initiate a rebuild) or 'search_index_status' (which could provide general status). No exclusions or clear alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_messagesA
Get the most recent messages across all conversations.
Args: limit: Maximum number of messages to return (default: 50) offset: Number of messages to skip (default: 0) after_date: Only return messages after this date (ISO8601 format)
Returns: Dictionary with messages list and pagination metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| after_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It mentions the return format ('Dictionary with messages list and pagination metadata'), which is helpful, but doesn't disclose critical behavioral traits like whether this is a read-only operation, rate limits, authentication requirements, or what 'most recent' means in terms of sorting. For a tool with 3 parameters and no annotations, this leaves significant gaps.
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 well-structured and front-loaded with the core purpose, followed by clear sections for Args and Returns. Every sentence earns its place, with no wasted words, 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 (3 parameters, no annotations, but with an output schema), the description is reasonably complete. It covers the purpose, parameters, and return structure, and the output schema handles return values. However, it lacks details on behavioral aspects like sorting order or error handling, which could be important for full 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 description adds meaningful semantics beyond the input schema, which has 0% description coverage. It explains each parameter's purpose: 'limit' for maximum returns, 'offset' for skipping messages, and 'after_date' for filtering by date with format specified (ISO8601). This compensates well for the schema's lack of descriptions, though it doesn't detail constraints like valid ranges.
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 ('Get') and resource ('most recent messages across all conversations'), making the purpose immediately understandable. It distinguishes from siblings like 'get_conversation_messages' (which focuses on specific conversations) and 'search_messages' (which likely involves filtering/searching). However, it doesn't explicitly mention these distinctions, keeping it at 4 rather than 5.
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 recent messages broadly, but doesn't explicitly state when to use this vs. alternatives like 'get_conversation_messages' (for specific conversations) or 'search_messages' (for filtered searches). It provides basic context but lacks explicit guidance on exclusions or preferred scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hello_worldA
Return a friendly greeting.
This is an example tool that demonstrates the basic pattern for creating MCP tools with FastMCP. The docstring here becomes the tool's description in the MCP protocol.
Args: name: The name to greet. Defaults to "World".
Returns: A greeting message.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | World |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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. It states the tool returns a greeting, implying it's a read-only operation, but doesn't explicitly mention side effects, permissions, or rate limits. The description adds basic behavioral context (e.g., it's an example tool), but lacks details on error handling or performance characteristics. This is adequate for a simple tool but minimal.
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 front-loaded with the core purpose but includes meta-commentary about FastMCP that doesn't aid tool selection. The Args and Returns sections are structured but could be more integrated. Overall, it's reasonably concise but has some extraneous information (e.g., the example tool note), reducing efficiency.
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 low complexity (one optional parameter) and the presence of an output schema (implied by 'Returns' in description), the description is mostly complete. It covers purpose, parameters, and return values adequately. However, it lacks usage context or error information, which is a minor gap for such a simple tool.
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 meaning beyond the input schema, which has 0% description coverage. It explains the 'name' parameter as 'The name to greet. Defaults to "World".' This clarifies the parameter's purpose and default value, fully compensating for the schema's lack of descriptions. For a single parameter tool, this provides complete semantic understanding.
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: 'Return a friendly greeting.' It specifies the verb ('return') and resource ('greeting'), though it doesn't differentiate from siblings since this is a simple example tool with unrelated functionality to other tools on the server. The purpose is specific and 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 provides no guidance on when to use this tool versus alternatives. It mentions it's 'an example tool that demonstrates the basic pattern for creating MCP tools with FastMCP,' but this is meta-commentary rather than usage guidance. There's no indication of practical application contexts or when it might be preferred over other greeting-related tools (though none exist in siblings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conversationsA
List all conversations with metadata.
Returns conversations sorted by most recent message, including:
Participant information
Contact names for participants
Message count
Last message preview
Whether it's a group chat
Args: limit: Maximum number of conversations to return (default: 20) offset: Number of conversations to skip (default: 0)
Returns: Dictionary with conversations list and pagination metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 describes the return format (sorted by most recent message, includes specific metadata) and mentions pagination via limit/offset, which adds useful context. However, it lacks details on permissions, rate limits, or error handling, which are important for a list operation. The description does not contradict any annotations, as none are given.
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 well-structured and concise, with no wasted words. It front-loads the purpose, lists metadata details in bullet points for clarity, and separately documents args and returns. Each sentence adds value, making it easy to scan and understand 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 tool's moderate complexity (list operation with pagination), no annotations, and an output schema exists (implied by 'Returns'), the description is fairly complete. It covers purpose, parameters, and return structure adequately. However, it could improve by addressing behavioral aspects like permissions or error cases, but the output schema reduces the need to explain return values in detail.
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 input schema has 0% description coverage, so the description must compensate. It explicitly documents both parameters ('limit' and 'offset') with their purposes and default values, adding clear meaning beyond the schema. This fully compensates for the schema's lack of descriptions, though it does not provide additional semantic nuances like constraints or examples.
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: 'List all conversations with metadata.' It specifies the verb ('List') and resource ('conversations'), and details the metadata included (participant info, contact names, message count, etc.). However, it does not explicitly differentiate from sibling tools like 'get_recent_messages' or 'search_messages', which might have overlapping functions, so it misses full sibling 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. It does not mention sibling tools such as 'get_recent_messages' for recent messages or 'search_messages' for filtered searches, nor does it specify prerequisites or contexts for usage. This lack of comparative guidance leaves the agent without clear 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.
lookup_contactA
Look up a contact by phone number or email address.
Returns contact information if found in your Contacts, or None if not found. This tool explicitly resolves contacts from the macOS Contacts app.
Args: phone_or_email: The phone number or email address to look up.
Returns: Dictionary containing: - name: Contact's display name if found - matched_handle: The input phone/email that was matched - error: Error message if Contacts access is not available Or None if the contact is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| phone_or_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by disclosing key behaviors: it returns contact information or None if not found, explicitly resolves from macOS Contacts app, and includes error handling for access issues. It could improve by mentioning rate limits or permissions needed beyond access availability.
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 front-loaded with the core purpose, followed by concise details on behavior, parameters, and returns. Every sentence adds value with no redundancy, and it uses bullet points for clarity without unnecessary length.
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 low complexity (1 parameter, no nested objects) and the presence of an output schema (implied by the Returns section), the description is complete. It covers purpose, usage, behavior, parameters, and return values adequately, leaving no significant gaps for the agent.
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 has 0% description coverage, so the description fully compensates by explaining the single parameter 'phone_or_email' as 'The phone number or email address to look up.' This adds clear meaning beyond the bare schema, making the parameter's purpose and format evident.
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: 'Look up a contact by phone number or email address' with the specific verb 'look up' and resource 'contact'. It distinguishes itself from sibling tools like 'search_contacts' by focusing on exact lookup via identifier rather than broader 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 provides clear context for when to use this tool: to resolve contacts from the macOS Contacts app using a phone number or email. However, it does not explicitly state when not to use it or name alternatives like 'search_contacts' for broader searches, though the distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rebuild_search_indexA
Rebuild the entire search index from scratch.
This will:
Clear the existing search index
Re-index all messages from chat.db
Update sync metadata
Note: This does NOT generate embeddings. Use a separate tool for that.
Args: background: If True, runs the rebuild in a background thread and returns immediately with progress tracking info. If False, blocks until complete.
Returns: Dictionary with rebuild status and progress information.
| Name | Required | Description | Default |
|---|---|---|---|
| background | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 effectively describes the destructive nature ('clear the existing search index'), the data source ('re-index all messages from chat.db'), and side effects ('update sync metadata'). It also explains the blocking vs. background execution modes. However, it lacks details on permissions, rate limits, or error handling, which are relevant for a destructive 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 well-structured and front-loaded with the core purpose. Each sentence earns its place: the initial statement, the three-step breakdown, the exclusion note, and the parameter/return explanations. It avoids redundancy and is appropriately sized for the tool's complexity.
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 (destructive rebuild operation), no annotations, and the presence of an output schema, the description is highly complete. It covers the purpose, process, exclusions, parameter behavior, and return value context. The output schema handles return details, so the description doesn't need to explain return values further, making it well-rounded for the agent's needs.
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 fully compensate. It does this excellently by documenting the single parameter 'background' with clear semantics: explaining the two modes (True for background thread with immediate return, False for blocking until complete) and linking it to progress tracking. This adds significant value 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 specific action ('rebuild the entire search index from scratch') and distinguishes it from sibling tools by explicitly mentioning what it does NOT do ('does NOT generate embeddings'). It provides a three-step breakdown of the process, making the purpose unambiguous and distinct from other search-related 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 explicitly provides when-not-to-use guidance ('does NOT generate embeddings. Use a separate tool for that') and implicitly suggests alternatives for related tasks (e.g., use other tools for embedding generation or checking progress). It also clarifies the tool's scope relative to siblings like 'search_index_status' or 'get_rebuild_progress' by detailing its destructive rebuild process.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsA
Search for contacts/handles in the iMessage database.
Searches by phone number or email address. Returns matching handles with their service type and conversation count.
Args: query: Search query (phone number or email, partial matches supported) limit: Maximum number of results to return (default: 20)
Returns: Dictionary containing: - results: List of matching handles with id, service, conversation_count - total: Total number of matches - query: The normalized search query
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 describes the search functionality, partial matching support, and return format, but doesn't mention performance characteristics, rate limits, authentication requirements, or error conditions. The behavioral information is adequate but not comprehensive.
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 well-structured and front-loaded with the core purpose, followed by parameter details and return format. Every sentence adds value with no redundancy. The bullet-point formatting for Args and Returns enhances readability without 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 tool's moderate complexity (search with two parameters), no annotations, and the presence of an output schema (which covers return values), the description is complete enough. It explains what the tool does, how to use it, parameter semantics, and references the return structure without duplicating output schema details.
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 has 0% description coverage, so the description must compensate. It provides clear semantic meaning for both parameters: 'query' is explained as phone number or email with partial matching, and 'limit' is explained as maximum results with default value. This adds significant value beyond the bare schema, though it doesn't cover edge cases like query formatting.
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 searches for contacts/handles in the iMessage database using phone numbers or email addresses, distinguishing it from sibling tools like search_messages (which searches message content) and lookup_contact (which appears to be a different lookup mechanism). The verb 'search' and resource 'contacts/handles' are specific and 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 provides clear context for when to use this tool (searching by phone number or email address with partial matching), but it doesn't explicitly state when not to use it or mention alternatives like lookup_contact. The context is sufficient for basic usage but lacks comparative guidance against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_index_statusA
Get the current status of the search index.
Returns information about the search index including:
Total number of indexed messages
Total number of messages with embeddings
Last indexed message rowid
Last embedded message rowid
Schema version
Database path and size
Backfill status (if applicable)
Returns: Dictionary with search index status and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 effectively describes what the tool returns (status information and metadata in a dictionary format) and lists specific data points included. It doesn't mention performance characteristics, error conditions, or authentication requirements, but provides substantial behavioral context for a read-only status tool.
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 perfectly structured: a clear purpose statement followed by a bulleted list of returned information and a summary of the return format. Every sentence earns its place, with no redundant information. The bulleted list makes the information easily scannable.
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, read-only status check), the presence of an output schema, and the detailed description of what information is returned, the description is complete. It provides all necessary context for an agent to understand when and how to use this tool effectively without being overly verbose.
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 the baseline is 4. The description appropriately doesn't discuss parameters since none exist, focusing instead on the return value 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's purpose with a specific verb ('Get') and resource ('current status of the search index'), distinguishing it from siblings like 'get_rebuild_progress' (which tracks progress) and 'rebuild_search_index' (which performs an action). The description explicitly identifies what information is returned about the search index.
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 by listing the specific status information returned, suggesting it's for monitoring the search index. However, it doesn't explicitly state when to use this tool versus alternatives like 'get_rebuild_progress' (for rebuild status) or provide any exclusions or prerequisites for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesA
Search messages using hybrid keyword + semantic search.
Combines FTS5 full-text search with OpenAI embedding-based semantic search, merged using Reciprocal Rank Fusion (RRF) for optimal relevance.
This function is designed to handle partial failures gracefully:
If sync fails, search uses existing index
If semantic search fails, falls back to keyword search
If keyword search fails, returns empty results rather than crashing
Returns error information in response for visibility
Args: query: Search query text sender: Filter by sender phone/email (exact match after normalization) chat_id: Filter by specific conversation ID participants: Filter by chat participants (for group chats) after_date: Only messages after this date (ISO8601 format) before_date: Only messages before this date (ISO8601 format) service: Filter by "iMessage" or "SMS" search_mode: "hybrid" (default), "keyword" (FTS5 only), or "semantic" (vector only) limit: Results per page (default 100) offset: Pagination offset (default 0)
Returns: Dictionary with messages, pagination, and index_status including: - messages: List of matching messages with relevance scores - search_mode: The search mode that was used - fts5_matches: Number of keyword matches found - semantic_matches: Number of semantic matches found - pagination: Pagination metadata (total, limit, offset, has_more, next_offset) - index_status: Current state of the search index - errors: List of error messages encountered (if any) - warning: Warning message if partial results (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| sender | No | ||
| chat_id | No | ||
| participants | No | ||
| after_date | No | ||
| before_date | No | ||
| service | No | ||
| search_mode | No | hybrid | |
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and excels by detailing graceful failure handling (partial failures, fallbacks, error returns), search mode behaviors, and response structure. It provides rich behavioral context beyond basic functionality.
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?
Well-structured with clear sections (overview, behavioral notes, parameters, returns) but somewhat lengthy. Most sentences earn their place by providing essential technical details, though some parameter explanations could be more 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?
Given the tool's complexity (10 parameters, sophisticated search logic, graceful failure handling) and the presence of an output schema, the description is remarkably complete. It covers purpose, behavior, parameters, returns, and failure modes thoroughly.
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 for 10 parameters, the description fully compensates by explaining each parameter's purpose, format constraints (ISO8601, exact match after normalization), default values, and allowed values for search_mode. It 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 searches messages using hybrid keyword + semantic search, specifying the technical approach (FTS5 + OpenAI embeddings + RRF). It distinguishes from siblings like get_conversation_messages and get_recent_messages by emphasizing search capabilities rather than direct 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?
The description provides clear context about when to use this tool (for searching messages with flexible filtering and search modes) but doesn't explicitly mention when not to use it or name specific alternatives among siblings. It implies usage for search vs. direct retrieval tools.
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 via AppleScript.
IMPORTANT LIMITATIONS:
Can only send to contacts with EXISTING conversations in Messages
No delivery confirmation - the message may silently fail to send
Messages.app must be running
Requires Automation permission for Messages.app
Args: recipient: Phone number or email address of the recipient message: The message text to send service: Service type - "iMessage" or "SMS" (default: iMessage)
Returns: Dictionary with success status and any warnings/errors.
| Name | Required | Description | Default |
|---|---|---|---|
| recipient | Yes | ||
| message | Yes | ||
| service | No | iMessage |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It thoroughly documents critical behavioral traits: the limitation to existing conversations, lack of delivery confirmation, dependency on Messages.app running, and Automation permission requirement. This goes beyond what the input schema provides and addresses potential failure modes.
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 well-structured with clear sections (purpose, limitations, args, returns) and front-loads the core functionality. While comprehensive, it could be slightly more concise by integrating the 'Args' and 'Returns' sections more seamlessly, but every sentence adds value.
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 (sending messages with dependencies and limitations), no annotations, and an output schema that documents return values, the description is complete. It covers purpose, usage constraints, parameters, and behavioral expectations, leaving no significant gaps for the agent.
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 all three parameters: 'recipient' (phone number or email address), 'message' (text to send), and 'service' (iMessage or SMS with default). It adds meaningful context about parameter usage that isn't in 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 with specific verb ('Send a message') and resource ('to an existing conversation via AppleScript'), distinguishing it from sibling tools like 'list_conversations' or 'get_conversation_messages' which are read-only. It specifies the exact mechanism (AppleScript) and target (existing conversations).
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 explicit usage guidelines in the 'IMPORTANT LIMITATIONS' section, detailing when to use (for existing conversations) and when not to use (no delivery confirmation, requires Messages.app running and Automation permission). It distinguishes this tool from alternatives by specifying it's for sending messages, not retrieving or managing them like sibling tools.
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 there is some overlap between get_conversation_messages and get_recent_messages, as both retrieve messages with similar parameters. The hello_world tool also stands out as a trivial example that doesn't align with the iMessage domain, potentially causing confusion. However, the majority of tools are well-differentiated by their specific functions.
Tool names follow a consistent verb_noun pattern (e.g., get_conversation_messages, search_contacts, rebuild_search_index), with only one minor deviation: check_permissions uses a verb_noun format but is slightly less descriptive. Overall, the naming is predictable and enhances usability, though not perfect.
With 13 tools, the server is well-scoped for managing iMessage data, covering permissions, conversations, messages, contacts, search, and sending. Each tool serves a clear purpose, and the count is neither too sparse nor overwhelming, fitting typical use cases effectively.
The toolset provides comprehensive coverage for reading, searching, and sending iMessages, with robust features like permissions checks and index management. However, there are minor gaps, such as no tools for deleting messages or managing conversations (e.g., creating new chats), which could limit full lifecycle operations but are not critical for core functionality.
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
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Related MCP Servers
- 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
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to read, search, and send iMessages with features like contact name resolution, session grouping, and attachment listing. It provides intent-aligned tools to efficiently navigate conversation history and manage messages through natural language queries.6MIT
- FlicenseAqualityDmaintenanceEnables reading, searching, and sending iMessages on macOS by accessing the local messages database and utilizing AppleScript. Users can list conversations, search message history, and send messages to individuals or group chats directly through the Model Context Protocol.6
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to read, search, and send iMessages, manage contacts, and access attachments on macOS.16MIT
Appeared in Searches
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/jonmmease/jons-mcp-imessage'
If you have feedback or need assistance with the MCP directory API, please join our Discord server