Repository navigation
Releases
v1.4.7 — FastMCP 4
Changed
- Now runs on FastMCP 4 (
fastmcp>=4,<5), replacing the temporary<3.4cap from 1.4.5. FastMCP 3.x is no longer supported.
Fixed
- Validation errors are rewritten into agent-facing messages again on current FastMCP (e.g.
Unknown field 'bogusField'). Since FastMCP 3.4 they arrive wrapped in FastMCP's own error type, which the reformatter did not recognise.
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.6 — Startup Access Errors
Fixed
- Server no longer crashes at startup when macOS blocks access to OmniFocus's folders (seen with Claude Desktop on recent macOS, where the client only reported "Connection closed"). The startup sweep now runs inside error mode, so the server stays up and every tool call explains the fix: the Allow prompt, or Full Disk Access for the launching program, naming the resolved
uvxpath when it can be found. - A database or
.ofocuspath that macOS refuses to show is no longer reported as "not found".
Changed
- README: the temporary Full Disk Access note now covers both routes and mise-shim setups.
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.5 — FastMCP Version Cap
Fixed
- Validation errors lost their agent-facing wording (e.g.
Unknown field 'bogusField') on FastMCP 3.4 and newer, whichuvxinstalls pulled in automatically. The dependency is now capped atfastmcp>=3.1.1,<3.4, the range the full test suite passes on, until the migration to newer FastMCP lands.
Added
- README: temporary Full Disk Access step for Claude Desktop on recent macOS.
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.4 — Batch Limit Increase
Changed
- Batch processing limit increased from 50 to 150 items per
add_tasks/edit_taskscall.
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.3 — First-Run UX
Added
- First-run welcome banners in
bridge.js— frame OmniFocus's one-time permission dialog with two-click instructions, sized to its ~11-line preview viewport - Startup log line —
omnifocus-operator v<X.Y.Z> startingto stderr +~/Library/Logs/omnifocus-operator.log
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.2 — UNTIL Format Hotfix
Fixed
- RRULE parser now accepts both RFC 5545 §3.3.10 UNTIL forms — DATE (
YYYYMMDD) and DATE-TIME (YYYYMMDDTHHMMSSZ). Prior versions rejected the DATE form, causinglist_tasks/get_all/get_taskto fail withUNTIL must match YYYYMMDDTHHMMSSZ formatwhenever the OmniFocus database contained a task with an end-by-date repetition rule created via the OmniFocus UI (the UI emits DATE form; pre-1.4.2 server writes emitted DATE-TIME form). One bad row poisoned every snapshot read.
Changed
- RRULE builder now emits UNTIL in DATE form (
YYYYMMDD), matching OmniFocus's own UI serializer. Pre-1.4.2 rules already stored in user databases (UNTIL=YYYYMMDDT000000Z) continue to round-trip cleanly via the new parser tolerance; no migration required. Editing a legacy rule's repetition spec rewrites it to the canonical DATE form on write; edits that don't touch the repetition spec leave the legacy form in place.
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4.1 — Task Properties & Subtree
Added
completesWithChildrenandtype("parallel" | "sequential") writable onadd_tasks/edit_taskswith patch semantics —nullrejected ontype- Omitted
completesWithChildren/typeonadd_tasksresolve to the user's OmniFocus preference explicitly (factory fallbacks:true/"parallel") — server never relies on OmniFocus implicit defaulting - Derived presence flags on default task/project responses —
hasNote,hasRepetition,hasAttachments(strip when false) isSequentialon tasks and projects;dependsOnChildrenon tasks (hasChildren AND NOT completesWithChildren)hierarchyinclude group extended — addshasChildren,type,completesWithChildrenon tasks and projects (typeon projects includes"singleActions")parentfilter onlist_tasks— single reference (name or ID); returns all descendants at any depth; resolved task preserved as anchor (bypasses subtree-pruning filters)parent: "$inbox"supported as equivalent toproject: "$inbox"- New warnings: empty-scope-intersection when
project+parentare disjoint; parent-resolves-to-project hint; filtered-subtree warning now also fires onparent
Changed
- Name-resolver filters (
project,parent,tags) resolving to zero matches now return empty results +FILTER_NO_MATCHwarning — previouslyprojectsilently skipped the filter and returned all tasks — breaking behavior change
Infrastructure
- PyPI publishing via
uvx omnifocus-operator - Dynamic versioning with
hatch-vcs(git tags as source of truth) - Platform check — non-macOS prints clear error and exits
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.4 — Response Shaping & Batch Processing
Added
- Response stripping — null/
[]/""/false/"none"auto-removed from entity fields;availabilityand envelope fields always preserved includeonlist_tasks/list_projects— add field groups to defaults:notes,metadata,hierarchy,time,*(projects also:review)onlyonlist_tasks/list_projects— return exactly named fields;idalways included; mutually exclusive withincludelimit: 0returns count-only:{items: [], total: N, hasMore: ...}- Batch processing —
add_tasks/edit_tasksaccept up to 50 items per call with per-itemstatus/warnings;add_tasksbest-effort,edit_tasksfail-fast actions.note.appendonedit_tasks— appends text with\nseparator; whitespace-only is a no-opactions.note.replaceonedit_tasks— replaces full note;nullor""clears
Changed
effective*→inherited*across all tool responses (6 fields: dueDate, deferDate, plannedDate, flagged, dropDate, completionDate) — breaking renameinherited*fields now only appear when truly inherited from an ancestor — self-values stripped; per-field aggregation: min (dueDate), max (deferDate), OR (flagged), first-found (others)- Top-level
noteremoved fromedit_tasksinput — useactions.note.append/actions.note.replace— breaking
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.3.3 — Ordering & Move Fix
Added
orderfield on task responses — 1-based integer reflecting outline order within parent
Fixed
moveTo beginning/endingon same container no longer silently ignored- Move no-op warning now checks ordinal position, not just container membership
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md
v1.3.2 — Date Filtering
Added
- Date filters on
list_tasks:due,defer,planned,completed,dropped,added,modified - String shortcuts:
"today","overdue","soon","any","none" - Shorthand periods:
{this: "w"},{last: "3d"},{next: "1m"} - Absolute bounds:
{after: "...", before: "..."} - Configurable due-soon threshold (
OPERATOR_DUE_SOON)
Changed
urgencyfilter removed — absorbed intodue: "overdue"anddue: "soon"completedboolean filter replaced bycompleteddate filter
Full CHANGELOG: https://github.com/HelloThisIsFlo/omnifocus-operator/blob/main/CHANGELOG.md