Skip to main content
Glama

Cupertino

Bringen Sie Ihren Agenten in Ihren alltäglichen Apple-Apps zum Einsatz.

MCP-Server für die Apple-Apps, die bereits auf Ihrem Mac sind, und die signierte App, die ihnen ihre Berechtigungen einmal statt für jede einzeln gewährt – für jeden Agenten, der MCP spricht, nicht für einen Host.

Inoffiziell. Nicht mit Apple verbunden. Diese steuern die Apps, die bereits auf Ihrem Mac sind.

In Verwendung

Schauen Sie, wie ich in meinem Arbeitspostfach schreibe, und entwerfen Sie diese Antwort im gleichen Ton.

Stellen Sie alles über den Atlas-Start aus meiner Mail, meinen Notizen und meinem Kalender zusammen. Was schulde ich noch?

Verwandle die Aktionspunkte aus dem gestrigen Kunden-Thread in Erinnerungen, fällig am Freitag.

Jede dieser Aussagen trägt eine Einschränkung – ein Konto, eine Datumsgrenze, einen Filter. Das ist der Teil, den der naive osascript-Pfad in 74 Sekunden beantwortet oder falsch beantwortet, und der Grund, warum ein Server seinen Platz verdient: er hält, was das Modell sonst jede Sitzung neu ableiten würde. Die Messungen sind in docs/verify.md; was die Alternativen kosten, steht in docs/alternatives.md.

Die letzte benötigt das Schreib-Gate für Erinnerungen geöffnet. Schreibvorgänge sind pro Oberfläche deaktiviert, bis Sie sie einschalten, und der Schalter entscheidet, ob die mutierenden Werkzeuge überhaupt registriert sind – ein Agent mit deaktivierten Schreibvorgängen kann nicht sehen, dass sie existieren.

Related MCP server: apple-mcp

Oberflächen

Oberfläche

Paket

Status

Mail

packages/mail

implementiert – 18 Werkzeuge, Suche/Lesen/Anhänge + gesteuerte Schreibvorgänge

Notizen

packages/notes

implementiert – 12 Werkzeuge, Suche/Lesen/Anhänge + gesteuerte Schreibvorgänge

Erinnerungen

packages/reminders

implementiert – 11 Werkzeuge, Listen/Suche/Daten + gesteuerte Schreibvorgänge

Kalender

packages/calendar

implementiert – 9 Werkzeuge, Bereiche/Suche/Wiederholung + gesteuerte Schreibvorgänge

Kontakte

packages/contacts

implementiert – 7 Werkzeuge, löst Handles zu Namen auf + gesteuerte Schreibvorgänge

Nachrichten

packages/messages

implementiert – 6 Werkzeuge, Chats/Suche/decodierter Text + gesteuertes Senden

Safari

packages/safari

implementiert – 6 Werkzeuge, Verlauf/Tabs/Leseliste, nur lesen

packages/core

gemeinsam: die osascript-Grenze, TCC-bewusste Fehler, ro SQLite

Jede Oberfläche ist ein eigener Server und ein eigenes npm-Paket, sodass ein Host nur die Werkzeuge lädt, die er möchte. Sie teilen sich ein Bundle und eine Vollzugriff-auf-Festplatte-Genehmigung, was der ganze Grund ist, warum sie zusammenleben – siehe docs/distribution.md.

Schnellstart

Jeder Server ist auf npm und läuft direkt über npx – für Claude Code eine .mcp.json neben Ihrem Projekt:

{
  "mcpServers": {
    "apple-mail": {
      "command": "npx",
      "args": ["-y", "@mgcrea/mcp-apple-mail"]
    },
    "apple-notes": {
      "command": "npx",
      "args": ["-y", "@mgcrea/mcp-apple-notes"]
    }
  }
}

Die Pakete sind MIT und benötigen keinen Lizenzschlüssel. Was sie benötigen, ist eine Berechtigung, und auf npm gewähren Sie sie dem, was sie startet – Ihrem Editor, Ihrem Terminal –, was der Handel ist, den die signierte Cupertino.app vermeiden soll: eine Vollzugriff-auf-Festplatte-Genehmigung, gehalten von einer notarisierten Binärdatei, statt einer pro Host. Siehe docs/licensing.md.

Oder führen Sie sie aus dem Quellcode aus:

