Skip to main content
Glama
estrenuo

OmniFocus MCP Server

by estrenuo

OmniFocus MCP Server

Ein Model-Context-Protocol-Server (MCP), der KI-Assistenten die Interaktion mit OmniFocus unter macOS über JXA (JavaScript for Automation) ermöglicht.

Funktionen

Dieser MCP-Server bietet Zugriff auf OmniFocus-Funktionen:

Aufgabenverwaltung

  • Posteingangsaufgaben auflisten – Aufgaben im Posteingang anzeigen und filtern (einschließlich Multi-Tag-Filterung)

  • Aufgaben erstellen – Neue Aufgaben mit vollständiger Eigenschaftsunterstützung hinzufügen (Fälligkeitsdaten, geplante Daten, Tags, Notizen, Unteraufgaben, Wiederholung)

  • Aufgaben aktualisieren – Name, Notiz, Daten, Markierung, Schätzung, Wiederholung ändern oder eine Aufgabe in ein anderes Projekt verschieben

  • Aufgaben abschließen/verwerfen – Aufgaben als erledigt oder verworfen markieren, einzeln oder in Stapeln

  • Aufgaben löschen – Eine Aufgabe dauerhaft entfernen

  • Aufgabennnotizen aktualisieren – Notiz einer Aufgabe ersetzen, leeren oder ergänzen

  • Fällige Aufgaben abrufen – Aufgaben finden, die innerhalb eines Zeitrahmens fällig sind

  • Geplante Aufgaben abrufen – Aufgaben finden, die innerhalb eines Zeitrahmens geplant sind

  • Markierte Aufgaben abrufen – Alle markierten Elemente auflisten

  • Tags zu Aufgaben hinzufügen/entfernen – Aufgaben-Tags verwalten, einzeln oder in Stapeln

Projektverwaltung

  • Projekte auflisten – Projekte mit Statusfilterung anzeigen

  • Projektaufgaben abrufen – Alle Aufgaben eines Projekts auflisten

  • Projekte erstellen – Neue Projekte mit Ordnerplatzierung, Status, Daten, sequenziellem Modus, Überprüfungsintervall

  • Projekte aktualisieren – Name, Notiz, Status, Markierung, Daten, sequenziellen Modus, Überprüfungsintervall ändern

  • Projekte löschen – Ein Projekt und seine Aufgaben entfernen

  • Projektnotizen aktualisieren – Notiz eines Projekts ersetzen, leeren oder ergänzen

  • Zu überprüfende Projekte abrufen – Projekte finden, die überprüft werden müssen, optional mit ihren unvollständigen Aufgaben

  • Projekt als überprüft markieren – Überprüfungsstatus und nächstes Überprüfungsdatum eines Projekts aktualisieren

  • Stapelweise als überprüft markieren – Mehrere Projekte auf einmal effizient überprüfen

Organisation

  • Ordner auflisten – Ordnerhierarchie anzeigen

  • Ordner erstellen/umbenennen/löschen – Ordnerbaum verwalten (einschließlich verschachtelter Ordner)

  • Tags auflisten – Alle Tags anzeigen

  • Perspektiven auflisten – Integrierte und benutzerdefinierte Perspektiven anzeigen

  • Perspektivenaufgaben abrufen – Aufgaben auflisten, die in einer bestimmten Perspektive angezeigt werden

Suche

  • Universelle Suche – Suche über Aufgaben, Projekte, Ordner und Tags

Sicherheitseigenschaften

  • Kein stiller Gewinner bei doppelten Namen. OmniFocus erlaubt es, dass zwei Projekte (oder Aufgaben) denselben Namen tragen. Namenssuchen erfassen jedes Vorkommen und schlagen bei mehr als einem mit den passenden IDs fehl, sodass eine Umbenennung, Verschiebung oder Löschung niemals das falsche Element treffen kann, während Erfolg gemeldet wird.

  • Mutationen werden verifiziert. Operationen, bei denen JXA stillschweigend fehlschlagen kann (insbesondere das Verschieben einer Aufgabe zwischen Projekten), lesen das Ergebnis im selben Skript zurück, sodass eine fehlgeschlagene Verschiebung als Fehler statt als Erfolg gemeldet wird.

