MCP Connector

Automate macOS Messages for Universal Communication

Python MCP bridge to macOS Messages - read, search, and send iMessage/SMS with automatic delivery fallback and attachment access.

Works with macospythondocker

91
Spark score
out of 100
Updated last month
Version 0.9.2
Models
universal

Add to Favorites

Why it matters

Bridge your macOS Messages app to send and receive messages universally across iMessage and SMS/RCS. Intelligently handles recipient availability and falls back to SMS when iMessage is not an option.

Outcomes

What it gets done

01

Send messages via iMessage or SMS/RCS with smart fallback.

02

Read recent messages from the macOS Messages app.

03

Filter messages by contact and perform fuzzy content searches.

04

Check iMessage availability for recipients before sending.

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/vb-mac-messages-mcp | bash

Capabilities

Tools your agent gets

send_message

Send a message via iMessage or SMS/RCS with intelligent fallback based on recipient availability.

read_messages

Read recent messages from the macOS Messages app with optional contact and time filtering.

search_messages

Search message content with fuzzy matching across the Messages app database.

check_imessage_availability

Check if a recipient has iMessage enabled before sending a message.

Overview

mac-messages-mcp server

mac-messages-mcp lets an AI assistant read, search, and send macOS Messages with automatic iMessage/SMS fallback and progressive attachment access. Use it for AI-assisted messaging and search on macOS; requires Full Disk Access granted to the running client, and only one server instance should run at a time.

What it does

mac-messages-mcp bridges the macOS Messages app so an AI assistant can read recent messages, filter by contact or group chat, fuzzy-search message content, and send messages with automatic iMessage-or-SMS/RCS delivery based on recipient availability - falling back to SMS seamlessly for Android recipients in mixed groups.

Attachment access uses progressive disclosure across three tiers: message search tools annotate results with a compact attachment summary (id, MIME type, filename); tool_search_attachments returns attachment metadata only, filtered by date/contact/MIME type, without scanning message text; and tool_get_attachment fetches the actual file - images return inline (HEIC converted to PNG), while PDFs/video/audio return as a filesystem path, with inline image bytes capped at 5MB to avoid context blowup. Stickers and link-preview payloads are filtered out by default.

When to use - and when NOT to

Use this connector when you want an assistant to search your iMessage/SMS history, check if a contact has iMessage before sending, find shared photos/PDFs, or send a message that automatically picks the right delivery channel.

Do not use it without granting Full Disk Access to your terminal or Claude Desktop/Cursor in System Settings - the Messages database can't be read otherwise. Only run one instance of the server (Cursor or Claude Desktop, not both) to avoid conflicts, and use E.164 phone format (+14155551234) for reliable direct sends.

Inputs and outputs

Message tools take time ranges, contact filters, chat IDs, or search queries. Send tools take a recipient (phone number) and message text. Attachment tools take date ranges, contact, MIME type filters, or a specific attachment_id. Outputs are message lists (with attachment annotations), search results, delivery-method confirmation (iMessage vs SMS), or fetched attachment content/paths.

Capabilities

  • tool_get_recent_messages / tool_fuzzy_search_messages: read recent messages or search content, with attachment annotations
  • tool_get_chats: get chat IDs for filtering a specific group conversation chronologically
  • send_message / check_imessage_availability: send via iMessage with automatic SMS/RCS fallback; check delivery method before sending
  • tool_find_contact: resolve a contact to a send-ready phone number
  • tool_search_attachments: search attachment metadata by date/contact/MIME type without scanning message text
  • tool_get_attachment: fetch an attachment by ID (inline for images, filesystem path for PDF/video/audio)

How to install

uv pip install mac-messages-mcp

Grant Full Disk Access to your terminal/client first, then configure Claude Desktop:

{
  "mcpServers": {
    "messages": {
      "command": "uvx",
      "args": ["mac-messages-mcp"]
    }
  }
}

Requires macOS 11+, Python 3.10+, and uv.

Who it's for

macOS users who want an AI assistant to search, read, and send iMessage/SMS conversations and find shared attachments from their own Messages history.

Source README

Mac Messages MCP

