project_update
Update specific fields of an existing OmniFocus project while leaving others unchanged. Supports clearing fields by passing null, with safety controls like dry run and conflict detection.
Instructions
Partially update mutable fields on an OmniFocus project. Only supplied fields are changed; omit a field to leave it unchanged. Pass null for note, deferDate, dueDate, estimatedMinutes, or reviewIntervalDays to clear those fields. Do NOT use to create or delete projects; prefer project_create or project_delete instead. Safety controls: set dry_run=true to preview without mutating; pass expectedModifiedAt (from a recent project_get) to reject the call if the project changed since you read it; pass idempotency_key to coalesce retries so the same update is only performed once. Returns { updated: true, id, name } — name reflects the post-patch name. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: project_update({ id: "prj123", name: "New Name", flagged: true }) Example: project_update({ id: "prj123", status: "on-hold", dry_run: true })
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Persistent project ID. Get from project_list or project_get. | |
| name | No | New project name. Must be non-empty if supplied. | |
| note | No | Plain-text note. Pass null to clear. | |
| status | No | Project status. Use project_complete or project_drop to close a project. Accepts: 'paused' → on-hold. | |
| tagIds | No | Full-replacement tag list. Replaces all existing tags. | |
| dry_run | No | When true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs. | |
| dueDate | No | ISO-8601 due date with UTC offset. Pass null to clear. | |
| flagged | No | Flag or unflag the project. | |
| noteHtml | No | HTML note. Pass null to clear. Prefer note for plain-text edits. | |
| deferDate | No | ISO-8601 defer date with UTC offset. Pass null to clear. | |
| dueDateFloating | No | When true, the due time is floating (follows the user across time zones). | |
| idempotency_key | No | Idempotency key for retry-safe updates. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-applying the patch. | |
| estimatedMinutes | No | Estimated total duration in minutes. Pass null to clear. | |
| deferDateFloating | No | When true, the defer time is floating (follows the user across time zones). | |
| expectedModifiedAt | No | Optimistic-concurrency guard: ISO-8601 timestamp from a recent project_get. If the project's current modifiedAt differs, the call fails with OF_CONFLICT and no update is performed. Omit to skip the check. | |
| reviewIntervalDays | No | Review interval in days. Pass null to clear. | |
| completionCriterion | No | How the project's tasks are completed. Accepts: 'in-order' → sequential, 'in order' → sequential, 'any-order' → parallel, 'any order' → parallel. |