Independent CLI and MCP server for OmniFocus 4, running in Podman. Exposes OmniFocus task management as MCP tools consumable by Claude over stdio transport.
Strong schema coverage and consistent naming across 25 tools. All tools have descriptions (avg 95 chars) and input schemas with typed parameters. Naming follows verb_noun pattern (list_tasks, add_task, update_task, etc.). However, parameter descriptions are often minimal (5-15 chars), output schemas are undocumented, and error handling lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Missing pagination guidance for list tools. Descriptions could be more LLM-optimized per pattern:tool-description baseline (target 50-200 chars).
Create a new folder.
Create a new project.
Create a new tag.
Create a new OmniFocus task.
Mark a project completed.
Mark a task as completed by ID or fuzzy name.
Drop a folder.
Drop a tag.
Output schemas undocumented. No tool returns a documented schema showing what fields the LLM should expect (e.g., task object structure, field types, required vs optional fields). Per pattern:tool and mxe:response-field-naming, LLMs need to know output structure to plan downstream calls.
Parameter descriptions too brief. Most params have 5-15 char descriptions (e.g., 'Task ID', 'Project name'). Per pattern:tool-description baseline (avg 72 chars), descriptions should explain WHAT the param controls, WHEN to use it, and FORMAT constraints. E.g., 'project' should say 'Project name substring (case-insensitive, matches partial names)'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Retrieve a single folder by id.
Return the nested folder/project tree.
Retrieve a single project by id.
Retrieve a single tag by id.
Get a single task by its OmniFocus ID.
List all folders.
List projects (optionally filtered by status).
List projects that are due for review.
List all tags.
List active OmniFocus tasks. Optionally filter by inbox, today (due today or overdue), flagged, project name (substring), or tasks with a due date.
Stamp a project as reviewed.
Fuzzy search tasks by name or ID.
Trigger a full WebDAV sync.
Update a folder.
Update a project.
Update a tag.
Update task fields and state.
No tool annotations. Tools marked DESTRUCTIVE (drop_folder, drop_tag) and WRITE (add_task, update_task, sync_now) lack destructiveHint and readOnlyHint annotations. Per current MCP spec (2026-07-28), tool annotations guide agent safety and planning. Agents cannot distinguish safe reads from destructive writes without them.
No error recovery guidance. Tools return OFError as plain text (e.g., 'error: <message>') with no actionable next steps. Per pattern:recovery-guide, errors should tell the LLM what to do: 'Project not found. Try list_projects() to see available projects.' Current implementation provides no such guidance.
Pagination not documented for list tools. list_tasks, list_projects, list_projects_for_review, list_folders, list_tags accept 'limit' but no offset/cursor or total_count. Per pattern:paginated-result, list tools should document pagination strategy and return total count or next_cursor to enable multi-page iteration.