Apple Messages MCP
Apple Messages MCP
Lies und durchsuche deine iMessage-, SMS- und RCS-Unterhaltungen von Claude aus, auf macOS.
Begleitprojekt zu claude-connector-apple-mail und claude-connector-apple-reminders.
Status: Lesen und Suchen sind solide. Senden funktioniert, ist aber bei einem
echten Versand ungetestet — der Skriptaufruf ist implementiert und seine Syntax
verifiziert, aber Apple hat send schon einmal kaputt gemacht, also behandle den
ersten echten Versand als Test. Siehe Nachrichten senden.
Werkzeuge
Werkzeug | Beschreibung |
| Gesamtzahlen, Anzahl ungelesener Nachrichten, Aufschlüsselung nach Dienst (iMessage/SMS/RCS), Datumsbereich |
| Unterhaltungen, zuletzt aktiv zuerst, mit Teilnehmern und einer Vorschau |
| Nachrichten in einer Unterhaltung, älteste zuerst, paginiert |
| Teilstring-Suche über den gesamten Verlauf, gefiltert nach Chat, Absender und Datumsbereich |
| Eine Nachricht vollständig, mit Anhängen und Zustellzeitstempeln |
| Anhangsbytes, base64-kodiert |
| Suchindex lokal aufwärmen oder neu aufbauen |
| Öffnet Nachrichten mit vorausgefülltem Text — du drückst auf Senden |
| An eine bestehende Unterhaltung senden; wird sofort zugestellt |
Related MCP server: jons-mcp-imessage
Anforderungen
macOS 13 Ventura oder neuer. RCS erfordert macOS 26 oder neuer.
Voller Festplattenzugriff für die Claude-App — zum Lesen erforderlich.
Automatisierungsberechtigung für Nachrichten — zum Senden und für Kontaktnamen erforderlich. macOS fragt diese automatisch ab.
Vollen Festplattenzugriff gewähren
Systemeinstellungen → Datenschutz & Sicherheit → Voller Festplattenzugriff
Claude aktivieren (falls nicht aufgelistet,
/Applications/Claude.appmit + hinzufügen)Claude beenden und neu öffnen. macOS cached diese Berechtigung beim Prozessstart, daher ist der Neustart zwingend — die Erweiterung schlägt sonst weiterhin fehl.
Warum dies vollen Festplattenzugriff benötigt, Apple Mail aber nicht
Die Apple-Mail-Erweiterung kommuniziert vollständig über Skripting mit Mail.app, daher benötigt sie keine besonderen Berechtigungen. Nachrichten kann so nicht funktionieren.
Das AppleScript-Wörterbuch von Nachrichten stellt genau vier Klassen bereit — account,
chat, participant, file transfer — und keine Nachrichtenklasse. Verifiziert auf
macOS 26.5.2:
$ osascript -e 'tell application "Messages" to get every text message of first chat'
syntax error: Expected "from", etc. but found identifier. (-2741)Chats und Teilnehmer lassen sich problemlos aufzählen; Nachrichteninhalte sind schlicht
nicht verfügbar. Der einzige Leseweg ist daher SQLite über ~/Library/Messages/chat.db,
das TCC-geschützt ist. Im Gegensatz zur Automatisierung kann der volle Festplattenzugriff
nicht programmatisch angefordert werden — der Benutzer muss ihn von Hand gewähren.
Die Erweiterung verwendet daher beide Berechtigungen für unterschiedliche Aufgaben:
Anliegen | Mechanismus | Berechtigung |
Nachrichten, Chats, Suche, Anhänge | SQLite auf | Voller Festplattenzugriff |
Kontaktnamen für rohe Handles | Nachrichten-Skripting | Automatisierung |
Senden | Nachrichten-Skripting ( | Automatisierung |
Verfassen-Fenster, vorausgefüllt |
| keine |
Kontaktnamen stammen aus der participant-Klasse von Nachrichten (full name), die die
Kontaktkarte des Benutzers liest. Das umgeht die separat geschützte Adressbuch-Datenbank —
wenn die Automatisierung verweigert wird, werden Handles einfach als rohe Zahlen angezeigt.
Implementierungshinweise
attributedBody. Seit Ventura ist message.text häufig NULL und der Inhalt liegt in
message.attributedBody als Apple-Typedstream — das veraltete NSArchiver-Format, das
plistlib nicht lesen kann. typedstream.py dekodiert es in reinem Python, daher benötigt
das Bundle keine PyObjC-Abhängigkeit. Es verankert sich am Klassennamen NSString/NSMutableString
und liest die längenpräfixierte UTF-8-Nutzlast nach dem +-Typmarker. Die Dekodierung ist
total: Ein nicht dekodierbarer Inhalt ergibt None, anstatt die Abfrage fehlschlagen zu lassen.
Zeitstempel. message.date ist Apple-Epoche (2001-01-01), in Sekunden vor macOS 13
und in Nanosekunden seitdem. Beides wird erkannt und behandelt.
Suche. chat.db enthält keinen Textindex, und die meisten Inhalte liegen nur in
attributedBody, wo SQL sie nicht sehen kann. Diese Kombination ist übler, als sie aussieht.
Die erste Implementierung erweiterte ihr Prädikat auf
m.text LIKE ? OR m.attributedBody IS NOT NULL und filterte den dekodierten Text erneut
in Python. Da diese zweite Klausel für fast jede moderne Zeile wahr ist, kürzte das LIMIT
der Abfrage den Scan auf die neuesten paar hundert Nachrichten, bevor der Python-Filter
überhaupt lief — so verschwand jedes ältere Treffer stillschweigend. Eine Suche nach einer
echten Nachricht ergab null Ergebnisse, anstatt langsam zu sein. Bei einem 916-MB-Verlauf
bedeutete das, dass die Suche effektiv nur die letzten paar Tage abdeckte.
Die Lösung besteht darin, einmal statt pro Abfrage zu dekodieren. index.py spiegelt
dekodierte, casefoldete Inhalte in ~/Library/Caches/apple-messages-mcp/search-index.db,
mit denen Suchen dann verknüpft werden — so gelten Treffer, Filter, Sortierung und LIMIT
für den gesamten Verlauf in SQL. Die Spiegelung ist:
Inkrementell. Neue Nachrichten werden über einen
message.ROWID-Wasserstand gefunden. Bearbeitungen und Rücknahmen verwenden eine vorhandene ROWID wieder, daher betrachtet jede Aktualisierung auch die letzten 2000 Zeilen — aber nur solche mit gesetztemdate_editedoder mit beiden Inhalts-Spalten jetzt NULL, da das erneute Dekodieren von 2000 Blobs bei jeder Suche echte Arbeit ist, die fast immer nichts findet. Eine Bearbeitung, die Nachrichten irgendwie nicht gestempelt hat, oder eine älter als dieses Fenster, benötigtrefresh_search_index(rebuild=True). Eine Verbesserung desattributedBody-Dekoders rechtfertigt ebenfalls einen Neuaufbau; das Erhöhen vonSCHEMA_VERSIONerzwingt einen.Casefoldet, und nur das. Anzeigetext stammt weiterhin aus chat.db, daher ist die Spiegelung rein ein Abgleichs-Orakel. Das Speichern von
str.casefold()halbiert ihre Größe und macht die Groß-/Kleinschreibung-unabhängige Übereinstimmung für Nicht-ASCII korrekt — SQLitesLIKEfaltet Groß-/Kleinschreibung nur für ASCII.Wegwerfbar. Sie liegt in
~/Library/Cachesund wird bei Löschung neu aufgebaut. Nichts hier schreibt in chat.db.
Kein FTS5, trotz des früheren Plans hier: FTS5 stimmt mit ganzen Token überein, daher
findet MATCH 'dentist' nie "mydentist", was enger ist als die Teilstring-Semantik, die
search_messages dokumentiert. Ein Teilstring-Scan über kompakten casefoldeten Text ist
bereits schnell, daher hätte FTS5 den Index für Semantiken verdoppelt, die wir nicht nutzen
können. Es später hinzuzufügen ist eine begrenzte Änderung, falls eine Abfrage jemals
tatsächlich schleppt.
Nur lesen und nicht sperrend. Verbindungen öffnen mode=ro und keine Anweisung
verändert die Datenbank. Wenn SQLite das Live-WAL nicht schreibgeschützt öffnen kann,
fällt es auf eine private Snapshot-Kopie zurück, sodass eine laufende Messages.app nie
gestört wird.
Tapbacks, Bearbeitungen, Antworten. Reaktionen werden aus associated_message_type
dekodiert (2000–2007, mit dem 3000er-Bereich als deren Entfernungen), verschachtelte
Antworten aus thread_originator_guid und Bearbeitungen aus date_edited.
Nachrichten senden
Nachrichten hat kein Entwurfsobjekt, daher gibt es kein genaues Analogon zum Entwurf-zuerst-Design der Mail-Erweiterung. Der Schreibpfad kommt daher auf zwei Ebenen, und sie sind bewusst nicht gleichwertig.
compose_message — die sichere Standardeinstellung. Öffnet Nachrichten mit Empfänger
und Inhalt vorausgefüllt über das imessage: / sms: URL-Schema und stoppt. Ein Mensch
liest und drückt auf Senden, daher verlässt nichts die Maschine auf Claudes Anweisung.
Dies ist auch der einzige Weg, eine neue Unterhaltung zu beginnen. Benötigt überhaupt
keine Berechtigung.
send_message — stellt sofort zu. Verwendet das send der Skriptschnittstelle und
kann nicht rückgängig gemacht werden. Es nimmt eine chat_id statt einer Telefonnummer,
was keine Einschränkung, sondern der Punkt ist: Das Wörterbuch akzeptiert entweder einen
participant oder einen chat, und das Adressieren eines bestehenden Chats per GUID lässt
Nachrichten den Transport wählen (iMessage / SMS / RCS), anstatt dass der Aufrufer rät
und jemandem auf iMessage still eine SMS sendet. Es erfordert außerdem confirm=True,
rein als Schutz davor, versehentlich ausgelöst zu werden.
Was verifiziert ist und was nicht
Bestätigt auf macOS 26.5.2 — das Wörterbuch stellt bereit
send : direct-parameter (file | text), to: (participant | chat)die service type-Aufzählung ist SMS, iMessage, RCS, chat hat eine GUID-
id-Eigenschaft zum Adressieren, und das generierte AppleScript kompiliert.
Nicht bestätigt: dass ein echter Versand tatsächlich zustellt. Apple hat AppleScript
send schon einmal kaputt gemacht, und seine Präsenz im Wörterbuch war nie ein Beweis,
dass es funktioniert. Nichts in der Testsuite stellt eine Nachricht zu, daher ist der erste
echte Versand das Experiment. Wenn es fehlschlägt, ist shortcuts run mit einer
"Nachricht senden"-Aktion der nächste Versuch, den es wert ist.
Nachrichtentext erreicht AppleScript als osascript-Argument (on run argv), anstatt in
den Skriptquelltext interpoliert zu werden, sodass ein Inhalt mit doppeltem Anführungszeichen
inert ist, anstatt ein Syntaxfehler oder eine Injektion zu sein.
Das Senden von Anhängen ist nicht verdrahtet, obwohl der file-Direktparameter bedeutet,
dass es in Reichweite ist.
Entwicklung
python3 tests/test_db.py # SQL, decoder, and search-index tests
python3 tests/test_send.py # compose URLs, send guards, argv safety
python3 tools/probe_schema.py # verify the real chat.db (needs Full Disk Access)
./build.sh # test, validate manifest, pack the .mcpbtests/test_db.py erstellt Wegwerf-Datenbanken mit dem echten Schema, sodass das SQL ohne
vollen Festplattenzugriff oder echten Nachrichtenverlauf validiert werden kann. Eine davon
vergrabet einen Treffer unter 3000 neueren Nachrichten, was der Regressionstest für den oben
beschriebenen abgeschnittenen Suchfehler ist.
tests/test_send.py sendet nie etwas oder öffnet ein Fenster: Es deckt den URL-Builder,
die Schutzklauseln und das exakte osascript-argv ab — daher ist es überall sicher und kann
entsprechend nicht sagen, ob Apples send funktioniert.
Keine der beiden Suiten berührt den echten Suchindex; beide injizieren einen temporären.
Lizenz
MIT
This server cannot be installed
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 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
- AlicenseAqualityDmaintenanceEnables AI assistants to read iMessage history and send messages on macOS. Supports conversation listing, message search with keyword and semantic modes, contact lookup, and sending messages to existing conversations.1311MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to read and search through iMessage, SMS, and RCS conversations, including mixed-protocol group chats with Android users. It decodes binary message data from the macOS Messages database to provide a comprehensive view of message history.19MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to send and read iMessages on macOS, with human approval required for sending and no auto-replies.51Apache 2.0
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.
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/falconbradley/claude-connector-apple-messages'
If you have feedback or need assistance with the MCP directory API, please join our Discord server