git clone https://github.com/mgcrea/mcp-cupertino.git
cd mcp-cupertino
pnpm install
pnpm build

und zeigen Sie dann Ihrem Host auf packages/<surface>/dist/cli.js mit absolutem Pfad.

Schreibvorgänge sind deaktiviert, es sei denn, Sie fragen danach – siehe Konfiguration.

Wenn Sie stattdessen über die Menüleisten-App laufen, wird jeder Server über die Brücke geleitet, sodass der Vollzugriff auf die Festplatte Cupertino gewährt wird und nicht dem Editor, der den Server gestartet hat:

make run      # build Cupertino.app, point it at packages/*/dist, launch it
make smoke    # handshake every server through the bridge

Die eingecheckte .mcp.json des Repos ist für diesen Pfad verdrahtet. make allein listet jedes Ziel auf.

Beachten Sie die unterschiedlichen Servernamen. Von Hand wie oben verdrahtet, ist ein Server apple-mail und läuft unter der Genehmigung seines Host-Prozesses. Von Cupertino verdrahtet ist er cupertino-mail, weil dieser Eintrag auf die Brücke der App zeigt und unter der Genehmigung der App läuft. Zwei Namen für zwei Bereitstellungen, und Sie können beide haben. Die App berührt nur ihre eigenen cupertino-*-Schlüssel – ein apple-mail-Eintrag, der zu einem anderen Server gehört, bleibt unberührt.

Cupertino ist Maschinenkonfiguration, keine Projektabhängigkeit, also gehört es in eine benutzerspezifische Konfiguration: eine Datei für Claude Desktop, Cursor, LM Studio und Windsurf, und --scope user für die CLIs, was die kopierbaren Befehle der App verwenden. Bewusst nicht --scope project, das eine .mcp.json schreibt, die zum Committen gedacht ist – dieser Eintrag ist ein absoluter Pfad in ein Bundle auf einem Mac, unterstützt durch die Vollzugriff-auf-Festplatte-Genehmigung einer Person, und er wäre für einen Teamkollegen nutzlos und unweise, ihn anzubieten.

Welche Clients geschrieben werden und welche einen Befehl erhalten, ist keine Frage der Beliebtheit. Die App führt eine Zusammenführung in eine Konfiguration nur durch, wenn sie striktes JSON mit Servern unter mcpServers ist; Visual Studio Code ist JSONC und Codex ist TOML, und das erneute Serialisieren würde die Kommentare in einer von Hand gepflegten Datei löschen. Claude Codes ~/.claude.json ist striktes JSON, aber es enthält Anmeldeinformationen und laufende Sitzungen schreiben gleichzeitig hinein, sodass ein Lesen-Ändern-Schreiben von einer Menüleiste die Änderung eines anderen verlieren könnte. Diese drei erhalten eine Zeile zum Einfügen. ChatGPT fehlt vollständig: Es akzeptiert entfernte HTTP-Connector und kann keinen lokalen stdio-Server starten.

Die eigene .mcp.json dieses Repos ist die Ausnahme, und sie benennt ihre Server cupertino-*-dev absichtlich: Sie zeigt auf apps/apple/.build, sodass die Arbeit an der App bedeutet, die Entwicklungsversion und die installierte nebeneinander zu haben. Claude Code meldet Server mit demselben Namen in zwei Bereichen als Konflikt, anstatt einen auszuwählen, also ist das Suffix das, was beide nutzbar hält.

Cupertino.app benötigt macOS 26 oder neuer – sein Symbol ist ein Icon-Composer-Bundle, das nichts Älteres rendern kann. Die Server selbst sind einfaches Node und haben keine solche Untergrenze; nur die Menüleisten-App hat sie.

Berechtigungen

Zwei separate macOS-Genehmigungen, und sie landen auf dem Prozess, der den Server gestartet hat – Ihrem Editor, Ihrem Terminal oder Cupertino – niemals auf Mail, Notizen oder Erinnerungen selbst.

Genehmigung

Benötigt für

Vollzugriff auf die Festplatte

die Index-Spur: Mail-Suche, Anhangsbytes

Automatisierung (pro Ziel-App, aufgefordert)

die Apple-Events-Spur: Konten, Postfächer, alle Schreibvorgänge

Kontakte (aufgefordert)

