omnifocus-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@omnifocus-mcplist my tasks due today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
omnifocus-mcp
An MCP server for OmniFocus that exposes the full Omni Automation JavaScript API to LLM callers.
macOS only. Requires OmniFocus running on the same machine. The entire implementation runs OmniJS snippets inside OmniFocus via osascript -l JavaScript — no AppleScript string generation, no scripting dictionary limitations.
Prerequisites
macOS (Omni Automation is macOS-only; the server will not start on other platforms)
OmniFocus installed and running
Node.js ≥ 20
Related MCP server: OmniFocus MCP Server
Install
The package is published to npm as @scardis/omnifocus-mcp.
Via npx (no install required)
Add to your MCP client config (e.g. Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"omnifocus": {
"command": "npx",
"args": ["-y", "@scardis/omnifocus-mcp"]
}
}
}From source
git clone https://github.com/steveardis/omnifocus-mcp.git
cd omnifocus-mcp
npm install
npm run buildThen configure your MCP client:
{
"mcpServers": {
"omnifocus": {
"command": "node",
"args": ["/absolute/path/to/omnifocus-mcp/dist/server.js"]
}
}
}Available Tools
Read
Tool | Description |
| Projects with optional filtering by status, folderId, flagged. Default excludes done/dropped. Limit (default 100). |
| Full project detail by stable ID |
| Tasks scoped by |
| Full task detail by stable ID — includes defer/planned/due dates, tags, repetition rule, parentTaskId |
| Folders with optional status filter. Limit (default 200). |
| Full folder detail by stable ID, including child folder and project IDs |
| Tags with optional status filter. Limit (default 200). |
| Full tag detail by stable ID, including child tag IDs |
| Resolve a name to stable ID candidates — never silently disambiguates; returns all matches |
Write
Tool | Description |
| Create a task in inbox, project, or as subtask. Supports defer/planned/due dates, tags, flagged, estimated minutes, and repetition rules. |
| Edit any task field. Pass |
| Mark a task complete |
| Mark a task dropped |
| Permanently delete a task and all subtasks |
| Create a project, optionally in a folder. Supports type, status, review interval, tags. |
| Edit project fields |
| Mark a project complete |
| Mark a project dropped |
| Permanently delete a project and all its tasks |
| Create a folder, optionally nested |
| Rename a folder |
| Permanently delete a folder and entire subtree |
| Create a tag, optionally nested |
| Edit tag name or status |
| Permanently delete a tag and child tags |
| Move a task to a project or make it a subtask of another task |
| Move a project to a folder or to top level |
Addressing model
Every entity returned by this server includes a stable id field (id.primaryKey from OmniFocus). Use this ID in subsequent calls rather than names. Names can be ambiguous; IDs are not.
If you have a name but not an ID, use resolve_name. It returns a list — if multiple candidates are returned, inspect the path field and ask the user to disambiguate before proceeding with any write operation.
Comparison with other OmniFocus MCP servers
Two notable alternatives exist: themotionmachine/OmniFocus-MCP and jqlts1/omnifocus-mcp-enhanced (a fork of the above with additional tools).
Scripting API. The alternatives use the JXA scripting dictionary or AppleScript to drive OmniFocus. This server makes a single JXA call — Application('OmniFocus').evaluateJavascript() — and runs all logic as OmniJS (Omni Automation) inside OmniFocus. This gives access to the full Omni Automation API surface (recurrence rules, review intervals, perspectives, forecast, attachments, URL automation, etc.) rather than the more limited scripting dictionary.
Argument injection. The alternatives construct osascript commands via string interpolation, which can break on apostrophes, quotes, backslashes, and unicode in names. This server serializes all arguments with JSON.stringify into a JS literal.
Entity addressing. The alternatives address entities primarily by name. This server returns a stable id (id.primaryKey) for every entity and provides resolve_name to map a name to ID candidates — returning all matches with full paths rather than silently picking one when names are ambiguous.
Full CRUD. This server supports creating, editing, completing, dropping, deleting, and moving tasks, projects, folders, and tags — plus repetition rules and OmniFocus 4's planned date.
Development
# Type-check without building
npm run typecheck
# Run unit tests (no OmniFocus required)
npm test
# Build
npm run buildTesting
Unit tests (no OmniFocus required)
npm testIntegration tests
⚠️ Integration tests run against your real OmniFocus database.
Each test run creates a temporary top-level folder named
__MCP_TEST_<uuid>__and deletes it on teardown. If a test run is interrupted before teardown, run the cleanup script:npm run test:cleanup-fixtures
⚠️ Sync warning: By default, integration tests refuse to run if OmniFocus sync is enabled, to prevent test fixtures from propagating to your other devices. Disable OmniFocus sync first, or set
MCP_TEST_ALLOW_SYNC=1to opt in (fixtures will sync):
# Default (refuses if sync enabled)
npm run test:integration
# With sync enabled (use carefully)
MCP_TEST_ALLOW_SYNC=1 npm run test:integrationClean up stale test fixtures
npm run test:cleanup-fixturesThis removes any __MCP_TEST_*__ folders and orphaned __mcp_*__ projects/tags left in OmniFocus from interrupted test runs.
Contributing
Contributions are welcome! Here's how to get started:
Fork and clone the repo
Install dependencies:
npm installRun unit tests (no OmniFocus needed):
npm testRun integration tests (requires macOS + OmniFocus):
npm run test:integration
Before submitting a PR
npm run typecheck— must pass with no errorsnpm test— all unit tests must passnpm run test:integration— all integration tests must pass (macOS only)Keep changes focused — one feature or fix per PR
Architecture overview
The server runs OmniJS snippets inside OmniFocus via osascript -l JavaScript. Each tool has three layers:
Schema (
src/schemas/shapes.ts) — Zod schemas for input validation and output parsingSnippet (
src/snippets/*.js) — OmniJS code that runs inside OmniFocus. Plain ES5 JavaScript (no imports, no TypeScript). Arguments are injected via__ARGS__placeholder.Tool handler (
src/tools/*.ts) — Validates input, callsrunSnippet(), parses the result
When adding a new tool:
Define input/output schemas in
src/schemas/shapes.tsand export fromsrc/schemas/index.tsCreate the OmniJS snippet in
src/snippets/Add the snippet name to
ALLOWED_SNIPPETSinsrc/runtime/snippetLoader.tsCreate the tool handler in
src/tools/and register it insrc/tools/index.tsAdd unit tests for schemas and integration tests that run against OmniFocus
Writing OmniJS snippets
Snippets run inside OmniFocus's JavaScript runtime, not Node.js. Key constraints:
ES5-style JavaScript — use
var,function(){}, no arrow functions in older OmniFocus versionsNo imports — all OmniJS globals (
flattenedTasks,flattenedProjects,moveTasks, etc.) are available directlyReturn JSON — always
return JSON.stringify({ ok: true, data: ... })Error pattern — throw named errors (
NotFoundError,ValidationError) which the bridge catches and wraps
License
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