A Python bridge for interacting with the macOS Messages app using MCP (Multiple Context Protocol).

PyPI Downloads

Trust Score
mac_messages_mcp MCP score

a-diagram-of-a-mac-computer-with-the-tex_FvvnmbaBTFeKy6F2GMlLqA_IfCBMgJARcia1WTH7FaqwA

Verified on MseeP

Quick Install

For Cursor Users

Install MCP Server

Click the button above to automatically add Mac Messages MCP to Cursor

For Claude Desktop Users

See the Integration section below for setup instructions.

Features

  • Universal Message Sending: Automatically sends via iMessage or SMS/RCS based on recipient availability
  • Smart Fallback: Seamless fallback to SMS when iMessage is unavailable (perfect for Android users)
  • Message Reading: Read recent messages from the macOS Messages app
  • Contact Filtering: Filter messages by specific contacts or phone numbers
  • Group Chat Filtering: Use chat IDs from tool_get_chats to read one group conversation chronologically
  • Fuzzy Search: Search through message content with intelligent matching
  • Attachments: Find and view photos, PDFs, and other attachments shared in conversations
  • iMessage Detection: Check if recipients have iMessage before sending
  • Cross-Platform: Works with both iPhone/Mac users (iMessage) and Android users (SMS/RCS)

Working with attachments