die Kontakte-Oberfläche – ihr Speicher liegt nicht hinter Vollzugriff auf die Festplatte

Systemeinstellungen → Datenschutz & Sicherheit → Vollzugriff auf die Festplatte → die startende App hinzufügen, dann neu starten. Das Gewähren an Mail.app bewirkt nichts; der Leser benötigt die Berechtigung, nicht Mail.

Was ohne Vollzugriff auf die Festplatte funktioniert:

Oberfläche

Ohne die Genehmigung

Mail

nur Konten, Postfächer und Schreibvorgänge – die Suche fällt auf Apple Events bei ~74 s zurück

Notizen

voll nutzbar unter etwa 5.000 Notizen; nur Anhangsbytes benötigen die Genehmigung

Erinnerungen

nutzbar, aber ganztägige Daten und Unteraufgaben benötigen den Speicher – der Container kann ohne sie nicht einmal aufgelistet werden

Kalender

nichts. Die einzige Oberfläche ohne Apple-Events-Lesepfad, der schnell genug für einen Fallback ist – eine 90-Tage-Bereichsabfrage kostet 3,4 s –, also benötigt jede Leseoperation die Genehmigung. Schreibvorgänge funktionieren weiterhin.

Kontakte

nichts – aber sie möchte keinen Vollzugriff auf die Festplatte. Ihr Speicher liegt hinter der separaten Kontakte-Berechtigung, die macOS auffordert, anstatt Sie zu zwingen, einen Einstellungsbereich zu suchen. Schreibvorgänge benötigen zusätzlich Automatisierung.

Nachrichten

überhaupt nichts. Es existiert kein Apple-Events-Lesepfad – Nachrichten antwortet „Die Anwendung läuft nicht“, selbst wenn sie läuft –, also gibt es keine zweite Spur und keinen abgesenkten Modus. Ein Senden kann dennoch versucht werden, aber ohne Speicher, aus dem das Ziel ausgewählt oder abgeglichen werden kann, ist es normalerweise nicht adressierbar.

Safari

live-Tabs, und nur diese. Die eine Oberfläche, deren Spuren keine Fallbacks füreinander sind: Apple Events sieht, was gerade offen ist, die Datei-Spur sieht alles andere. Verlauf, Lesezeichen und die Leseliste benötigen alle die Genehmigung.

Werkzeuge, die den Index benötigen, verschwinden nicht, wenn er fehlt – die Werkzeugliste ist eine reine Funktion von allowWrites und nichts anderem, weil MCP-Clients sie zwischenspeichern. Sie geben ein strukturiertes degraded Ergebnis zurück, das benennt, was fehlt. apple_mail_diagnostics / apple_notes_diagnostics melden, welche Spur aktiv ist und wie das Fehlende gewährt werden kann.

Werkzeuge

Lesewerkzeuge sind immer registriert. Schreibwerkzeuge sind unsichtbar, es sei denn, Schreibvorgänge sind aktiviert – nicht nur verweigert.

Mail

Immer verfügbar

Schreib-gesteuert

search_messages list_messages count_messages get_thread

set_message_flags move_messages delete_messages check_for_new_mail

get_message get_message_source list_attachments

send_message reply_to_message forward_message

list_accounts list_mailboxes diagnostics

save_attachment

Notizen

Immer verfügbar

Schreib-gesteuert

list_notes search_notes get_note list_attachments

create_note update_note move_note delete_notes save_attachment

list_accounts list_folders diagnostics

Erinnerungen

Immer verfügbar

Nur mit Schreibfreigabe

list_reminders search_reminders get_reminder list_lists

create_reminder update_reminder complete_reminders move_reminders delete_reminders

list_accounts diagnostics

Calendar

Immer verfügbar

Nur mit Schreibfreigabe

list_events search_events get_event list_calendars

create_event update_event delete_events

list_accounts diagnostics

list_events expandiert wiederkehrende Ereignisse, sodass ein wöchentliches Stand-up einmal pro Woche zurückgegeben wird. Jedes Ergebnis trägt das Fenster, das die Expansion bekanntermaßen abdeckt, und setzt truncated, wenn ein Bereich darüber hinausläuft, anstatt zu kurz zurückzukommen – eine kurze Ereignisliste ist von einem freien Nachmittag nicht zu unterscheiden.

Contacts

Immer verfügbar

Nur mit Schreibfreigabe

