Production-grade infrastructure for AI agents. 46ms reads. 2,561 tests. Your tasks deserve a bridge that won't break under pressure.
Set up — takes 2 minutes ↓Wizard or copy-paste. No install, no terminal.
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.
Everything's right here — configure, restart, use it. Two quick permission prompts come up along the way; we show you exactly what to click.
Add OmniFocus Operator to your client config. uvx downloads and runs the server automatically — nothing to install. Use the wizard, or paste it yourself.
Quit Claude Desktop completely (⌘Q), then reopen it. On first launch, macOS shows this prompt:
🛡️ It's safe — just click Allow. uvx reads your OmniFocus data, which lives in OmniFocus's private folder, so macOS double-checks first. The server only reads your local database; nothing leaves your Mac.
macOS forgets the approval because uvx runs from a fresh temporary location each time. Grant Claude Desktop Full Disk Access once and the prompt stops nagging you:
You may still see the prompt once more after this — Claude starts some servers lazily — but it stops coming back on every launch.
Ask Claude anything about OmniFocus. The very first request — even a simple read — pops this prompt in OmniFocus, just once:
🛡️ Tick the box, click Run Script — done. The script ships with onboarding baked into the top, so you know exactly what to click. OmniFocus won't ask again on this machine.
An unknown application is attempting to run an Omni Automation Script in OmniFocus. Only run scripts if you understand them and trust their source.
// =================================================================
// 👋 Welcome to OmniFocus Operator
//
// ✨ One-time permission check. Two steps to finish:
// 1. ⬇️ Scroll all the way down ↓↓↓
// 2. ✅ Then tick the box & click "Run Script"
//
// 🎉 After that, OmniFocus won't ask again on this machine.
//
// 🔗 github.com/HelloThisIsFlo/omnifocus-operator
// =================================================================
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, task movement, repetition rules, and hierarchy properties (parallel/sequential, completes-with-children). List tools support filtering by parent subtree.
{
"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.
Other great projects exist. Here are the facts.
| Feature | OmniFocus Operator | themotionmachine | jqlts1 | deverman |
|---|---|---|---|---|
| Language | Python 3.12+ | TypeScript | TypeScript | Swift |
| Tools | 11 | 10 | 17 | 13 |
| Automated Tests | 2,561 | 0 | 12 | ~4 suites |
| Code Coverage | 97% | — | — | — |
| Read Latency | ~46ms | 1–3s | 1–3s | ~1s |
| Architecture | 3-layer | Flat | Flat | Multi-layer |
| Graceful Degradation | ✓ | — | — | — |
| Agent-First UX | ✓ | — | — | — |
2,561 tests. Strict mypy with Pydantic plugin. Ruff linting across 9 rule categories. The build fails below 80% coverage.