Skip to main content
Glama
steveardis
by steveardis

omnifocus-mcp

Un servidor MCP para OmniFocus que expone toda la API de JavaScript de Omni Automation a los clientes de LLM.

Solo macOS. Requiere que OmniFocus se esté ejecutando en la misma máquina. Toda la implementación ejecuta fragmentos OmniJS dentro de OmniFocus mediante osascript -l JavaScript — sin generación de cadenas de AppleScript ni limitaciones del diccionario de scripting.

Requisitos previos

  • macOS (Omni Automation solo está disponible en macOS; el servidor no se iniciará en otras plataformas)

  • OmniFocus instalado y en ejecución

  • Node.js ≥ 20

Related MCP server: OmniFocus MCP Server

Instalación

El paquete se publica en npm como @scardis/omnifocus-mcp.

Mediante npx (sin necesidad de instalar)

Añádelo a la configuración de tu cliente MCP (p. ej., Claude Desktop claude_desktop_config.json):

{
  "mcpServers": {
    "omnifocus": {
      "command": "npx",
      "args": ["-y", "@scardis/omnifocus-mcp"]
    }
  }
}

Desde el código fuente

git clone https://github.com/steveardis/omnifocus-mcp.git
cd omnifocus-mcp
npm install
npm run build

Luego configura tu cliente MCP:

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

Herramientas disponibles

Lectura

Herramienta

Descripción

list_projects

Proyectos con filtrado opcional por status, folderId y flagged. Por defecto excluye los estados done/dropped. Límite (100 por defecto).

get_project

Detalle completo del proyecto por ID estable.

list_tasks

Tareas acotadas por projectId, folderId, inbox: true o all: true, con filtros opcionales de status/tag/due/flagged. Límite (200 por defecto).

get_task

Detalle completo de la tarea por ID estable — incluye fechas de defer/planned/due, etiquetas, regla de repetición y parentTaskId.

list_folders

Carpetas con filtro opcional de status. Límite (200 por defecto).

get_folder

Detalle completo de la carpeta por ID estable, incluidos los IDs de carpetas y proyectos hijos.

list_tags

Etiquetas con filtro opcional de status. Límite (200 por defecto).

get_tag

Detalle completo de la etiqueta por ID estable, incluidos los IDs de etiquetas hijas.

resolve_name

Resuelve un nombre en candidatos de ID estable — nunca desambigua silenciosamente; devuelve todas las coincidencias.

Escritura

Herramienta

Descripción

create_task

Crea una tarea en inbox, en un proyecto o como subtarea. Admite fechas de defer/planned/due, etiquetas, flagged, minutos estimados y reglas de repetición.

edit_task

Edita cualquier campo de la tarea. Pasa null para borrar fechas o la repetición. Los campos omitidos no se modifican.

complete_task

Marca una tarea como completada.

drop_task

Marca una tarea como descartada.

delete_task

Elimina permanentemente una tarea y todas sus subtareas.

create_project

Crea un proyecto, opcionalmente dentro de una carpeta. Admite tipo, status, intervalo de revisión y etiquetas.

edit_project

Edita los campos de un proyecto.

complete_project

Marca un proyecto como completado.

drop_project

Marca un proyecto como descartado.

delete_project

Elimina permanentemente un proyecto y todas sus tareas.

create_folder

Crea una carpeta, opcionalmente anidada.

edit_folder

Cambia el nombre de una carpeta.

delete_folder

Elimina permanentemente una carpeta y todo su subárbol.

create_tag

Crea una etiqueta, opcionalmente anidada.

edit_tag

Edita el nombre o el status de una etiqueta.

delete_tag

Elimina permanentemente una etiqueta y sus etiquetas hijas.

move_task

Mueve una tarea a un proyecto o conviértela en subtarea de otra tarea.

move_project

Mueve un proyecto a una carpeta o al nivel superior.

Modelo de direccionamiento

Cada entidad devuelta por este servidor incluye un campo id estable (id.primaryKey de OmniFocus). Usa este ID en las llamadas posteriores en lugar de los nombres. Los nombres pueden ser ambiguos; los IDs no.

Si tienes un nombre pero no un ID, usa resolve_name. Devuelve una lista — si se devuelven varios candidatos, inspecciona el campo path y pide al usuario que desambigüe antes de continuar con cualquier operación de escritura.