Attachment access uses progressive disclosure - discovery is cheap, fetching is deliberate:

  1. Tier 1 - discovery in message search. tool_get_recent_messages and tool_fuzzy_search_messages annotate messages that have attachments with a compact summary like [attachments: #42 image/jpeg (invitation.jpg)]. The id lets you fetch the file later.
  2. Tier 2 - attachment-first search. tool_search_attachments(start_date, end_date, contact, mime_type, limit) returns metadata only (id, MIME type, filename, size, sender) - useful for "find all images Elizabeth sent in April 2026" without scanning message text.
  3. Tier 3 - fetch. tool_get_attachment(attachment_id) returns the file. Image MIME types come back inline (HEIC is converted to PNG so it can be viewed directly). PDFs, video, and audio come back as a filesystem path the agent can read with its own tools. Inline image bytes are capped at 5MB by default to avoid context blowup; oversized images fall back to path return.

Stickers, link-preview "balloon" payloads, and .pluginPayloadAttachment containers are filtered out by default.

Recipient formats

For direct sends, E.164 phone numbers with a leading + are the most reliable format, such as +14155551234. Bare digit phone numbers with a country code are normalized before sending, and 10-digit US numbers are sent as +1.... tool_find_contact returns phone matches in the same send-ready format.

Prerequisites

  • macOS (tested on macOS 11+)
  • Python 3.10+
  • uv package manager

Installing uv

If you're on Mac, install uv using Homebrew:

brew install uv

Otherwise, follow the installation instructions on the uv website.

⚠️ Do not proceed before installing uv

Installation

Full Disk Access Permission

⚠️ This application requires Full Disk Access permission for your terminal or application to access the Messages database.

To grant Full Disk Access:

  1. Open System Preferences/Settings > Security & Privacy/Privacy > Full Disk Access
  2. Click the lock icon to make changes
  3. Add your terminal app (Terminal, iTerm2, etc.) or Claude Desktop/Cursor to the list
  4. Restart your terminal or application after granting permission

Integration

Claude Desktop Integration

Option 1: Claude Desktop Extension

This repo includes an MCPB-compatible manifest.json for Claude Desktop's one-click extension flow.

yarn global add @anthropic-ai/mcpb
mcpb pack

Install the generated .mcpb file from Claude Desktop Settings > Extensions > Advanced settings > Install Extension....

Claude Desktop, or the terminal used to package/run the extension, still needs Full Disk Access to read Messages.

Building the extension

Build the .mcpb with the build script:

python scripts/build_mcpb.py                  # build for the host architecture
python scripts/build_mcpb.py --arch x86_64    # build for Intel macs

By default it vendors a uv binary into the bundle (bin/uv) so the extension also runs on machines without uv installed - that binary is architecture specific (build one .mcpb per arch) and downloads Python and dependencies on first launch (network required once). Pass --no-bundle to pack against the system uv instead; see python scripts/build_mcpb.py --help for all options.

Option 2: Manual Config
  1. Go to Claude > Settings > Developer > Edit Config > claude_desktop_config.json
  2. Add the following configuration:
{
    "mcpServers": {
        "messages": {
            "command": "uvx",
            "args": [
                "mac-messages-mcp"
            ]
        }
    }
}

Cursor Integration

Option 1: One-Click Install (Recommended)

Install MCP Server

Option 2: Manual Setup

Go to Cursor Settings > MCP and paste this as a command:

uvx mac-messages-mcp

⚠️ Only run one instance of the MCP server (either on Cursor or Claude Desktop), not both

Docker Container Integration

If you need to connect to mac-messages-mcp from a Docker container, you'll need to use the mcp-proxy package to bridge the stdio-based server to HTTP.

This repository also includes a Dockerfile for catalog checks and container builds:

docker build -t mac-messages-mcp .

Messages.app automation is macOS-only and will not work inside a Linux container. Container use is primarily for MCP catalog compatibility and read-only database experiments with mounted data.

Setup Instructions
  1. Install mcp-proxy on your macOS host:
npm install -g mcp-proxy
  1. Start the proxy server:
# Using the published version
npx mcp-proxy uvx mac-messages-mcp --port 8000 --host 0.0.0.0

# Or using local development (if you encounter issues)
npx mcp-proxy uv run python -m mac_messages_mcp.server --port 8000 --host 0.0.0.0
  1. Connect from Docker:
    Your Docker container can now connect to:
  • URL: http://host.docker.internal:8000/mcp (on macOS/Windows)
  • URL: http://<host-ip>:8000/mcp (on Linux)
  1. Docker Compose example:
version: '3.8'
services:
  your-app:
    image: your-image
    environment:
      MCP_MESSAGES_URL: "http://host.docker.internal:8000/mcp"
    extra_hosts:
      - "host.docker.internal:host-gateway"  # For Linux hosts
  1. Running multiple MCP servers:
# Terminal 1 - Messages MCP on port 8001
npx mcp-proxy uvx mac-messages-mcp --port 8001 --host 0.0.0.0

# Terminal 2 - Another MCP server on port 8002
npx mcp-proxy uvx another-mcp-server --port 8002 --host 0.0.0.0

Note: Binding to 0.0.0.0 exposes the service to all network interfaces. In production, consider using more restrictive host bindings and adding authentication.

Option 1: Install from PyPI

uv pip install mac-messages-mcp

Option 2: Install from source

# Clone the repository
git clone https://github.com/carterlasalle/mac_messages_mcp.git
cd mac_messages_mcp

# Install dependencies
uv install -e .

Usage

Smart Message Delivery

Mac Messages MCP automatically handles message delivery across different platforms:

  • iMessage Users (iPhone, iPad, Mac): Messages sent via iMessage
  • Android Users: Messages automatically fall back to SMS/RCS
  • Mixed Groups: Optimal delivery method chosen per recipient
# Send to iPhone user - uses iMessage
send_message("+1234567890", "Hey! This goes via iMessage")

# Send to Android user - automatically uses SMS
send_message("+1987654321", "Hey! This goes via SMS") 

# Check delivery method before sending
check_imessage_availability("+1234567890")  # Returns availability status

As a Module

from mac_messages_mcp import get_recent_messages, send_message

# Get recent messages
messages = get_recent_messages(hours=48)
print(messages)

# Send a message (automatically chooses iMessage or SMS)
result = send_message(recipient="+1234567890", message="Hello from Mac Messages MCP!")
print(result)  # Shows whether sent via iMessage or SMS

As a Command-Line Tool

# Run the MCP server directly
mac-messages-mcp

Development

Versioning

This project uses semantic versioning. See VERSIONING.md for details on how the versioning system works and how to release new versions.

To bump the version:

python scripts/bump_version.py [patch|minor|major]

Security Notes

This application accesses the Messages database directly, which contains personal communications. Please use it responsibly and ensure you have appropriate permissions.

MseeP.ai Security Assessment Badge

Star History

Star History Chart

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.