Skip to main content

iMessage Gateway CLI

macOS Python PyPI License Claude Code

The fastest iMessage integration for Claude Code. Direct CLI architecture delivers 19x faster performance than MCP-based alternatives.

Features

  • Send Messages: Send iMessages using natural language
  • Read Messages: Retrieve message history with contacts or phone numbers
  • Smart Contact Lookup: Fuzzy matching for contact names
  • Semantic Search (RAG): AI-powered search across iMessages, SuperWhisper, Notes
  • Follow-up Detection: Find conversations needing response
  • Group Chats: List and read group conversations
  • Analytics: Conversation patterns and statistics

Performance

Operation Gateway CLI MCP-based Speedup
List contacts 40ms ~763ms 19x
Find messages 43ms ~763ms 18x
Unread messages 44ms ~763ms 17x
Groups 61ms ~763ms 12x
Semantic search 150ms ~900ms 6x

Requirements

  • macOS (required - iMessage is macOS only)
  • Python 3.9+
  • Full Disk Access permission (for reading message history)

Installation

See INSTALLATION.md for detailed setup instructions.

Quick Install (2 minutes)

# Install the package
pip install wolfies-imessage-gateway

# Verify installation
wolfies-imessage --version

# Test it
wolfies-imessage recent --limit 5

Grant Full Disk Access

Terminal needs access to read your iMessage database:

  1. Open System Settings → Privacy & Security → Full Disk Access
  2. Click the + button
  3. Add Terminal.app (or your terminal emulator)
  4. Restart Terminal

Basic Usage

# Check recent messages
wolfies-imessage recent --limit 10

# Send a message
wolfies-imessage send "John" "Hey, are you free for coffee?"

# View all commands
wolfies-imessage --help

Command Reference

Messaging

# Send to contact
python3 gateway/imessage_client.py send "John" "Hello!"

# Send to phone number directly
python3 gateway/imessage_client.py send-by-phone "+14155551234" "Hi there!"

# Add a new contact
python3 gateway/imessage_client.py add-contact "Jane Doe" "+14155559876"

Reading

# Messages with a contact
python3 gateway/imessage_client.py messages "John" --limit 20 --json

# Find messages (keyword search)
python3 gateway/imessage_client.py find "John" --query "meeting" --json

# Recent across all contacts
python3 gateway/imessage_client.py recent --limit 50 --json

# Unread messages
python3 gateway/imessage_client.py unread --json

# Recent phone handles
python3 gateway/imessage_client.py handles --days 30 --json

# Messages from unknown senders
python3 gateway/imessage_client.py unknown --days 7 --json

# Attachments
python3 gateway/imessage_client.py attachments "John" --json

# Voice messages
python3 gateway/imessage_client.py voice --json

# Links shared
python3 gateway/imessage_client.py links --days 30 --json

# Message thread
python3 gateway/imessage_client.py thread "<message-guid>" --json

# Scheduled messages
python3 gateway/imessage_client.py scheduled --json

# Conversation summary
python3 gateway/imessage_client.py summary "John" --days 7 --json

Groups

# List group chats
python3 gateway/imessage_client.py groups --json

# Messages from a group
python3 gateway/imessage_client.py group-messages --group-id "chat123456" --json

Analytics

# Conversation analytics
python3 gateway/imessage_client.py analytics "John" --days 30 --json

# Follow-ups needed
python3 gateway/imessage_client.py followup --days 7 --json

# Reactions
python3 gateway/imessage_client.py reactions "John" --json

Contacts

# List all contacts
python3 gateway/imessage_client.py contacts --json

Semantic Search / RAG

# Index iMessages for semantic search
python3 gateway/imessage_client.py index --source=imessage --days 30

# Index SuperWhisper transcriptions
python3 gateway/imessage_client.py index --source=superwhisper

# Index Notes
python3 gateway/imessage_client.py index --source=notes

# Index all local sources
python3 gateway/imessage_client.py index --source=local

# Semantic search
python3 gateway/imessage_client.py search "dinner plans with Sarah" --json