resolve_handles search_contacts list_contacts get_contact

create_contact update_contact

diagnostics

resolve_handles wandelt Telefonnummern und E-Mail-Adressen in Namen um, was die Messages-Oberfläche überhaupt erst lesbar macht. Lies den status jedes Ergebnisses, anstatt anzunehmen, dass ein Name zurückkam: unknown ist häufig und kein Fehler, und ambiguous bedeutet, dass zwei Kontakte die Nummer teilen, sodass kein Name zurückgegeben wird, statt zu raten.

Es gibt kein Lösch-Tool. Das Scripting-Wörterbuch von Contacts hat keinerlei Löschbefehl, und Schreibvorgänge laufen hier auf jeder Oberfläche über Apple Events, da der Speicher grundsätzlich schreibgeschützt ist. Siehe docs/contacts.md.

Messages

Immer verfügbar

Nur mit Schreibfreigabe

list_chats list_messages search_messages

send_message

get_message diagnostics

Ein Schreib-Tool, weil das Wörterbuch genau einen brauchbaren Befehl hat. sdef listet send, login und logout; die anderen beiden würden den Benutzer auf jedem eigenen Gerät von iMessage abmelden. Es gibt kein Verb für Bearbeiten, Löschen, Als-gelesen-Markieren oder Reagieren, das offengelegt werden könnte.

Dies ist die einzige Oberfläche, auf der Apple Events eine reine Schreibspur und sonst nichts ist – jeder Lesevorgang darüber schlägt fehl. Wenn APPLE_MESSAGES_ALLOW_WRITES deaktiviert ist, wird also nie ein Apple Event gesendet und nie eine Automatisierungsberechtigung angefragt.

send_message bevorzugt eine chatRef aus list_chats gegenüber einem rohen Handle, weil Messages sich weigert, Teilnehmer für ein Skript aufzulisten: Eine bestehende Konversation ist das einzige Ziel, das zuverlässig adressiert werden kann. Apple Events liefert keine Kennung für das Gesendete zurück, daher wird das Ergebnis mit chat.db abgeglichen – reconciliation: "matched" trägt eine echte Message-Referenz, und "pending" bedeutet, dass Messages den Sendevorgang akzeptiert, die Zeile aber noch nicht geschrieben hat. Pending ist kein Fehler, und ein erneuter Versuch sendet die Nachricht doppelt.

Bei etwa 3 % der Nachrichten in der gesamten Historie bleibt der Text nur in einem archivierten NSArchiver-Blob erhalten, den SQL nicht erreichen kann – und Apple hat Anfang 2026 aufgehört, die Klartextspalte zu schreiben, daher sind es für alles Neuere ~100 %. Dieser Server dekodiert sie; textSource gibt bei jedem Ergebnis an, welche Spur geantwortet hat. Siehe docs/messages.md.

Safari

Immer verfügbar

Nur mit Schreibfreigabe

search_history get_page list_tabs

— keine

list_bookmarks list_reading_list diagnostics

Schreibgeschützt, und die Schreibspalte ist absichtlich leer. Das Öffnen einer URL oder das Hinzufügen zur Leseliste ist ein Apple Event, das einen echten, sichtbaren Browser navigiert, und auf dieser Oberfläche wurde noch nie ein Schreibvorgang erprobt.

list_tabs ist das einzige Tool im gesamten Bundle, das ohne Vollen Festplattenzugriff funktioniert – es benötigt stattdessen eine Automatisierungsberechtigung, und Safari muss laufen. Wenn das history-Feld eines Tabs null ist, bedeutet das nicht im Verlauf gefunden, niemals „nie besucht“: Nur etwa 55 % der geöffneten Tabs entsprechen einer Verlaufszeile, weil Weiterleitungen, Sitzungsparameter und nie im Verlauf gespeicherte Seiten alle eine URL erzeugen, die schlicht nicht vorhanden ist.

Es gibt kein do JavaScript-Tool. Dieses Verb benötigt „JavaScript von Apple Events erlauben“, einen Umschalter im Safari-Entwicklermenü, der keine TCC-Berechtigung ist und dessen eigener Zustand nicht zuverlässig ausgelesen werden kann. Es auszuliefern würde bedeuten, eine gesunde Oberfläche zu melden, deren mächtigste Fähigkeit stillschweigend scheitert. Siehe docs/safari.md.

