omnifocus-mcp
omnifocus-mcp
MCP-сервер для OmniFocus, который предоставляет LLM-клиентам полный JavaScript API Omni Automation.
Только macOS. Требуется, чтобы OmniFocus был запущен на той же машине. Вся реализация выполняет сниппеты OmniJS внутри OmniFocus через osascript -l JavaScript — без генерации строк AppleScript, без ограничений словаря сценариев.
Предварительные требования
macOS (Omni Automation доступен только в macOS; сервер не запустится на других платформах)
OmniFocus установлен и запущен
Node.js ≥ 20
Related MCP server: OmniFocus MCP Server
Установка
Пакет опубликован в npm как @scardis/omnifocus-mcp.
Через npx (установка не требуется)
Добавьте в конфигурацию вашего MCP-клиента (например, Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"omnifocus": {
"command": "npx",
"args": ["-y", "@scardis/omnifocus-mcp"]
}
}
}Из исходного кода
git clone https://github.com/steveardis/omnifocus-mcp.git
cd omnifocus-mcp
npm install
npm run buildЗатем настройте вашего MCP-клиента:
{
"mcpServers": {
"omnifocus": {
"command": "node",
"args": ["/absolute/path/to/omnifocus-mcp/dist/server.js"]
}
}
}Доступные инструменты
Чтение
Инструмент | Описание |
| Проекты с необязательной фильтрацией по status, folderId, flagged. По умолчанию исключаются выполненные/отменённые. Лимит (по умолчанию 100). |
| Полная информация о проекте по стабильному ID |
| Задачи, ограниченные |
| Полная информация о задаче по стабильному ID — включает даты defer/planned/due, теги, правило повторения, parentTaskId |
| Папки с необязательным фильтром по status. Лимит (по умолчанию 200). |
| Полная информация о папке по стабильному ID, включая ID дочерних папок и проектов |
| Теги с необязательным фильтром по status. Лимит (по умолчанию 200). |
| Полная информация о теге по стабильному ID, включая ID дочерних тегов |
| Преобразует имя в кандидатов со стабильным ID — никогда не устраняет неоднозначность молча; возвращает все совпадения |
Запись
Инструмент | Описание |
| Создаёт задачу в inbox, проекте или как подзадачу. Поддерживает даты defer/planned/due, теги, flagged, оценку в минутах и правила повторения. |
| Изменяет любое поле задачи. Передайте |
| Помечает задачу выполненной |
| Помечает задачу отменённой |
| Навсегда удаляет задачу и все подзадачи |
| Создаёт проект, опционально в папке. Поддерживает type, status, интервал проверки, теги. |
| Изменяет поля проекта |
| Помечает проект выполненным |
| Помечает проект отменённым |
| Навсегда удаляет проект и все его задачи |
| Создаёт папку, опционально вложенную |
| Переименовывает папку |
| Навсегда удаляет папку и всё поддерево |
| Создаёт тег, опционально вложенный |
| Изменяет имя тега или status |
| Навсегда удаляет тег и дочерние теги |
| Перемещает задачу в проект или делает её подзадачей другой задачи |
| Перемещает проект в папку или на верхний уровень |
Модель адресации
Каждая сущность, возвращаемая этим сервером, содержит стабильное поле id (id.primaryKey из OmniFocus). Используйте этот ID в последующих вызовах вместо имён. Имена могут быть неоднозначными; ID — нет.
Если у вас есть имя, но нет ID, используйте resolve_name. Он возвращает список — если возвращено несколько кандидатов, просмотрите поле path и попросите пользователя устранить неоднозначность перед выполнением любой операции записи.
Сравнение с другими MCP-серверами для OmniFocus
Существуют две известные альтернативы: themotionmachine/OmniFocus-MCP и jqlts1/omnifocus-mcp-enhanced (форк предыдущего с дополнительными инструментами).
API скриптования. Альтернативы используют словарь сценариев JXA или AppleScript для управления OmniFocus. Этот сервер делает один вызов JXA — Application('OmniFocus').evaluateJavascript() — и выполняет всю логику как OmniJS (Omni Automation) внутри OmniFocus. Это даёт доступ ко всей поверхности API Omni Automation (правила повторения, интервалы проверки, представления, прогноз, вложения, автоматизация URL и т.д.), а не к более ограниченному словарю сценариев.
Внедрение аргументов. Альтернативы формируют команды osascript через строковую интерполяцию, которая может ломаться на апострофах, кавычках, обратных слешах и юникоде в именах. Этот сервер сериализует все аргументы с помощью JSON.stringify в JS-литерал.
Адресация сущностей. Альтернативы адресуют сущности в основном по имени. Этот сервер возвращает стабильный id (id.primaryKey) для каждой сущности и предоставляет resolve_name для сопоставления имени с кандидатами ID — возвращая все совпадения с полными путями, а не молча выбирая одно при неоднозначности имён.
Полный CRUD. Этот сервер поддерживает создание, изменение, завершение, отмену, удаление и перемещение задач, проектов, папок и тегов — а также правила повторения и дату планирования OmniFocus 4.
Разработка
# Type-check without building
npm run typecheck
# Run unit tests (no OmniFocus required)
npm test
# Build
npm run buildТестирование
Модульные тесты (OmniFocus не требуется)
npm testИнтеграционные тесты
⚠️ Интеграционные тесты работают с вашей реальной базой данных OmniFocus.
Каждый запуск тестов создаёт временную папку верхнего уровня с именем
__MCP_TEST_<uuid>__и удаляет её при завершении. Если запуск тестов был прерван до завершения, выполните скрипт очистки:npm run test:cleanup-fixtures
⚠️ Предупреждение о синхронизации: По умолчанию интеграционные тесты отказываются запускаться, если включена синхронизация OmniFocus, чтобы тестовые данные не распространялись на другие ваши устройства. Сначала отключите синхронизацию OmniFocus или установите
MCP_TEST_ALLOW_SYNC=1, чтобы согласиться (тестовые данные будут синхронизироваться):
# Default (refuses if sync enabled)
npm run test:integration
# With sync enabled (use carefully)
MCP_TEST_ALLOW_SYNC=1 npm run test:integrationОчистка устаревших тестовых данных
npm run test:cleanup-fixturesЭто удаляет все папки __MCP_TEST_*__ и осиротевшие проекты/теги __mcp_*__, оставшиеся в OmniFocus после прерванных запусков тестов.
Участие в разработке
Вклад приветствуется! Вот как начать:
Сделайте форк и клонируйте репозиторий
Установите зависимости:
npm installЗапустите модульные тесты (OmniFocus не нужен):
npm testЗапустите интеграционные тесты (требуются macOS и OmniFocus):
npm run test:integration
Перед отправкой PR
npm run typecheck— должен проходить без ошибокnpm test— все модульные тесты должны проходитьnpm run test:integration— все интеграционные тесты должны проходить (только macOS)Держите изменения сфокусированными — одна функция или исправление на PR
Обзор архитектуры
Сервер выполняет сниппеты OmniJS внутри OmniFocus через osascript -l JavaScript. Каждый инструмент состоит из трёх слоёв:
Схема (
src/schemas/shapes.ts) — схемы Zod для проверки ввода и разбора выводаСниппет (
src/snippets/*.js) — код OmniJS, который выполняется внутри OmniFocus. Обычный JavaScript ES5 (без импортов, без TypeScript). Аргументы внедряются через плейсхолдер__ARGS__.Обработчик инструмента (
src/tools/*.ts) — проверяет ввод, вызываетrunSnippet(), разбирает результат
При добавлении нового инструмента:
Определите схемы ввода/вывода в
src/schemas/shapes.tsи экспортируйте их изsrc/schemas/index.tsСоздайте сниппет OmniJS в
src/snippets/Добавьте имя сниппета в
ALLOWED_SNIPPETSвsrc/runtime/snippetLoader.tsСоздайте обработчик инструмента в
src/tools/и зарегистрируйте его вsrc/tools/index.tsДобавьте модульные тесты для схем и интеграционные тесты, которые выполняются с OmniFocus
Написание сниппетов OmniJS
Сниппеты выполняются в JavaScript-среде OmniFocus, а не в Node.js. Ключевые ограничения:
JavaScript в стиле ES5 — используйте
var,function(){}, без стрелочных функций в старых версиях OmniFocusБез импортов — все глобальные объекты OmniJS (
flattenedTasks,flattenedProjects,moveTasksи т.д.) доступны напрямуюВозвращайте JSON — всегда
return JSON.stringify({ ok: true, data: ... })Паттерн ошибок — выбрасывайте именованные ошибки (
NotFoundError,ValidationError), которые мост перехватывает и оборачивает
Лицензия
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