omnifocus-mcp
omnifocus-mcp
Ein MCP-Server für OmniFocus, der LLM-Aufrufern die vollständige Omni-Automation-JavaScript-API zugänglich macht.
Nur macOS. Erfordert, dass OmniFocus auf demselben Rechner läuft. Die gesamte Implementierung führt OmniJS-Snippets über osascript -l JavaScript innerhalb von OmniFocus aus — keine AppleScript-Stringgenerierung, keine Einschränkungen durch das Skriptwörterbuch.
Voraussetzungen
macOS (Omni Automation ist nur für macOS verfügbar; der Server startet auf anderen Plattformen nicht)
OmniFocus installiert und läuft
Node.js ≥ 20
Related MCP server: OmniFocus MCP Server
Installation
Das Paket ist als @scardis/omnifocus-mcp auf npm veröffentlicht.
Über npx (keine Installation erforderlich)
Füge es zu deiner MCP-Client-Konfiguration hinzu (z. B. Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"omnifocus": {
"command": "npx",
"args": ["-y", "@scardis/omnifocus-mcp"]
}
}
}Aus dem Quellcode
git clone https://github.com/steveardis/omnifocus-mcp.git
cd omnifocus-mcp
npm install
npm run buildKonfiguriere anschließend deinen MCP-Client:
{
"mcpServers": {
"omnifocus": {
"command": "node",
"args": ["/absolute/path/to/omnifocus-mcp/dist/server.js"]
}
}
}Verfügbare Tools
Lesen
Tool | Beschreibung |
| Projekte mit optionaler Filterung nach Status, folderId, flagged. Standardmäßig werden erledigt/verworfen ausgeschlossen. Limit (Standard 100). |
| Vollständige Projektdetails anhand der stabilen ID |
| Aufgaben, eingegrenzt durch |
| Vollständige Aufgabendetails anhand der stabilen ID — inklusive defer/planned/due-Daten, Tags, Wiederholungsregel, parentTaskId |
| Ordner mit optionalem Statusfilter. Limit (Standard 200). |
| Vollständige Ordnerdetails anhand der stabilen ID, einschließlich untergeordneter Ordner- und Projekt-IDs |
| Tags mit optionalem Statusfilter. Limit (Standard 200). |
| Vollständige Tag-Details anhand der stabilen ID, einschließlich untergeordneter Tag-IDs |
| Löst einen Namen zu stabilen ID-Kandidaten auf — disambiguiert nie stillschweigend; gibt alle Übereinstimmungen zurück |
Schreiben
Tool | Beschreibung |
| Erstellt eine Aufgabe im Posteingang, in einem Projekt oder als Unteraufgabe. Unterstützt defer/planned/due-Daten, Tags, flagged, geschätzte Minuten und Wiederholungsregeln. |
| Bearbeitet jedes Aufgabenfeld. Übergib |
| Markiert eine Aufgabe als abgeschlossen |
| Markiert eine Aufgabe als verworfen |
| Löscht eine Aufgabe und alle Unteraufgaben dauerhaft |
| Erstellt ein Projekt, optional in einem Ordner. Unterstützt Typ, Status, Review-Intervall, Tags. |
| Bearbeitet Projektfelder |
| Markiert ein Projekt als abgeschlossen |
| Markiert ein Projekt als verworfen |
| Löscht ein Projekt und alle seine Aufgaben dauerhaft |
| Erstellt einen Ordner, optional verschachtelt |
| Benennt einen Ordner um |
| Löscht einen Ordner und den gesamten Teilbaum dauerhaft |
| Erstellt ein Tag, optional verschachtelt |
| Bearbeitet Tag-Namen oder Status |
| Löscht ein Tag und untergeordnete Tags dauerhaft |
| Verschiebt eine Aufgabe in ein Projekt oder macht sie zu einer Unteraufgabe einer anderen Aufgabe |
| Verschiebt ein Projekt in einen Ordner oder auf die oberste Ebene |
Adressierungsmodell
Jede von diesem Server zurückgegebene Entität enthält ein stabiles id-Feld (id.primaryKey aus OmniFocus). Verwende diese ID in nachfolgenden Aufrufen anstelle von Namen. Namen können mehrdeutig sein; IDs nicht.
Wenn du einen Namen, aber keine ID hast, verwende resolve_name. Es gibt eine Liste zurück — wenn mehrere Kandidaten zurückgegeben werden, prüfe das path-Feld und bitte den Benutzer, die Mehrdeutigkeit aufzulösen, bevor du eine Schreiboperation durchführst.
Vergleich mit anderen OmniFocus-MCP-Servern
Es gibt zwei erwähnenswerte Alternativen: themotionmachine/OmniFocus-MCP und jqlts1/omnifocus-mcp-enhanced (ein Fork des obigen mit zusätzlichen Werkzeugen).
Skript-API. Die Alternativen verwenden das JXA-Skriptwörterbuch oder AppleScript, um OmniFocus zu steuern. Dieser Server führt einen einzigen JXA-Aufruf aus — Application('OmniFocus').evaluateJavascript() — und lässt die gesamte Logik als OmniJS (Omni Automation) innerhalb von OmniFocus laufen. Dies ermöglicht Zugriff auf den vollständigen Omni-Automation-API-Umfang (Wiederholungsregeln, Review-Intervalle, Perspektiven, Forecast, Anhänge, URL-Automation usw.) statt des eingeschränkteren Skriptwörterbuchs.
Argument-Injektion. Die Alternativen konstruieren osascript-Befehle per String-Interpolation, was bei Apostrophen, Anführungszeichen, Backslashes und Unicode in Namen zu Fehlern führen kann. Dieser Server serialisiert alle Argumente mit JSON.stringify in ein JS-Literal.
Entitätsadressierung. Die Alternativen adressieren Entitäten hauptsächlich über den Namen. Dieser Server gibt für jede Entität eine stabile id (id.primaryKey) zurück und stellt resolve_name bereit, um einen Namen auf ID-Kandidaten abzubilden — er liefert alle Treffer mit vollständigen Pfaden, statt bei mehrdeutigen Namen stillschweigend einen auszuwählen.
Vollständiges CRUD. Dieser Server unterstützt das Erstellen, Bearbeiten, Abschließen, Verwerfen, Löschen und Verschieben von Aufgaben, Projekten, Ordnern und Tags — sowie Wiederholungsregeln und das geplante Datum von OmniFocus 4.
Entwicklung
# Type-check without building
npm run typecheck
# Run unit tests (no OmniFocus required)
npm test
# Build
npm run buildTesten
Unit-Tests (kein OmniFocus erforderlich)
npm testIntegrationstests
⚠️ Integrationstests laufen gegen deine echte OmniFocus-Datenbank.
Jeder Testlauf erstellt einen temporären Ordner auf oberster Ebene mit dem Namen
__MCP_TEST_<uuid>__und löscht ihn beim Teardown. Wenn ein Testlauf vor dem Teardown unterbrochen wird, führe das Cleanup-Skript aus:npm run test:cleanup-fixtures
⚠️ Sync-Warnung: Standardmäßig weigern sich die Integrationstests zu laufen, wenn die OmniFocus-Synchronisierung aktiviert ist, um zu verhindern, dass Test-Fixtures auf deine anderen Geräte übertragen werden. Deaktiviere zuerst die OmniFocus-Synchronisierung oder setze
MCP_TEST_ALLOW_SYNC=1, um dich zu entscheiden (die Fixtures werden dann synchronisiert):
# Default (refuses if sync enabled)
npm run test:integration
# With sync enabled (use carefully)
MCP_TEST_ALLOW_SYNC=1 npm run test:integrationVeraltete Test-Fixtures aufräumen
npm run test:cleanup-fixturesDies entfernt alle __MCP_TEST_*__-Ordner und verwaiste __mcp_*__-Projekte/Tags, die von unterbrochenen Testläufen in OmniFocus zurückgeblieben sind.
Mitwirken
Beiträge sind willkommen! So legst du los:
Forke und klone das Repository
Installiere Abhängigkeiten:
npm installFühre Unit-Tests aus (kein OmniFocus erforderlich):
npm testFühre Integrationstests aus (erfordert macOS + OmniFocus):
npm run test:integration
Vor dem Einreichen eines PR
npm run typecheck— muss ohne Fehler durchlaufennpm test— alle Unit-Tests müssen bestehennpm run test:integration— alle Integrationstests müssen bestehen (nur macOS)Änderungen fokussiert halten — ein Feature oder Fix pro PR
Architekturübersicht
Der Server führt OmniJS-Snippets über osascript -l JavaScript innerhalb von OmniFocus aus. Jedes Tool hat drei Ebenen:
Schema (
src/schemas/shapes.ts) — Zod-Schemas zur Eingabevalidierung und zum Parsen der AusgabeSnippet (
src/snippets/*.js) — OmniJS-Code, der innerhalb von OmniFocus läuft. Reines ES5-JavaScript (keine Imports, kein TypeScript). Argumente werden über den__ARGS__-Platzhalter injiziert.Tool-Handler (
src/tools/*.ts) — Validiert Eingaben, ruftrunSnippet()auf und parst das Ergebnis
Wenn du ein neues Tool hinzufügst:
Definiere Eingabe-/Ausgabeschemas in
src/schemas/shapes.tsund exportiere sie aussrc/schemas/index.tsErstelle das OmniJS-Snippet in
src/snippets/Füge den Snippet-Namen zu
ALLOWED_SNIPPETSinsrc/runtime/snippetLoader.tshinzuErstelle den Tool-Handler in
src/tools/und registriere ihn insrc/tools/index.tsFüge Unit-Tests für Schemas und Integrationstests hinzu, die gegen OmniFocus laufen
OmniJS-Snippets schreiben
Snippets laufen in der JavaScript-Laufzeitumgebung von OmniFocus, nicht in Node.js. Wichtige Einschränkungen:
JavaScript im ES5-Stil — verwende
var,function(){}, keine Pfeilfunktionen in älteren OmniFocus-VersionenKeine Imports — alle OmniJS-Globals (
flattenedTasks,flattenedProjects,moveTasksusw.) sind direkt verfügbarJSON zurückgeben — gib immer
return JSON.stringify({ ok: true, data: ... })zurückFehlermuster — wirf benannte Fehler (
NotFoundError,ValidationError), die die Brücke abfängt und umschließt
Lizenz
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 Connectors
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
Give your AI agents the tools to build, manage, and run automation workflows.
Read and write your Teleprompter.com scripts and folders: list, create, update, and organize.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables AI-powered task management in OmniFocus with support for project reviews, planned dates, repeating tasks, custom perspectives, hierarchical subtasks, and advanced filtering. Perfect for Claude AI integration with comprehensive CRUD operations for tasks, projects, and folders.2
- AlicenseAqualityDmaintenanceEnables comprehensive management of OmniFocus on macOS through 17 specialized tools for projects, tasks, and organization. Users can create, update, and filter items or navigate the interface using natural language via the Model Context Protocol.216MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to read and write to OmniFocus database, allowing natural language task management, project creation, and GTD workflows.41MIT
- AlicenseAqualityBmaintenanceGives MCP-compatible AI assistants full, typed access to OmniFocus on macOS, enabling task management, project manipulation, inbox processing, and more via natural language.100501MIT
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/steveardis/omnifocus-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server