Alle Namen tragen das Präfix apple_mail_ / apple_notes_ / apple_reminders_ / apple_calendar_ / apple_contacts_ / apple_messages_ / apple_safari_.

Konfiguration

Nur Umgebungsvariablen – diese Server besitzen selbst kein Geheimnis, daher gibt es keine Konfigurationsdatei. Das Präfix ist APPLE_MAIL_, APPLE_NOTES_, APPLE_REMINDERS_, APPLE_CALENDAR_, APPLE_CONTACTS_, APPLE_MESSAGES_ oder APPLE_SAFARI_.

Variable

Standard

Bedeutung

*_ALLOW_WRITES

false

die mutierenden Tools überhaupt registrieren

*_ACCOUNTS

all

Account-Allowlist (Namen oder UUIDs) – die Steuerung auf der Lese-Seite

*_ATTACHMENT_DIR

~/Downloads

das einzige Verzeichnis, in das Anhänge geschrieben werden dürfen

*_MAX_RESULTS

200

Obergrenze für jede Auflistung

*_INDEX_MODE

auto

auto | ro | immutable | off

*_OSASCRIPT_TIMEOUT_MS

30000

Timeout pro Apple-Events-Aufruf

*_DEBUG

false

ausführliche Protokollierung nach stderr

allowWrites steuert Mutationen, aber bei Mail ist der größere Schadensradius das Lesen eines gesamten Archivs – genau dafür ist *_ACCOUNTS da, und es wird an genau einer Stelle durchgesetzt, sodass kein Abfragepfad daran vorbeikommt. Mail akzeptiert außerdem *_ROOT, *_ENVELOPE_INDEX, *_DEGRADED_MAX_MESSAGES, *_BODY_MAX_BYTES, *_BODY_SCAN_MAX, *_BODY_SCAN_BYTES und *_MAILBOX_CACHE_TTL_MS; siehe packages/mail/src/config.ts.

Die App

Die Menüleiste ist die gesamte Oberfläche von Cupertino – es gibt kein Dock-Symbol und kein Hauptfenster.

Bereich

Was er beantwortet

Voller Festplattenzugriff

gewährt oder nicht, mit dem Button, der den richtigen Einstellungen-Bereich öffnet

Ein Bereich pro Oberfläche

Automatisierungsstatus pro App, die Zustimmungsaufforderung und der Schreibschalter

Verbindungen

welcher Client gerade mit welchem Server spricht und wie viele Tools er aufgerufen hat

MCP-Clients

Ein-Klick-Einrichtung für Claude Desktop, Cursor, LM Studio und Windsurf; ein kopierbarer Befehl für Claude Code, VS Code und Codex

Aktivität…

öffnet ein Fenster, das jeden Tool-Aufruf live auflistet

Das Fenster Aktivität zeichnet nur Tool-Namen auf – niemals Argumente, Nachrichteninhalte oder Ergebnisse. Es ist die Antwort auf „Was hat der Assistent gerade mit meiner Mail gemacht?“ und der Grund, warum die Server unter einer sichtbaren App laufen und nicht in dem Editor, der sie gestartet hat.

Schreibvorgänge sind pro Oberfläche deaktiviert, bis du sie einschaltest, und der Schalter entscheidet, ob die mutierenden Tools überhaupt registriert werden – ein Assistent mit deaktivierten Schreibvorgängen kann nicht sehen, dass es sie gibt.

Warum eine einzige App

Voller Festplattenzugriff ist eine unteilbare, die gesamte Festplatte betreffende Berechtigung. Sie pro Oberfläche zu gewähren bringt keine Eingrenzung und kostet jedes Mal einen Gang zu den Systemeinstellungen. Deshalb wird jede Oberfläche in einer einzigen signierten und notarisierten App namens Cupertino ausgeliefert. docs/distribution.md hält außerdem fest, warum der Mac App Store nichts davon hosten kann, damit diese Frage nicht wieder aufgemacht wird.

Aber die Berechtigung ist nicht das Einzige, was die App besitzt, und sie ist nicht der einzige Grund, die Server unter ihr laufen zu lassen statt unter einem Editor:

Die Berechtigung landet auf Cupertino

nicht auf dem Editor, der den Server gestartet hat, und mit ihm jede Erweiterung und Aufgabe, die dieser Editor ausführt