# AI-formatted context
python3 gateway/imessage_client.py ask "What restaurant did Sarah recommend?"

# Knowledge base stats
python3 gateway/imessage_client.py stats --json

# List available/indexed sources
python3 gateway/imessage_client.py sources --json

# Clear indexed data
python3 gateway/imessage_client.py clear --source=imessage --force

Architecture

Messages.db (SQLite) ←─ ~/Library/Messages/chat.db
        ↓
MessagesInterface ────→ SQLite queries (read)
        │                AppleScript → Messages.app (send)
        ↓
ContactsManager ──────→ config/contacts.json (fuzzy matching)
        ↓
Gateway CLI ──────────→ gateway/imessage_client.py
        ↓
Claude Code ──────────→ Bash tool calls

Why Gateway CLI?

The Gateway CLI architecture bypasses MCP framework overhead entirely:

  • Direct execution: Python script runs immediately, no JSON-RPC initialization
  • No session startup: MCP servers have ~700-800ms cold start per session
  • Smaller footprint: No MCP SDK dependency, simpler codebase
  • Same reliability: Uses identical MessagesInterface code for all operations

Claude Code Integration

Using the Skill

The imessage-gateway skill provides natural language access:

/imessage-gateway unread
/imessage-gateway send John "Running late!"
/imessage-gateway search "meeting next week"

Bash Pre-approval

Ensure your settings include:

Bash(python3:*::*)

Configuration

Contact Format

Contacts are stored in config/contacts.json:

{
  "contacts": [
    {
      "name": "John Doe",
      "phone": "14155551234",
      "relationship_type": "friend",
      "notes": "Optional notes"
    }
  ]
}

Phone numbers can be in any format - they're normalized automatically.

Troubleshooting

"Contact not found"

  • Run python3 scripts/sync_contacts.py to sync contacts
  • Check config/contacts.json exists and has contacts
  • Try partial names (e.g., "John" instead of "John Doe")

"Permission denied" reading messages

  • Grant Full Disk Access to Terminal/Python
  • Restart Terminal after granting permission
  • Verify: ls ~/Library/Messages/chat.db

Messages show "[message content not available]"

  • Some older messages use a different format
  • Attachment-only messages don't have text content
  • This is normal for some message types

Development

# Run tests
pytest tests/ -v

# Run performance benchmarks
python3 benchmarks/run_benchmarks.py

# Sync contacts
python3 scripts/sync_contacts.py

Privacy & Security

  • All data stays local on your Mac
  • No cloud services for core functionality
  • Contacts file is gitignored by default
  • Message history accessed read-only
  • Optional OpenAI API for semantic search embeddings

MCP Server (Archived)

The MCP server has been archived in mcp_server_archive/. See mcp_server_archive/ARCHIVED.md for restoration instructions if needed.

License

MIT License - see LICENSE for details.


Built for use with Claude Code

Metadata

Release files for wolfies-imessage-gateway 4.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wolfies-imessage-gateway 4.0.0
File Size Uploaded
wolfies_imessage_gateway-4.0.0.tar.gz 191.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wolfies-imessage-gateway 4.0.0
File Interpreter ABI Platform
wolfies_imessage_gateway-4.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 326.3 kB

Release files / wolfies_imessage_gateway-4.0.0.tar.gz

Download URL wolfies_imessage_gateway-4.0.0.tar.gz
Size 191.7 kB
Tags Source
SHA-256 checksum
How to use checksums
adf2675e0dde955d8b589d7f395711e122e4e9b82aebe1e20fde47ad82ede28b
BLAKE2b-256 checksum
How to use checksums
548bf38389d472c41ab2197d914d04a130b1b200788e553ef316d6625ba2a2c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / wolfies_imessage_gateway-4.0.0-py3-none-any.whl

Download URL wolfies_imessage_gateway-4.0.0-py3-none-any.whl
Size 134.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
eb0f9c6561b974f538b59d0889c505b7afe2044f864593d33746e7a7a0e3fc5b
BLAKE2b-256 checksum
How to use checksums
650eefaeea2bee70559315316df97ec71187657d318a5413ec57772ba13840e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

4.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page