MCP server for OmniFocus integration using Omni Automation
This server has 4 read-only tools with basic descriptions but significant quality gaps. All tools have empty input schemas (no parameters), which is appropriate for simple queries but limits expressiveness. Descriptions are adequate in length (120-160 chars) but lack critical contextual detail about when to use each tool versus alternatives, dependencies, and output structure. No parameter descriptions exist (because no parameters are defined). Output schemas are completely undocumented, LLMs don't know what fields to expect from each tool, making it hard to chain results. No error handling guidance. Tool naming follows verb_noun convention (get_*) which is good, but the four tools (get_active_tasks, get_all_tasks, get_active_projects, get_all_projects) have confusing similarity that creates LLM disambiguation friction. The tool set is minimal and read-only, which reduces security risk but also limits utility.
Call this tool to get a list of all active (not completed or dropped) projects from OmniFocus. Use it when the user asks for their 'active projects' or 'current projects'.
Call this tool to get a list of all active (uncompleted) tasks from the user's OmniFocus. Use it when the user asks for their 'active tasks', 'current tasks', or 'open tasks'.
Call this tool to get a list of all projects from OmniFocus, including completed and dropped ones. Use it when the user explicitly asks for 'all projects'.
Call this tool to get a list of all tasks from OmniFocus, including completed ones. Use it when the user explicitly asks for 'all tasks' or 'completed tasks'.
Output schemas are completely undocumented. LLMs do not know what fields each tool returns (e.g., does a task have priority, due_date, project_id?), forcing them to guess at response structure and making it impossible to chain tool results or extract specific fields.
Four nearly identical tool names (get_active_tasks vs get_all_tasks, get_active_projects vs get_all_projects) create naming ambiguity. The distinction is 'active' vs 'all', but descriptions do not clearly explain when to use each variant. LLMs are known to conflate similar names and pick the wrong tool.
Descriptions lack guidance on when to call each tool and what makes them different. E.g., 'get_all_tasks' says 'when the user explicitly asks for all tasks or completed tasks', but are completed tasks included or only incomplete ones? Does 'all tasks' include archived/deleted tasks? This ambiguity forces LLMs to guess.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 9 | - | v1 |
No error handling guidance in tool definitions. If OmniFocus is not running or returns data in an unexpected format, the tool returns JSON with an 'error' field, but the description does not tell the LLM what to do next (e.g., 'Check that OmniFocus is running and try again').
Tool names do not include field-specific qualifiers. If the server eventually adds filters (e.g., get_tasks_by_project, get_tasks_due_today), disambiguation becomes harder. Current names are too broad and could collide with future filtering tools.