Ein sichtbarer Audit-Trail

das Aktivitätsfenster listet jeden Tool-Aufruf live auf; ein Server in einem Editor ist nicht beobachtbar

Schreibvorgänge sind pro Oberfläche deaktiviert

und der Schalter entscheidet, ob die mutierenden Tools überhaupt registriert werden

*_ACCOUNTS begrenzt das Lesen

der Schadensradius bei Mail ist das Archiv, nicht die Mutationen

Ergebnisse sagen, wie sehr man ihnen vertrauen kann

indexAgeSeconds, eine WAL-blinde Warnung und ein strukturiertes degraded-Ergebnis statt eines verschwundenen Tools

Vier Oberflächen, eine Berechtigung

was der eigentliche Nutzen der oben genannten Unteilbarkeit ist

docs/alternatives.md ist die ehrliche Version dieser Liste: was sonst Apple Mail für einen Assistenten liest und wo diese Tools voraus sind.

Dokumentation

docs/distribution.md

wie das ausgeliefert wird und warum nicht über den App Store

docs/surfaces.md

welche Oberflächen und was jede kostet

docs/licensing.md

was offen ist, was verkauft wird, was Vertrauen schafft

docs/alternatives.md

was sonst Apple Mail liest und wo wir verlieren

docs/mail-body.md

die Body-Suche-Spur und wie sie entschieden wird

docs/notes.md

Apple Notes Phase-0-Messungen

docs/reminders.md

Apple Reminders Phase-0-Messungen

docs/messages.md

Apple Messages: Messungen, Decoder, Senden

docs/calendar.md

Apple Calendar Phase-0-Messungen

docs/safari.md

Safari Phase-0-Messungen

docs/envelope-index.md

Mails beobachtetes Envelope Index-Schema

docs/verify.md

Überprüfung des Mail-Servers anhand eines echten Index

In Arbeit

pnpm build          # every package
pnpm test           # every package
pnpm typecheck
pnpm lint
pnpm format

Die Marketing-Website ist ein eigener Arbeitsbereich und wird von Hand bereitgestellt:

pnpm --filter @mgcrea/cupertino-website dev     # astro dev
pnpm --filter @mgcrea/cupertino-website build   # static build

Es wird aus der Design-Canvas in .idea/design/ erstellt und liest seine Tool-Zahlen aus packages/*/src/tools/ und nicht aus dieser Datei – siehe apps/website.

Die Swift-Hälfte ist xcodebuild, benannt durch das Makefile und nicht davon umschlossen:

make app            # build Cupertino.app (Debug)
make run            # build, point at packages/*/dist, launch
make smoke          # handshake every server through the bridge
make stop           # quit and remove the socket

Die Screenshots der App werden aufgenommen und nicht von Hand erstellt – apps/apple/Screenshots/ enthält die Konfiguration und die festgeschriebenen Goldens, und die Website rendert die Ausgabe:

make screenshots          # capture, gate against the goldens, compose both sets
make screenshots-check     # gate only — fails if the UI drifted
make screenshots-update    # accept the captures as the new goldens (review the diffs first)
make screenshots-selftest  # prove the gate fails when it should

Ein Lauf übernimmt den Zeiger und die aktive App im Moment jeder Aufnahme, also benutze den Rechner nicht, während er läuft. Es benötigt die Bildschirmaufnahme-Berechtigung für das Terminal, niemals für Cupertino selbst. make screenshots-doctor prüft das und die zwei anderen Dinge, die sonst stillschweigend fehlschlagen: ob die Beschriftungsschrift aufgelöst wird und ob die Ausgabegröße eine ist, die ein Store akzeptieren würde.

Was die Screenshots zeigen, sind Fixture-Daten aus apps/apple/Cupertino/DemoSeed.swift, nicht dieser Mac: Im -ScreenshotMode startet die App keinen Host, seedet ihr eigenes Log und ihre Sitzungen und beantwortet die Berechtigungs- und Store-Fragen aus einer Tabelle. Ohne das würden die Bilder den TCC-Zustand eines Laptops melden und sein Home-Verzeichnis in die Marketing-Website drucken.

Phase-0-Sonden sind repo-weit und schreibgeschützt. Sie benötigen die Berechtigung der Oberfläche, die sie messen, und schwärzen ihre Ausgabe auf Zählungen, Zeitmessungen und DDL:

pnpm probe:mail      # Envelope Index — needs Full Disk Access
pnpm probe:mail-body # which lane can search message bodies — needs Full Disk Access
pnpm probe:notes     # Notes — the Apple Events half runs without it
pnpm probe:reminders # Reminders — the store path is a glob, so finding it is itself privileged
pnpm probe:messages  # chat.db — no Apple Events read lane exists, so this one needs the grant
                     #   --send-target=<handle> also checks the send lane's targeting, without sending
pnpm probe:calendar  # settles whether Calendar has a file lane at all
pnpm probe:safari    # History.db, and the Reading List hiding inside Bookmarks.plist
pnpm probe:contacts  # the resolver Messages needs — its own TCC grant, not Full Disk Access

Jede untersuchte Oberfläche hat jetzt ein Paket. Safari ist schreibgeschützt – es registriert kein mutierendes Tool, und das ist eine dokumentierte Entscheidung und keine Auslassung: Das Öffnen einer URL oder das Hinzufügen zur Leseliste navigiert einen echten, sichtbaren Browser und wurde nie untersucht. Siehe docs/safari.md. Messages registriert genau ein Schreib-Tool, send_message, das das gesamte ist, was sein Skript-Wörterbuch tun kann. Jede Sonde degradiert statt zu beenden – eine App, die nicht läuft, oder eine Berechtigung, die nicht erteilt wurde, wird als Befund gemeldet – und keine von ihnen startet eine App, es sei denn, du übergibst --launch. Ihr gemeinsamer Mechanismus lebt in scripts/lib/probe-kit.mjs.

Releases werden pro Paket getaggt, also benennt ein Tag, was es veröffentlicht: mail-v1.1.0, reminders-v1.1.0, calendar-v1.1.0, core-v1.1.0. Die App ist mit app-v1.1.0 getaggt und veröffentlicht auf ihrer eigenen Spur – ein signiertes, notarisiertes Cupertino.zip, das an das GitHub-Release angehängt ist, plus seine SHA-256. Siehe docs/distribution.md.

Das Repo ist mcp-cupertino; die npm-Pakete bleiben @mgcrea/mcp-apple-*, weil das ist, wonach die Leute auf npm suchen. Keiner der Namen ist tragend. Die Bundle-Kennung io.mgcrea.cupertino ist die Zeichenfolge, die tatsächlich zählt, denn ihre Änderung würde die Full Disk Access-Gewährung jedes Benutzers ungültig machen.

Lizenz

Zwei, weil die Hälften nicht dasselbe sind.

Teil

Lizenz

packages/*, scripts/

MIT — Bibliotheken, frei weiterzugeben

apps/apple/

source-available — lesen, prüfen, kompilieren; binäre Weiterverbreitung vorbehalten

das signierte, notarisierte Build

verkauft, unter der mitgelieferten EULA

Cupertino verlangt Full Disk Access, also bleibt der Quellcode lesbar – das ist es, was einer solchen Gewährung geschuldet ist, und das Lesen ist der Punkt. Das Ausführen ist eine separate Frage: Die Lizenzprüfung lebt im Quellcode, also fragt jeder Build nach einem Schlüssel, deinem oder unserem. Was verkauft wird, ist das notarisierte Binär und die Wartung dahinter. Die Server sind MIT und laufen von selbst ohne jeden Schlüssel. Die Begründung steht in docs/licensing.md.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
4Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    C
    maintenance
    A local MCP server that provides a secure bridge for automating macOS applications like Notes, Calendar, and Mail through AppleScript. It uses template-based execution and policy-based allowlists to enable safe, structured interaction with system tools.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for privacy-gated local Apple data access including Mail, Messages, Notes, Calendar, Contacts, Photos, Reminders, Voice Memos, and iCloud Drive.
    30
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A collection of MCP servers for Apple macOS apps (Mail, Contacts, Notes, Memory, Messages, Calendar, Reminders) enabling AI assistants to read, search, create, and update data via JXA, SQLite, and EventKit.
    12
    MIT

View all related MCP servers

Related MCP Connectors

  • Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.

  • Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.

  • MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay

View all MCP Connectors

Latest Blog Posts

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/mgcrea/mcp-cupertino'

If you have feedback or need assistance with the MCP directory API, please join our Discord server