Comparación con otros servidores MCP de OmniFocus

Existen dos alternativas destacables: themotionmachine/OmniFocus-MCP y jqlts1/omnifocus-mcp-enhanced (un fork de la anterior con herramientas adicionales).

API de scripting. Las alternativas usan el diccionario de scripting de JXA o AppleScript para controlar OmniFocus. Este servidor realiza una única llamada JXA — Application('OmniFocus').evaluateJavascript() — y ejecuta toda la lógica como OmniJS (Omni Automation) dentro de OmniFocus. Esto da acceso a toda la superficie de la API de Omni Automation (reglas de recurrencia, intervalos de revisión, perspectivas, forecast, archivos adjuntos, automatización de URLs, etc.) en lugar del más limitado diccionario de scripting.

Inyección de argumentos. Las alternativas construyen comandos de osascript mediante interpolación de cadenas, lo que puede fallar con apóstrofos, comillas, barras invertidas y caracteres Unicode en los nombres. Este servidor serializa todos los argumentos con JSON.stringify en un literal de JS.

Direccionamiento de entidades. Las alternativas direccionan las entidades principalmente por nombre. Este servidor devuelve un id estable (id.primaryKey) para cada entidad y proporciona resolve_name para asignar un nombre a candidatos de ID — devolviendo todas las coincidencias con rutas completas en lugar de elegir una silenciosamente cuando los nombres son ambiguos.

CRUD completo. Este servidor permite crear, editar, completar, descartar, eliminar y mover tareas, proyectos, carpetas y etiquetas, además de reglas de repetición y la fecha planned de OmniFocus 4.

Desarrollo

# Type-check without building
npm run typecheck

# Run unit tests (no OmniFocus required)
npm test

# Build
npm run build

Pruebas

Pruebas unitarias (no requieren OmniFocus)

npm test

Pruebas de integración

⚠️ Las pruebas de integración se ejecutan contra tu base de datos real de OmniFocus.

Cada ejecución de pruebas crea una carpeta temporal de nivel superior llamada __MCP_TEST_<uuid>__ y la elimina al finalizar. Si una ejecución se interrumpe antes de la finalización, ejecuta el script de limpieza:

npm run test:cleanup-fixtures

⚠️ Advertencia sobre la sincronización: De forma predeterminada, las pruebas de integración se niegan a ejecutarse si la sincronización de OmniFocus está activada, para evitar que los datos de prueba se propaguen a tus otros dispositivos. Desactiva primero la sincronización de OmniFocus o establece MCP_TEST_ALLOW_SYNC=1 para optar por participar (los datos de prueba se sincronizarán):

# Default (refuses if sync enabled)
npm run test:integration

# With sync enabled (use carefully)
MCP_TEST_ALLOW_SYNC=1 npm run test:integration

Limpiar datos de prueba obsoletos

npm run test:cleanup-fixtures

Esto elimina cualquier carpeta __MCP_TEST_*__ y los proyectos/etiquetas __mcp_*__ huérfanos que hayan quedado en OmniFocus tras ejecuciones de pruebas interrumpidas.

Contribuciones

¡Las contribuciones son bienvenidas! A continuación te explicamos cómo empezar:

  1. Haz un fork y clona el repositorio

  2. Instala las dependencias: npm install

  3. Ejecuta las pruebas unitarias (no se necesita OmniFocus): npm test

  4. Ejecuta las pruebas de integración (requiere macOS + OmniFocus): npm run test:integration

Antes de enviar un PR

  • npm run typecheck — debe pasar sin errores

  • npm test — todas las pruebas unitarias deben pasar

  • npm run test:integration — todas las pruebas de integración deben pasar (solo macOS)

  • Mantén los cambios enfocados: una funcionalidad o corrección por PR

Descripción general de la arquitectura

El servidor ejecuta fragmentos OmniJS dentro de OmniFocus mediante osascript -l JavaScript. Cada herramienta tiene tres capas:

  • Esquema (src/schemas/shapes.ts) — esquemas Zod para la validación de entrada y el análisis de salida.

  • Fragmento (`src/snippets/*.

A
license - permissive license
A
quality
F
maintenance

Maintenance

0Releases (12mo)

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

Related MCP Servers

View all related MCP servers

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

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