Related MCP server: OmniFocus MCP Server

Voraussetzungen

  • macOS (OmniFocus ist nur für macOS/iOS verfügbar, und dieser Server verwendet JXA)

  • OmniFocus 3+ installiert

  • Node.js 18+

  • Automatisierungsberechtigungen für Ihre Terminal-/Client-App aktiviert

Installation

  1. Klonen oder laden Sie dieses Repository herunter:

    cd omnifocus-mcp-server
  2. Abhängigkeiten installieren:

    npm install
  3. TypeScript kompilieren:

    npm run build
  4. Konfigurieren Sie Ihren MCP-Client für die Verwendung des Servers (siehe Konfiguration unten)

Konfiguration

Claude Desktop

Fügen Sie Ihrer Claude-Desktop-Konfigurationsdatei (~/Library/Application Support/Claude/claude_desktop_config.json) Folgendes hinzu:

{
  "mcpServers": {
    "omnifocus": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/path/to/omnifocus-mcp-server/dist/index.js"]
    }
  }
}

Verwenden Sie einen absoluten Pfad zur node-Binärdatei. Ein bloßes "node" wird gegen die PATH-Variable der GUI-Sitzung aufgelöst, die weder Homebrew noch die Shims eines Versionsmanagers enthält, sodass der Server mit einem Fehler im Stil von „Server nicht erreichbar" nicht startet, obwohl er von Ihrem Terminal aus einwandfrei läuft. Finden Sie Ihren Pfad mit which node.

Andere MCP-Clients

Der Server verwendet standardmäßig den stdio-Transport. Konfigurieren Sie Ihren Client daher so, dass er Folgendes startet:

node /path/to/omnifocus-mcp-server/dist/index.js

Fernzugriff (HTTP-Transport)

Für Remote-Clients – vor allem für benutzerdefinierte Connectors von claude.ai, über die die Claude-iOS-App MCP-Server erreicht – kann der Server als Streamable-HTTP-Endpunkt ausgeführt werden:

MCP_TRANSPORT=http \
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" \
node /path/to/omnifocus-mcp-server/dist/index.js

Umgebungsvariablen:

Variable

Standard

Zweck

MCP_TRANSPORT

stdio

Auf http setzen, um den HTTP-Transport zu aktivieren

MCP_HTTP_PORT

3000

Port, auf dem gelauscht wird

MCP_HTTP_HOST

127.0.0.1

Bind-Adresse (Loopback beibehalten; über einen Tunnel verfügbar machen)

MCP_AUTH_TOKEN

Erforderliches gemeinsames Geheimnis; der Server weigert sich, ohne dieses zu starten

MCP_PUBLIC_URL

