Production-grade infrastructure for AI agents. 46ms reads. 534 tests. Your tasks deserve a bridge that won't break under pressure.
The first one took 3 seconds to return your tasks. The second crashed silently when OmniFocus wasn't running. The third worked fine — until your agent tried to edit a task and got back nothing. No error. No feedback. Just silence and a broken conversation.
These projects are thin AppleScript wrappers. Flat scripts with no test coverage, no error handling, no awareness that an AI agent is on the other end. They work for demos. They break when you depend on them.
OmniFocus is where your work lives. The bridge to it deserves the same care.
One command. No config files. No environment variables. Just pipx install and you're done.
Paste the server config into your Claude Desktop JSON. The command is just omnifocus-operator — nothing else.
"Show me my OmniFocus tasks." That's it. Full read/write access to your OmniFocus database.
Your agent shouldn't wait. At 46ms for a full database snapshot, it won't. We read OmniFocus's local SQLite database directly — no AppleScript, no OmniJS round-trips.
| Operation | Latency |
|---|---|
| Full task read | 38–40ms |
| Full snapshot (all tables) | 45–49ms |
| Filtered queries | 5.8–6.0ms |
| Task + tag joins | 5.1–6.0ms |
Benchmarked on a real database: 2,800+ tasks, 368 projects, 65 tags.
Most MCP servers return data. OmniFocus Operator returns data and teaches your agent to be better. Every response carries context that makes the next interaction smarter.
When an agent tries to add a tag that's already present, it learns to check first.
Edits to completed tasks go through — but the agent learns to pause before modifying finished work.
When an edit would change nothing, the agent learns patch semantics in context.
If startup fails, the server stays alive. Every tool call returns the error — visible to the agent, actionable by the user.
A task can be both overdue AND blocked. No information loss from a single-winner enum.
Four position modes give your agent pixel-perfect control over task order. No other OmniFocus MCP server can do this.
One sentence. Four position modes. Seven API calls.
MCP servers that crash silently leave your agent stranded. This one doesn't crash.
If startup fails, every tool call returns the error. No silent crashes. No mysterious timeouts. The agent sees what went wrong.
SQLite cache unavailable? The server falls back to the OmniJS bridge. Slower, but functional. Your agent never gets a dead connection.
If test code tries to access the live OmniFocus database, the factory raises a RuntimeError. Not a warning — a hard stop.
All read tools are idempotent. Write tools support tags, dates, flags, notes, estimated duration, and task movement.
{
"items": [{
"name": "Review Q3 roadmap",
"parent": "pJKx9xL5beb",
"tags": ["Work", "Planning"],
"dueDate": "2026-03-15T17:00:00Z",
"flagged": true,
"estimatedMinutes": 30
}]
}
{
"items": [{
"id": "oRx3bL_UYq7",
"addTags": ["Urgent"],
"dueDate": null, // ← clears the date
"moveTo": {
"ending": "pJKx9xL5beb"
}
}]
}
| Input | Meaning |
|---|---|
| Field omitted | No change |
| null | Clear the value |
| A value | Update |
You don't need to understand the architecture to use it. But it's why the server is fast, reliable, and maintainable.
Single runtime dependency: mcp>=1.26.0
Other great projects exist. Here are the facts.
| Feature | OmniFocus Operator | themotionmachine | jqlts1 | deverman |
|---|---|---|---|---|
| Language | Python 3.12+ | TypeScript | TypeScript | Swift |
| Tools | 6 | 10 | 17 | 13 |
| Automated Tests | 534 | 0 | 12 | ~4 suites |
| Code Coverage | 94% | — | — | — |
| Read Latency | ~46ms | 1–3s | 1–3s | ~1s |
| Architecture | 3-layer | Flat | Flat | Multi-layer |
| Graceful Degradation | ✓ | — | — | — |
| Agent-First UX | ✓ | — | — | — |
| Runtime Dependencies | 1 | Multiple | Multiple | Multiple |
466 Python tests + 68 JavaScript tests. Strict mypy with Pydantic plugin. Ruff linting across 9 rule categories. The build fails below 80% coverage.
macOS, OmniFocus 4, Python 3.12+. That's all you need.