Öffentliche HTTPS-Origin, unter der der Server erreichbar ist (z. B. https://your-tunnel-host). Setzen Sie dies, um die OAuth-Ebene zu aktivieren, die von der Connectors-Oberfläche von claude.ai / Claude Desktop benötigt wird – siehe unten. Für direkte/programmatische Clients, die nur das statische Token benötigen, nicht gesetzt lassen.

OMNIFOCUS_SCRIPT_TIMEOUT_MS

60000

Beendet ein hängendes JXA-Skript (gilt für beide Transporte)

Der MCP-Endpunkt ist /mcp. Die Authentifizierung akzeptiert entweder einen Authorization: Bearer <token>-Header oder das Token als Pfadsegment (/mcp/<token>) für Clients, die keine benutzerdefinierten Header senden können. GET /health ist nicht authentifiziert.

Von claude.ai / der iOS-App aus erreichen. Benutzerdefinierte Connectors verbinden sich aus der Cloud von Anthropic (nicht von Ihrem Gerät), daher muss der Endpunkt über HTTPS öffentlich erreichbar sein. Ein Cloudflare Tunnel oder ein Tailscale Funnel funktionieren beide dafür – in beiden Fällen stellt ein lokaler Prozess eine ausgehende Verbindung her, sodass keine Ports geöffnet werden. (Einfaches Tailscale ohne Funnel funktioniert nicht: Das erreicht nur Ihr eigenes Tailnet, und die Cloud von Anthropic ist dort nicht enthalten.) Optional können Sie den Zugriff in einer Cloudflare-WAF-Regel auf den ausgehenden IP-Bereich von Anthropic (160.79.104.0/21) beschränken.

Die Connectors-Oberfläche von claude.ai und Claude Desktop (im Gegensatz zu einer rohen MCP-Konfiguration / einem direkten API-Client) führt immer einen vollständigen OAuth-Handshake durch, bevor sie einen Remote-Server aufruft – sie akzeptiert das statische Token nicht allein, selbst wenn es in der URL eingebettet ist. Setzen Sie MCP_PUBLIC_URL auf die öffentliche Origin Ihres Tunnels, um eine selbst ausgestellte OAuth-Ebene zu aktivieren, die dies erfüllt und den Zugriff dennoch mit demselben statischen Geheimnis absichert (siehe oauth.ts / CLAUDE.md für Details). Wenn dies gesetzt ist, fügen Sie den Connector unter Einstellungen → Connectors mit der Pfad-Token-URL hinzu (https://your-tunnel-host/mcp/<token>) – der Schritt „Verbinden" schließt den OAuth-Handshake automatisch ab. Wenn Ihr Tunnel / auch an einen anderen lokalen Dienst weiterleitet, stellen Sie sicher, dass /authorize, /token, /register und /.well-known/* ebenfalls auf diesen Server gemappt sind, sonst kommen die OAuth-Anfragen nie hier an.

Der Mac muss wach bleiben und OmniFocus muss laufen (caffeinate -s oder Amphetamine).

Sitzungssemantik – nur ein einzelner Client. Der HTTP-Transport bedient jeweils eine Sitzung: Ein neues initialize ersetzt die vorherige Sitzung. Jeder Tool-Aufruf ist zustandslos, und ein spezifikationskonformer Client initialisiert neu, wenn er für eine nicht mehr existierende Sitzung eine 404 erhält. Ein einzelner Client, der sequenziell aufruft, funktioniert also einwandfrei. Diese 404 deckt auch den Fall ab, dass der Server überhaupt keine Sitzung hält – was nach einem Neustart des Servers bei jedem Client der Fall ist – sie initialisieren neu, statt den Endpunkt als tot zu behandeln.

Zwei Clients gleichzeitig tun das nicht. Reproduziert durch das gleichzeitige Auslösen von zwei initializetools/list-Sequenzen am öffentlichen Endpunkt: Einer erhält konsistent eine 404. Das zugrunde liegende MCP-SDK bindet einen einzelnen Transport an die gemeinsame Serverinstanz, sodass die verlierende Sitzung verdrängt wird und ihre laufende Anfrage entweder eine 404 erhält oder hängt. Die Behebung erfordert eine McpServer-Instanz pro Sitzung statt des aktuellen Musters der Registrierung auf einem Singleton; dies ist derzeit nicht geplant. Details finden Sie in CLAUDE.md.

Fehlerbehebung bei einem Client, der „keine Verbindung" meldet. Clients fassen jeden Remote-Fehler in einer vagen Meldung zusammen. Lesen Sie daher das Protokoll dieses Servers (StandardErrorPath Ihres Launch-Agents), nicht die Formulierung des Clients – der Statuscode sagt, welche von drei unabhängigen Ursachen vorliegt:

Was das Protokoll zeigt

Bedeutung

Lösung

↳ path token rejected: got N chars …

Das Token in der URL des Clients ist falsch oder abgeschnitten

<MCP_PUBLIC_URL>/mcp/<token> vollständig neu kopieren; niemals neu tippen

↳ authorize rejected: resource … !== …

Gleiche Ursache, aus Sicht der OAuth-Seite. Ein /authorize → 302 ohne anschließendes /token bedeutet immer dies

Wie oben

[…] → 404 und dann ein neues initialize

Normale Wiederherstellung nach einem Neustart oder einer Sitzungsübernahme

Nichts; der Client initialisiert sich selbst

[initialize] → 200 — client: …

Funktioniert. Der Clientname identifiziert, welcher Client es ist

Wenn im Protokoll überhaupt nichts erscheint, hat die Anfrage diesen Server nie erreicht: Prüfen Sie die Pfadzuordnungen des Tunnels, nicht diesen Code.

Berechtigungen

Beim ersten Gebrauch fordert macOS Sie auf, den Automatisierungszugriff zu erlauben:

  1. Gehen Sie zu SystemeinstellungenSicherheit & DatenschutzDatenschutzAutomatisierung

  2. Aktivieren Sie die Berechtigung für Ihr Terminal oder Claude Desktop, OmniFocus zu steuern

Tool-Referenz

Alle 31 Tools sind unten aufgeführt, gruppiert nach Bereich.

omnifocus_list_inbox

Listet Aufgaben im Posteingang auf, optional nach Tags gefiltert.

{
  "includeCompleted": false,
  "limit": 50,
  "tags": ["Work", "Urgent"],
  "tagMatchMode": "all"
}

tagMatchMode ist "all" (Aufgabe hat alle aufgeführten Tags, Standard), "any" (mindestens eines) oder "none" (keines davon). Es gilt nur, wenn tags angegeben ist. Dieselben beiden Parameter funktionieren bei omnifocus_get_due_tasks, omnifocus_get_flagged_tasks und omnifocus_get_planned_tasks.

omnifocus_list_projects

Listet Projekte mit Filterung auf.

{
  "status": "active",
  "folderName": "Work",
  "limit": 50
}

omnifocus_get_project_tasks

Ruft alle Aufgaben ab, die zu einem Projekt gehören.

{
  "projectId": "abc123",
  "includeCompleted": false,
  "limit": 100
}

omnifocus_create_project

Erstellt ein Projekt, optional innerhalb eines Ordners.

{
  "name": "Website redesign",
  "note": "Q1 initiative",
  "folderName": "Work",
  "dueDate": "2024-03-31T17:00:00",
  "deferDate": "2024-01-15T09:00:00",
  "flagged": false,
  "sequential": false,
  "status": "active",
  "reviewIntervalDays": 7
}

status ist "active" (Standard), "on hold", "done" oder "dropped". sequential: false (Standard) ergibt ein paralleles Projekt.

omnifocus_update_project

Aktualisiert Projekteigenschaften. Identifizierung über projectId oder projectName (ID gewinnt).

{
  "projectId": "abc123",
  "name": "Website redesign v2",
  "status": "on hold",
  "flagged": true,
  "dueDate": null,
  "sequential": true,
  "reviewIntervalDays": 14
}

Übergib null für note, dueDate oder deferDate, um sie zu leeren. Ein Projekt kann nicht in einen anderen Ordner verschoben werden (JXA-Einschränkung).

omnifocus_delete_project

Löscht ein Projekt und seine Aufgaben. Identifizierung über projectId oder projectName (ID gewinnt).

{
  "projectId": "abc123"
}

omnifocus_list_folders

Listet alle Ordner auf.

{
  "status": "active",
  "limit": 50
}

omnifocus_create_folder

Erstellt einen Ordner, entweder auf oberster Ebene oder verschachtelt.

{
  "name": "Clients",
  "parentFolderName": "Work"
}

omnifocus_update_folder

Benennt einen Ordner um. Identifizierung über folderId oder folderName (ID gewinnt). Ein Ordner kann nicht in einen anderen Ordner verschoben werden (JXA-Einschränkung).

{
  "folderName": "Clients",
  "name": "Key clients"
}

omnifocus_delete_folder

Löscht einen Ordner und alles darin. Identifizierung über folderId oder folderName (ID gewinnt).

{
  "folderId": "abc123"
}

omnifocus_list_tags

Listet alle Tags auf.

{
  "status": "active",
  "limit": 50
}

omnifocus_list_perspectives

Listet Perspektiven auf (integrierte und benutzerdefinierte).

{
  "limit": 50
}

omnifocus_get_perspective_tasks

Ruft Aufgaben ab, die in einer bestimmten Perspektive angezeigt werden.

{
  "perspectiveName": "Next",
  "limit": 50
}

omnifocus_create_task

Erstellt eine neue Aufgabe.

{
  "name": "Review quarterly report",
  "note": "Check all sections",
  "projectName": "Work",
  "dueDate": "2024-12-31T17:00:00",
  "deferDate": "2024-12-01T09:00:00",
  "plannedDate": "2024-12-15T09:00:00",
  "flagged": true,
  "estimatedMinutes": 60,
  "tagNames": ["Review", "Important"],
  "parentTaskId": "xyz789",
  "recurrence": {
    "frequency": "weekly",
    "interval": 1,
    "daysOfWeek": ["Monday", "Thursday"],
    "repeatFrom": "due-date"
  }
}

Geplantes Datum vs. Fälligkeitsdatum:

  • dueDate: Wann die Aufgabe abgeschlossen sein muss (Frist)

  • plannedDate: Wann du vorhast, an der Aufgabe zu arbeiten (Planung)

  • Diese Unterscheidung ist entscheidend, um Fristen von geplanter Arbeitszeit zu trennen

Wiederholung: frequency ist "daily", "weekly", "monthly" oder "yearly". Verwende daysOfWeek für wöchentlich, dayOfMonth (1-31) für monatlich, monthOfYear (1-12) für jährlich. repeatFrom ist "due-date" (Standard) oder "completion-date".

Teilaufgaben: Übergib parentTaskId, um die Aufgabe als Unteraufgabe einer vorhandenen Aufgabe zu erstellen.

omnifocus_update_task

Aktualisiert eine vorhandene Aufgabe. Identifizierung über taskId oder taskName (ID gewinnt).

{
  "taskId": "abc123",
  "name": "Review quarterly report (final)",
  "note": null,
  "dueDate": "2024-12-20T17:00:00",
  "flagged": true,
  "estimatedMinutes": 45,
  "projectName": "Work"
}
  • Übergib null für note, dueDate, deferDate oder plannedDate, um sie zu leeren; estimatedMinutes: 0 löscht die Schätzung.

  • projectId / projectName verschiebt die Aufgabe in dieses Projekt (Teilaufgaben ziehen mit). Die Verschiebung wird anschließend überprüft, sodass ein Fehlschlag als Fehler gemeldet wird und nicht als falscher Erfolg.

  • recurrence akzeptiert dasselbe Objekt wie create_task; recurrence: null oder clearRecurrence: true deaktiviert die Wiederholung.

omnifocus_delete_task

Löscht eine Aufgabe. Identifizierung über taskId oder taskName (ID gewinnt).

{
  "taskId": "abc123"
}

omnifocus_update_task_note

Ersetzt, leert oder ergänzt die Notiz einer Aufgabe. Identifizierung über taskId oder taskName (ID gewinnt).

{
  "taskId": "abc123",
  "note": "Added after the call.",
  "append": true
}

Ein leerer note-String leert die Notiz.

omnifocus_complete_task

Markiert eine Aufgabe als abgeschlossen oder verworfen. Du kannst die Aufgabe entweder über ID oder Namen identifizieren.

{
  "taskId": "abc123",
  "action": "complete"
}

Oder über den Aufgabennamen:

{
  "taskName": "Write documentation",
  "action": "complete"
}

Die Aktion kann "complete" (Standard) oder "drop" sein. Wenn sowohl taskId als auch taskName angegeben sind, hat taskId Priorität.

Beim Verwerfen einer wiederkehrenden Aufgabe wird zuerst die Wiederholungsregel gelöscht, sodass die Serie tatsächlich endet, anstatt zur nächsten Instanz weiterzurollen.

omnifocus_batch_complete_task

Schließt bis zu 100 Aufgaben per ID in einem Aufruf ab oder verwirft sie.

{
  "taskIds": ["id1", "id2", "id3"],
  "action": "complete"
}

omnifocus_add_tag_to_task

Fügt einer Aufgabe ein Tag hinzu. Du kannst die Aufgabe entweder über ID oder Namen identifizieren.

{
  "taskId": "abc123",
  "tagName": "Urgent"
}

Oder über den Aufgabennamen:

{
  "taskName": "Write report",
  "tagName": "Urgent"
}

Wenn sowohl taskId als auch taskName angegeben sind, hat taskId Priorität.

omnifocus_remove_tag_from_task

Entfernt ein Tag von einer Aufgabe. Du kannst die Aufgabe entweder über ID oder Namen identifizieren.

{
  "taskId": "abc123",
  "tagName": "Urgent"
}

Oder über den Aufgabennamen:

{
  "taskName": "Old task",
  "tagName": "Done"
}

Wenn sowohl taskId als auch taskName angegeben sind, hat taskId Priorität.

omnifocus_batch_add_tag

Fügt bis zu 100 Aufgaben per ID ein vorhandenes Tag hinzu.

{
  "taskIds": ["id1", "id2", "id3"],
  "tagName": "Urgent"
}

omnifocus_batch_remove_tag

Entfernt ein Tag von bis zu 100 Aufgaben per ID.

{
  "taskIds": ["id1", "id2", "id3"],
  "tagName": "Urgent"
}

omnifocus_update_project_note

Ersetzt, leert oder ergänzt die Notiz eines Projekts. Identifizierung über projectId oder projectName (ID gewinnt).

{
  "projectName": "Website redesign",
  "note": "Kickoff moved to March.",
  "append": false
}

omnifocus_search

Durchsucht OmniFocus.

{
  "query": "report",
  "searchType": "all",
  "limit": 20
}

omnifocus_get_due_tasks

Ruft Aufgaben ab, die innerhalb eines Zeitraums fällig sind.

{
  "daysAhead": 7,
  "includeOverdue": true,
  "limit": 50
}

omnifocus_get_flagged_tasks

Ruft markierte Aufgaben ab.

{
  "includeCompleted": false,
  "limit": 50
}

omnifocus_get_planned_tasks

Ruft Aufgaben ab, die innerhalb eines Zeitraums geplant sind.

{
  "daysAhead": 7,
  "includeOverdue": true,
  "limit": 50
}

omnifocus_get_projects_for_review

Ruft Projekte ab, die basierend auf ihrem nächsten Überprüfungsdatum überprüft werden müssen. Perfekt für GTD-Praktiker, die den Überprüfungsworkflow befolgen.

{
  "daysAhead": 0,
  "status": "active",
  "limit": 50,
  "includeTasks": true,
  "taskLimit": 50
}

Parameter:

  • daysAhead: Wie viele Tage im Voraus geschaut werden soll (0 = nur überfällige Überprüfungen)

  • status: Filter nach Projektstatus ("active", "done", "dropped", "onHold", "all")

  • limit: Maximale Anzahl zurückzugebender Projekte (1-500)

  • includeTasks: Unvollständige Aufgaben jedes Projekts in das Ergebnis aufnehmen (Standard false) — das macht aus einem Überprüfungsdurchgang einen einzigen Aufruf statt eines Folgeaufrufs pro Projekt

  • taskLimit: Maximale Anzahl Aufgaben pro Projekt, wenn includeTasks true ist (1-200, Standard 50)

Jedes Projekt gibt außerdem reviewInterval und lastReviewDate zurück.

omnifocus_mark_project_reviewed

Markiert ein Projekt als überprüft und aktualisiert sein nächstes Überprüfungsdatum. Du kannst das Projekt entweder über ID oder Namen identifizieren.

{
  "projectId": "abc123"
}

Oder über den Projektnamen:

{
  "projectName": "Weekly Review"
}

Mit benutzerdefiniertem Überprüfungsintervall:

{
  "projectName": "Work Project",
  "reviewIntervalDays": 14
}

Parameter:

  • projectId oder projectName: Identifiziert das Projekt (ID hat Priorität)

  • reviewIntervalDays (optional): Benutzerdefiniertes Überprüfungsintervall in Tagen. Wenn nicht angegeben, wird das vorhandene Überprüfungsintervall des Projekts verwendet.

omnifocus_batch_mark_reviewed

Markiert mehrere Projekte in einem effizienten Vorgang als überprüft.

{
  "projectIds": ["id1", "id2", "id3"]
}

Mit benutzerdefiniertem Überprüfungsintervall für alle:

{
  "projectIds": ["id1", "id2", "id3"],
  "reviewIntervalDays": 7
}

Parameter:

  • projectIds: Array von Projekt-IDs, die als überprüft markiert werden sollen (1-100 Projekte)

  • reviewIntervalDays (optional): Benutzerdefiniertes Überprüfungsintervall, das auf alle Projekte angewendet werden soll

Gibt eine Zusammenfassung zurück mit:

  • Anzahl erfolgreicher Überprüfungen

  • Anzahl der Fehler

  • Vollständige Projektdaten für erfolgreiche Überprüfungen

  • Fehlerdetails für etwaige Fehler

Datumsformate

Alle Daten verwenden das ISO-8601-Format: YYYY-MM-DDTHH:mm:ss

Beispiele:

  • 2024-12-31T17:00:00 - 31. Dezember 2024 um 17:00 Uhr

  • 2024-06-15T09:00:00 - 15. Juni 2024 um 09:00 Uhr

Fehlerbehandlung

Der Server liefert klare Fehlermeldungen für häufige Probleme:

  • OmniFocus läuft nicht: Starte zuerst OmniFocus

  • Zugriff verweigert: Aktiviere die Automatisierungsberechtigungen in den Systemeinstellungen

  • Element nicht gefunden: Die angegebene ID existiert nicht

  • Ungültige Parameter: Überprüfe Format und Werte der Parameter

Entwicklung

Build

npm run build

Watch-Modus

npm run dev

Tests

npm test              # All unit tests
npm run test:watch    # Watch mode
npm run test:coverage # Coverage report (thresholds enforced: 80% lines, 75% branches)

Die Integrationstests in src/__tests__/integration.test.ts werden standardmäßig übersprungen: Sie erfordern ein laufendes OmniFocus und verändern deine echte Datenbank.

Manuell testen

Nach dem Build kannst du testen mit:

echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node dist/index.js

Änderungen an einem laufenden Server anwenden (wichtig)

MCP-Clients rufen die Tool-Liste einmal beim Verbinden ab und speichern sie für die Sitzung im Cache. npm run build allein aktualisiert einen bereits verbundenen Client nicht — Node führt kein Hot-Reload durch, und der Client ruft das Schema nicht erneut ab. Nach Änderungen an Tools/Schemas musst du sowohl den Server neu starten als auch jeden Client neu verbinden lassen:

  1. Neu erstellen: npm run build

  2. Starte den Serverprozess neu, damit er das neue dist/ lädt:

    • LaunchAgent (HTTP-Transport): launchctl kickstart -k gui/$(id -u)/com.sanderrobijns.omnifocus-mcp

    • Überprüfe, dass er das neue Schema ausliefert: lsof -nP -iTCP:3000 -sTCP:LISTEN sollte eine frisch gestartete PID zeigen.

  3. Verbinde jeden Client neu, damit er tools/list erneut abruft:

    • Claude Code / Cowork: starte eine neue Sitzung (eine laufende Sitzung behält ihr gecachtes Schema für ihre gesamte Lebensdauer).

    • Claude Desktop: beende die App und öffne sie erneut (oder schalte den Server aus/ein).

    • claude.ai / Claude iOS benutzerdefinierter Connector: synchronisiere den Connector in Einstellungen → Connectors erneut (er cached die Tool-Liste auf Connector-Ebene).

Bis sich der Client neu verbindet, zeigt er weiterhin das alte Schema, auch wenn der Server bereits das neue ausliefert.

Lizenz

MIT

Danksagungen

Erstellt mit:

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity
Issues opened vs closed

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

View all related MCP servers

Related MCP Connectors

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

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

  • MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent

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/estrenuo/omnifocus-mcp-server'

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