Skip to main content
Glama

omnifocus-mcp

npm version CI License: MIT Node: 24+ Platform: macOS 13+ Mutation tested: Stryker

Give any MCP-compatible AI assistant full, typed access to your OmniFocus. Read your inbox, create tasks, close projects, batch-update dozens of items, evaluate perspectives, trigger sync — all through natural language. omnifocus-mcp wires a 143-tool MCP server directly to OmniFocus on macOS via JXA and OmniJS, with circuit breakers, rate limits, and an agent-aware error hierarchy so the assistant knows exactly what to do next when something goes wrong.


Table of contents


Related MCP server: OmniFocus MCP Server

Agent-native OmniFocus — beyond the app surface

A plain MCP wrapper would be a one-to-one mirror of the OmniFocus app. This server is more than that. It exposes a small set of capabilities that exist because an LLM is the caller — capabilities the app itself doesn't ship and probably never will, because they're only worth the effort when the consumer is an agent that can reason over structured input and act on the result.

These are the agent-native capabilities, framed in the user outcome they enable:

  • Stalled-project triageomnifocus://project-health returns granular signals (last activity, available task count, deferred-future tasks, review-overdue) so an agent can identify projects worth a status nudge without the user opening the app. Mechanical aggregation; the app could do it but doesn't.

  • Semantic dedupetask_find_similar does lexical similarity search across task names so an agent confirms intent ("is this a duplicate of X?") before creating a new task. Possible without an LLM, but only useful with one in the loop.

  • Taxonomy auditomnifocus://taxonomy-audit flags inconsistent tag/folder usage so an agent can propose cleanup grounded in the actual structure of the database. Mechanical.

  • NL perspective authoring (in development — #476) — describe a perspective in prose; the agent compiles a rule tree and writes it via perspective_create. Exists because of the agent — the rule tree is a non-trivial structure most users won't compose by hand.

  • Time-budget reconciliationforecast_pack takes a daily minute budget and packs the forecast into it, surfacing overloaded days. Asking "I have 90 minutes, what should I do?" gets a structured answer.

  • Retrospective resourceomnifocus://retrospective?from=…&to=… aggregates the closed-task surface so an agent can write the user's weekly review against real data instead of asking them to recap.

  • Project templatesproject_template_save / _instantiate capture and replay project structures with parameter substitution and date shifting. The agent fills the parameters from conversation context.

  • Inbox-triage prompt — the bundled inbox-triage MCP prompt sequences the tool calls for a full GTD-style processing sweep. Intentionally a prompt, not a tool — the value is in orchestrating the existing surface.

  • Calendar + agendaomnifocus://calendar and omnifocus://agenda merge macOS Calendar events with the OF forecast so an agent can answer "what does my day actually look like?" without the user holding two windows side by side.

How this is different from a plain wrapper. A wrapper exposes the app's verbs. This server adds verbs the app doesn't have, because LLMs change what's worth building. Some of the additions (project-health, taxonomy-audit) are mechanical aggregations the app could ship and never has — they sit unbuilt because no human wants to click through them. Others (NL perspective authoring, semantic dedupe, time-budget reconciliation) are only valuable with an LLM in the call path. Both kinds belong here. The split is honest: don't pretend the mechanical stuff is novel, and don't pretend the agent-only stuff is just sugar.


Why this exists

OmniFocus is a powerful GTD tool, but it's an island. Your tasks sit there while you context-switch between your AI assistant and your task manager, manually copy-pasting notes, updating projects, and trying to keep everything in sync with your actual work.

omnifocus-mcp removes that friction. With it connected, your AI assistant can:

  • Capture — turn a conversation into tasks directly in OmniFocus, with the right project, tags, due dates, and notes, without you touching the app

  • Review — pull today's overdue items, this week's forecast, or a full project breakdown into context so the assistant can reason about your workload alongside your work

  • Maintain — batch-defer a pile of overdue tasks, complete a sprint's worth of items, reorganize projects after a meeting debrief

  • Reflect — ask "what's in my inbox right now?" or "what projects haven't been reviewed in a month?" and get structured, actionable answers

The server is built to a single-user local-first standard: no network surface, no cloud sync, typed errors with agent-readable remediation hints, safe by default.

See docs/examples.md for concrete prompt-to-tool-call sequences and docs/prompts.md for the bundled MCP prompt templates (daily-review, weekly-review, capture-meeting, project-planning).


Quick start

Prerequisites: macOS 13 (Ventura) or later · OmniFocus 3.x or 4.x (4.x recommended; some tools require 4.x — see version compatibility) · Node 24+ (not required for Homebrew install)

  1. Install

    # Homebrew (no Node required)
    brew install torsday/tap/omnifocus-mcp
    
    # or npm
    npm install -g @torsday/omnifocus-mcp
  2. Configure your MCP client. Every client uses the same command + args + env shape — only the file path and serialization (JSON vs TOML) differ. The universal shape:

    command: omnifocus-mcp
    args:    (none)
    env:     OMNIFOCUS_LOG_LEVEL=info   # optional; "debug" is verbose

    Two common cases inline; full per-client guides at docs/clients/ (Claude Code, Claude Desktop, Codex, OpenCode, Pi, generic stdio).

    claude mcp add omnifocus omnifocus-mcp

    Detailed: docs/clients/claude-code.md

    {
      "mcpServers": {
        "omnifocus": {
          "command": "omnifocus-mcp",
          "args": [],
          "env": { "OMNIFOCUS_LOG_LEVEL": "info" }
        }
      }
    }

    Detailed: docs/clients/claude-desktop.md

  3. Grant macOS Automation permission on first use — the app running the MCP server will prompt to control OmniFocus; click OK. If denied by mistake: System Settings → Privacy & Security → Automation → [app] → OmniFocus

  4. Verify — ask your assistant: "Use the internal_status tool and tell me what it returns."

Stuck? See docs/troubleshooting.md.


Security & trust

omnifocus-mcp is a local-only Node.js process that drives a local OmniFocus app via Apple's osascript runtime. Installing this package does not introduce cloud connectivity, telemetry, or network egress that wasn't already on your machine.

OmniFocus DB (local) ─→ JXA / OmniJS via osascript (local) ─→ MCP server (local stdio)
                                                                    │
                                                                    ↓
                                                       MCP client (local)
                                                                    │
                                                                    ↓
                                                  LLM provider (only if your client uses one)

The LLM hop at the bottom is your client's choice, not this package's. If you run a local-only client (or a client configured to use a local model), nothing in this stack reaches the network.

Hard guarantees

Each guarantee is enforced by code, not by promise. Click through to verify.

  • No network I/O at the source level — a custom lint rule (no-network-import) bans import of node:http, node:https, node-fetch, axios, undici, and cross-fetch. CI fails on any new import that would enable network calls. See src/linting/customRules.ts Rule 4.

  • No stdout writes outside the MCP framing pathinstallStdoutGuard() proxies process.stdout.write at server boot and rejects any write that wouldn't corrupt MCP's JSON-RPC stream. The contract is pinned by src/server/stdoutGuard.test.ts.

  • No telemetry / analytics — production dependencies in package.json are six packages: @modelcontextprotocol/sdk, lru-cache, pino, ulid, zod, zod-to-json-schema. No analytics SDK; nothing phones home.

  • No postinstall / preinstall scriptspackage.json ships with one lifecycle script (prepublishOnly) and one dev hook (prepare for git hooks). Neither runs when a downstream consumer installs the package.

  • Config secrets redacted from logs — the boot-time server.started event runs config through redactConfig before logging; path-shaped values are sha256-hashed (12-char prefix) so even local stderr doesn't leak attachment-path layout.

  • Attachment paths are allowlist-bounded — every attachment operation passes through assertAttachmentPath, which resolves symlinks before checking against OMNIFOCUS_ATTACHMENT_PATHS (default: $HOME) to defeat symlink-escape, and hard-blocks /System, /Library, and their /private/* mirrors regardless of the allowlist.

Opt-in escape hatch

There is exactly one feature that's gated behind an environment variable because enabling it broadens the threat surface:

  • OMNIFOCUS_ALLOW_RAW_SCRIPT=1 — exposes run_jxa_script and run_omnijs_script, which run arbitrary JXA / OmniJS supplied by the agent. Off by default. When enabled, every invocation emits a raw_script.invoked audit event at info level (regardless of OMNIFOCUS_LOG_LEVEL) including the full script body and tool name. See ADR-0004 for the rationale.

Verify it yourself

Three recipes that take seconds; you don't have to take this README's word for any of the above.

  1. Audit the source. The repo at github.com/torsday/omnifocus-mcp is the canonical source. Each published artifact is built from its own tagged commit (v<version>); compare dist/index.js against the build output of the tag matching the version you installed.

  2. Verify the published artifact's provenance. npm publishes attestations via Sigstore:

    npm view @torsday/omnifocus-mcp dist.attestations

    The provenance URL points to the GitHub Actions run that built the artifact, signed with the workflow's OIDC identity.

  3. Inspect what's actually in the tarball. It should be five files — no more, no less, and no install scripts:

    curl -sL "$(npm view @torsday/omnifocus-mcp dist.tarball)" | tar -tzvf -

    Expected output (file count = 5):

    package/LICENSE
    package/dist/index.js
    package/package.json
    package/CHANGELOG.md
    package/README.md

Out of scope

The threat model deliberately excludes anything outside this codebase: vulnerabilities in OmniFocus itself, Apple's JXA / OmniJS / osascript runtimes, transitive npm-dependency CVEs (track and patch via npm audit / Dependabot, but not part of this project's guarantees), and any attacker with root-equivalent local access (who could replace osascript, the MCP server binary, or your shell). See SECURITY.md § Scope.

Full threat model: SECURITY.md, docs/design/security.md.


Architecture at a glance

flowchart LR
    Agent["LLM agent<br/>(any MCP client)"] --> SDK["MCP stdio<br/>transport"]
    SDK --> Tools["Tool &<br/>Resource handlers"]
    Tools --> Services["Service layer"]
    Services --> Cache[(30s LRU<br/>read cache)]
    Cache --> Adapter{OmniFocus<br/>Adapter}
    Adapter --> Router[Transport<br/>Router]
    Router -->|CRUD, forecast, search| Jxa[JxaTransport]
    Router -->|Perspectives, plug-ins,<br/>reorder, reparent| OmniJs[OmniJsTransport]
    Jxa --> OF[(OmniFocus)]
    OmniJs --> OF

    classDef boundary stroke-dasharray: 5 5
    class Adapter boundary

Key design points:

  • Adapter seam — services never see osascript or URL schemes; OmniFocusAdapter is the only OS boundary. Tests swap in an InMemoryAdapter.

  • Dual transport — JXA via osascript for CRUD; OmniJS via evaluateJavascript() for custom perspectives, plug-ins, reorder, and reparent. A TransportRouter picks per operation.

  • Read pool + write queue — concurrent JXA reads from a configurable pool; mutations serialized through a write queue; OmniJS operations through a separate queue.

  • 30s LRU read cache — invalidated on every write. Mutations are never served stale.

  • Middleware stack — every registered tool runs through: assertNotShuttingDowncircuitBreakerrateLimitMetaloopDetection.

The full layered diagram with queues, circuit breakers, and the test adapter lives in docs/design/architecture.md.


Status and roadmap

The package is published on npm; see the latest release for the current version and notes. The phase table below records the milestone work that shipped in v1.0.0; the live backlog and future enhancements track on the Project board, and the unreleased section of the CHANGELOG lists what's already merged toward the next release.

Phase

Milestone

Status

M0

Foundation + both transports

✅ Done

M1

Core task & project surface

✅ Done

M2

Metadata + perspectives (OmniJS)

✅ Done

M3

Advanced (repeat, notes, review, batch, DSL)

✅ Done

M4

Long tail (attachments, OPML, sync, plug-ins, raw scripts)

✅ Done

M5

Polish & release (observability, E2E, CI, docs, npm)

✅ Done

Track open issues and future enhancements on the GitHub Project board.


Reference docs

Doc

What

docs/tools.md

Auto-generated reference for every tool — input schemas, examples, responses

src/tools/INDEX.md

One-line-per-tool index grouped by domain (cheaper than grepping)

docs/examples.md

Concrete prompt → tool-call sequences

docs/prompts.md

Bundled MCP prompt templates (daily-review, weekly-review, capture-meeting, project-planning)

AGENTS.md

Agent-facing guide — engineering conventions for contributors AND calling conventions for clients (IDs, error codes, dates, idempotency, _links, response envelope, meta.warnings, rate limits)

docs/clients/

Per-client setup guides (Claude Code, Claude Desktop, Codex, OpenCode, Pi, generic stdio)

docs/troubleshooting.md

OmniFocus not running, Automation permission, slow startup, raw-script gating, sync staleness

docs/domain-reference.md

OmniFocus glossary, canonical schemas, lossiness matrix for export/import

docs/security.md

Attack surface, mitigations, test coverage

SECURITY.md

Vulnerability reporting, scope

SPEC.md

Functional scope and resolved v1 decisions

DESIGN.md

Index of the per-area design files under docs/design/ — architecture, envelope, IDs/dates, security, testing, observability, configuration, distribution, example tool, resources

docs/adr/

Architecture Decision Records — every load-bearing choice (TypeScript+Node 24, dual transport, namespacing, raw-script gating, scripts-as-files, LRU cache, ISO-8601 dates, branded IDs, pool+queue, stdio transport, semver, npx distribution, response envelope, E2E adapter switch, NL envelope, webhooks, Stryker mutation gate, EventKit calendar bridge, cross-transport ID interop, JXA helper inlining, reactive runtime spike, envelope text/structured split, runner-host JXA bridge contention)

CHANGELOG.md

Release history per Keep a Changelog

For the full environment-variable surface with override semantics see docs/design/configuration.md; the load-bearing knobs are OMNIFOCUS_LOG_LEVEL, OMNIFOCUS_CACHE_TTL_MS, OMNIFOCUS_ALLOW_RAW_SCRIPT, and OMNIFOCUS_ATTACHMENT_PATHS.


Contributing

This is a single-developer project; external contributions are not currently solicited. The design, ADRs, and task backlog are public so the work is inspectable and forkable. See CONTRIBUTING.md for the patterns any contribution would need to follow.


License

MIT — see LICENSE.

Available Tools

146 tools
app_launchA

Explicitly launch OmniFocus. Do NOT call this automatically — only invoke when the user explicitly asks to open OmniFocus; prefer other tools when OF is already running. Safe to call when OmniFocus is already running (idempotent). Returns { launched, alreadyRunning } — launched=true means OmniFocus was not running and was started; alreadyRunning=true means it was already open. Side effects: may open OmniFocus and bring it to the foreground. Example: app_launch()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses side effects (may bring to foreground), idempotent nature, and return object shape. Could mention error handling but sufficient for a simple launch tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences covering purpose, usage constraints, return values, and side effects. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description fully explains return value and side effects. Complete for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, and the schema coverage is 100%. The description adds no parameter info, which is appropriate. Baseline 4 for zero-param tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'launch' and resource 'OmniFocus', clearly stating it explicitly launches the app. It distinguishes from siblings like app_window_new which manage windows within the app.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (user explicitly asks) and when not to (prefer other tools when already running). Also notes idempotency.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_window_newA

Open a new OmniFocus window via OmniJS document.newWindow(). UI-affecting tool — only meaningful when OmniFocus is running. Headless agents should not fire this. Use when the user asks 'open a new window' or a flow needs a fresh, unfocused OmniFocus window. Do NOT use to read task or project data — prefer task_list or project_list instead. Takes no arguments. Returns { perspectiveName: string | null, focusContainerIds: string[] } describing the new window's initial state. Errors: WINDOW_OPEN_FAILED when the window could not be created. Side effects: opens a new OmniFocus window; no data caches invalidated. Example: app_window_new()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description fully discloses behavioral traits: it is a UI-affecting tool only meaningful when OmniFocus is running, has no data cache invalidation, returns specific structure, and errors (WINDOW_OPEN_FAILED). This is comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with each sentence serving a purpose: action, constraints, usage guidance, return info, errors, side effects, and example. It is front-loaded with the core action and is appropriately sized for the information provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description is complete: it covers purpose, constraints, return shape, errors, and side effects. No additional information is needed for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly states 'Takes no arguments' and provides an example call with no parameters. With zero parameters and 100% schema coverage, the description adds clarity by confirming emptiness and showing usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it opens a new OmniFocus window via OmniJS, using a specific verb ('Open') and resource ('new window'). It distinguishes from sibling tools by explicitly stating it is UI-affecting and not for reading data, directing to task_list or project_list for data queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use scenarios ('when the user asks open a new window' or 'flow needs a fresh, unfocused OmniFocus window') and when-not-to-use ('Headless agents should not fire this', 'Do NOT use to read task or project data'). It also suggests alternatives (task_list, project_list).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_window_new_tabA

Open a new tab on the front OmniFocus window via OmniJS document.newTabOnWindow(). UI-affecting tool — only meaningful when OmniFocus has an open window. Headless agents should not fire this. Use when the user asks 'open a new tab' or a flow needs an additional view in the existing window. Do NOT use to open a standalone window — prefer app_window_new instead. Takes no arguments. Returns { perspectiveName: string | null, focusContainerIds: string[] } describing the new tab's initial state. Errors: WINDOW_UNAVAILABLE when there is no open OmniFocus window; WINDOW_OPEN_FAILED when the tab could not be created. Side effects: opens a new tab in the front OmniFocus window; no data caches invalidated. Example: app_window_new_tab()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects (opens a new tab, no data cache invalidation), possible errors (WINDOW_UNAVAILABLE, WINDOW_OPEN_FAILED), and return value shape. This exceeds transparency requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loads the main purpose. It contains several sentences that each provide valuable context, but could be slightly more concise by combining some statements. Still, it is efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and no annotations, the description covers all necessary aspects: purpose, usage guidance, side effects, errors, and return format. It is fully complete for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and schema coverage is 100% by default. The description adds nothing extra about parameters, but that is acceptable as there is nothing to add. Baseline 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool opens a new tab on the front OmniFocus window via OmniJS. It specifies the exact resource and action, and distinguishes itself from the sibling tool 'app_window_new' by explicitly stating not to use it for standalone windows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use scenarios ('when the user asks open a new tab or a flow needs an additional view'), warns headless agents not to fire it, and directs to an alternative ('prefer app_window_new instead') for standalone windows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_addA

DEPRECATED — use attachment_create instead (renamed for CRUD-verb consistency). Add a file attachment to a task or project from a local file path. The file is embedded into the OmniFocus database. Path must be within the allowed scope (default: $HOME; override via OMNIFOCUS_ATTACHMENT_PATHS). File must not exceed the size cap (default 100 MB; override via OMNIFOCUS_MAX_ATTACHMENT_MB). Returns { id, ownerKind, ownerName } — ownerKind is 'task' or 'project' and ownerName is the parent's display name (null only if the parent was deleted between the add and the lookup) so the agent can describe the new attachment without a follow-up read. Mutations do not propagate until sync_trigger is called. Example: attachment_create({ taskId: "abc123", filePath: "/Users/me/report.pdf" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
filePathYesAbsolute path to the source file to attach. Must be within the allowed attachment path scope.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description provides behavioral details: file is embedded into database, path scope and size caps, return shape including edge case (null if parent deleted), and sync_trigger requirement. Somewhat thorough for a deprecated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is a single paragraph but efficiently conveys deprecation, purpose, constraints, and return value. No redundancy, but could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given deprecation, the description covers enough for an agent to understand the tool's behavior, constraints, and output. The return shape is detailed. Completeness is high for a tool not intended for new use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds context on path scope and size cap but does not fully explain mutual exclusivity of taskId/projectId beyond schema. Adequate but not exceptional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool is deprecated and renamed to attachment_create. It specifies the action (adds a file attachment) and resource (task or project). Distinguishes from sibling attachment_create as the replacement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises not to use this tool (DEPRECATED) and directs to use attachment_create instead. Provides clear when-not and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_createA

Add a file attachment to a task or project from a local file path. The file is embedded into the OmniFocus database. Path must be within the allowed scope (default: $HOME; override via OMNIFOCUS_ATTACHMENT_PATHS). File must not exceed the size cap (default 100 MB; override via OMNIFOCUS_MAX_ATTACHMENT_MB). Returns { id, ownerKind, ownerName } — ownerKind is 'task' or 'project' and ownerName is the parent's display name (null only if the parent was deleted between the add and the lookup) so the agent can describe the new attachment without a follow-up read. Mutations do not propagate until sync_trigger is called. Example: attachment_create({ taskId: "abc123", filePath: "/Users/me/report.pdf" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
filePathYesAbsolute path to the source file to attach. Must be within the allowed attachment path scope.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: file is embedded into database, mutations do not propagate until sync_trigger, and return value behavior (ownerName null if parent deleted). Size cap and scope constraints are also transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise paragraph of 4-5 sentences, front-loading the core action and then adding essential details. It includes an example for clarity without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the tool's behavior, constraints, and return value structure. For a create tool with no output schema, it provides sufficient context for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds critical constraints beyond the schema: that exactly one of taskId or projectId must be provided, and explains the path scope and size limitations. The example also clarifies usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Add', the resource 'file attachment', and the target 'task or project'. It distinguishes from siblings like attachment_add (which is likely redundant? but the description explicitly says 'from a local file path', differentiating from other attachment tools).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides important prerequisites: file path must be within allowed scope, file must not exceed size cap, and mutations require sync_trigger. However, it does not explicitly compare with alternatives like attachment_add or mention when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_deleteA

Remove an attachment from a task or project by attachment ID. Do not use to retrieve or export attachment content — use attachment_save_to_path instead. Returns { removed: true, attachmentId, ownerKind, ownerName } — ownerKind is 'task' or 'project' and ownerName is captured BEFORE the JXA call so it survives even if the lookup were to fail post-mutation; null only when the parent itself has been deleted. The agent can describe the removal without a follow-up read. Throws NotFound if the attachment or owner does not exist. Permanent — cannot be undone. Mutations do not propagate until sync_trigger is called. Example: attachment_delete({ taskId: "abc123", attachmentId: "att456" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.
attachmentIdYesPersistent ID of the attachment to remove. Get from attachment_list.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description fully compensates by detailing the return format, the survival of ownerName even on failure, NotFound error, permanence, and the need for sync_trigger. This is comprehensive and exceeds expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with the main action first, followed by exclusions, return behavior, errors, permanence warning, sync note, and example. Although slightly long, each sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description thoroughly covers return format, error behavior, side effects (permanence, sync requirement), and usage hints. It provides all necessary context for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds value beyond the schema by stating that exactly one of taskId or projectId should be provided, and that attachmentId comes from attachment_list. It also provides an example call, which clarifies parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'remove' and resource 'attachment' from a task or project. It distinguishes from attachment_save_to_path but not from the sibling attachment_remove, which could cause confusion for the AI agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises against using for retrieval and recommends attachment_save_to_path as an alternative. It also warns about permanence. However, it does not address the existence of sibling attachment_remove, leaving ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_listA

List all file attachments on a task or project. Do not use to retrieve attachment content — use attachment_save_to_path instead. Returns { attachments } — array of objects with id, name, mimeType, sizeBytes, addedAt, and kind (embedded|alias). Provide exactly one of taskId or projectId. Read-only; safe to retry. Example: attachment_list({ taskId: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but description discloses read-only nature ('Read-only; safe to retry') and return structure. Adds transparency beyond schema. Could mention pagination or limits if any, but current detail is sufficient for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-structured sentences: purpose, usage guideline, return format + requirement. Includes example without extra fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without output schema, the description fully documents the return format (array of objects with fields) and usage example. Enough for an agent to invoke correctly. No missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have descriptions. The description adds critical constraint 'Provide exactly one of taskId or projectId' and includes an example usage, which helps avoid misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description has a specific verb 'List' and resource 'file attachments on a task or project'. It clearly distinguishes from sibling attachment_save_to_path by stating not for content retrieval. The return format is also specified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when not to use ('Do not use to retrieve attachment content') and what alternative to use. Also provides usage condition: 'Provide exactly one of taskId or projectId'. Clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_removeA

DEPRECATED — use attachment_delete instead (renamed for CRUD-verb consistency). Remove an attachment from a task or project by attachment ID. Do not use to retrieve or export attachment content — use attachment_save_to_path instead. Returns { removed: true, attachmentId, ownerKind, ownerName } — ownerKind is 'task' or 'project' and ownerName is captured BEFORE the JXA call so it survives even if the lookup were to fail post-mutation; null only when the parent itself has been deleted. The agent can describe the removal without a follow-up read. Throws NotFound if the attachment or owner does not exist. Permanent — cannot be undone. Mutations do not propagate until sync_trigger is called. Example: attachment_delete({ taskId: "abc123", attachmentId: "att456" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.
attachmentIdYesPersistent ID of the attachment to remove. Get from attachment_list.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses return object structure, null ownerName scenario, error behavior (NotFound), permanence, and sync trigger requirement. Comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is detailed but not unnecessarily long. Structured with purposeful sentences, though could be slightly more concise. Still earns its length with valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations or output schema, yet description covers all critical aspects: purpose, deprecation, input constraints, return value, error cases, side effects, and sync note. Fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description adds context: attachmentId source (attachment_list) and the mutual exclusivity of taskId/projectId, but schema already describes that. No additional meaningful parameter details beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool removes an attachment by ID, distinguishes from retrieval and from the renamed sibling (attachment_delete). Verb+resource+scope are precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly marks deprecated with replacement (attachment_delete), and warns against using for retrieval (use attachment_save_to_path). Provides clear when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attachment_save_to_pathA

Copy an attachment's content to a local file path. Do not use to list or remove attachments — use attachment_list or attachment_delete instead. Returns { saved: true, path, sizeBytes } on success. Destination path must be within the allowed scope (default: $HOME). Writes the file to destPath (creates or overwrites); no side effects on OmniFocus data. Example: attachment_save_to_path({ taskId: "abc123", attachmentId: "att456", destPath: "/Users/me/report.pdf" })

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdNoPersistent ID of the task that owns the attachment. Provide exactly one of taskId or projectId.
destPathYesAbsolute destination path where the attachment will be written. Must be within the allowed attachment path scope. Existing files are overwritten.
projectIdNoPersistent ID of the project that owns the attachment. Provide exactly one of taskId or projectId.
attachmentIdYesPersistent ID of the attachment to save. Get from attachment_list.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool writes/overwrites files, has no side effects on OmniFocus data, and returns a specific success object. It lacks details on error handling or permission checks, but overall provides sufficient behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences plus an example. It is front-loaded with the core purpose, then adds caveats and an example. Every sentence provides necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (4 params, no output schema), the description covers purpose, usage constraints, parameter semantics, return value, and side effects. It is fully sufficient for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by including an example call, clarifying mutual exclusivity of taskId/projectId (though schema also mentions it), specifying that destPath must be absolute and overwrites, and noting that attachmentId comes from attachment_list. This extra context justifies a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Copy an attachment's content to a local file path.' It also explicitly distinguishes from siblings by instructing not to use for listing or removing, and naming attachment_list and attachment_delete as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage boundaries: 'Do not use to list or remove attachments — use attachment_list or attachment_delete instead.' It also specifies a constraint: 'Destination path must be within the allowed scope (default: $HOME).'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

changes_sinceA

Incremental sync feed: return what changed since the last call. Call with no args to bootstrap (returns every task/project in added plus a syncToken); call again passing the previous syncToken to get only changes since then. Returns { reset, syncToken, tasks: { added, modified }, projects: { added, modified } }. modified entries are field-level deltas { id, changes } — only the fields that changed, not the whole record. reset=true means a full snapshot (first call, or the token expired/unknown — discard local state). Always use the returned syncToken for the next call; tokens live ~10 min and do not survive a server restart. Deletions are reported in removed only when you pass includeRemoved:true (it needs a full scan); otherwise they are not tracked. Read-only; no side effects. Example: changes_since({ syncToken: 'abc123' })

ParametersJSON Schema
NameRequiredDescriptionDefault
syncTokenNoToken from a prior changes_since call. Omit to bootstrap a full snapshot.
includeRemovedNoReport deleted entity IDs in `removed`. Default false — detecting deletions needs a full enumeration, so this trades the cheap incremental path for completeness. Set true only when you must track deletions; otherwise reconcile periodically with task_list / project_list.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses read-only nature, token expiry (~10 min), reset flag meaning, delta format, and that deletions require a full scan.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense information, front-loaded purpose, but slightly long; every sentence earns its place though.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description fully specifies return structure (reset, syncToken, tasks/projects with added/modified/removed) and delta format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but description adds context: syncToken for bootstrapping vs incremental, includeRemoved trade-off between performance and completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it's an incremental sync feed for changes since last call, distinguishing it from list/search tools among 100+ siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers bootstrapping vs incremental use, token handling, and when to use includeRemoved vs reconcile with task_list/project_list for deletions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clarifyA

Replay dispatcher for clarification-needed responses. When a tool returns { kind: 'clarification-needed' }, present the question and options to the user, then call this tool with the replayToken from that response and the zero-based index of the option the user selected. The server resumes the original tool call with the disambiguation applied and returns the final result envelope. Tokens are single-use and expire after 5 minutes — call this tool promptly after the user responds. Passing an expired or unknown token returns a NotFound error. Passing a choice index outside the valid range returns an InvalidInput error. Example: clarify({ replayToken: "tok_abc", choice: 0 })

ParametersJSON Schema
NameRequiredDescriptionDefault
choiceYesZero-based index of the option the user selected (matches ClarificationOption.index).
replayTokenYesOpaque token from the clarification-needed envelope's replayToken field.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description fully discloses behavioral traits: token single-use, 5-minute expiry, error conditions (NotFound for expired/unknown tokens, InvalidInput for out-of-range choice), and the overall behavior of resuming the original tool call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but covers all necessary information efficiently. It could be slightly more structured (e.g., bullet points), but the content is precise and front-loaded with the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return (final result envelope) and covers workflow, errors, and an example. For a 2-parameter tool, this is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions, but the tool description adds crucial context: replayToken comes from the clarification-needed envelope, choice is a zero-based index matching ClarificationOption.index, and provides an example. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's role as a replay dispatcher for clarification-needed responses, explaining the interaction flow and distinguishing it from sibling tools by its specific function in disambiguation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool (after receiving a clarification-needed response) and provides context on token expiry and the need for promptness. However, it does not explicitly mention when not to use it, though the scenario is well-defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

database_redoA

Re-apply the most recently undone mutation, identical to ⌘⇧Z in OmniFocus. Advances one entry on the document's redo stack. Any mutation between an undo and a redo invalidates the redo stack (matching UI semantics). Mandatory confirm: true mirrors database_undo's destructive-write pattern. Returns { redid: boolean } — true when an entry was redone, false when the stack was empty. Do NOT use this tool to re-apply a specific operation — the redo stack is opaque. Prefer database_redo only as a direct counterpart to database_undo when an undo was issued in error. Side effects: re-applies whatever entry is at the top of the document's redo stack; fully invalidates the read cache; does NOT trigger sync. Call sync_trigger when you need the change to appear on other devices. Example: database_redo({ confirm: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesExplicit acknowledgement that redo can re-apply a mutation that may now conflict with intervening edits. Must be exactly true. The call is rejected if this field is absent or false.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses stack advancement, invalidation semantics, mandatory confirm pattern, side effects (read cache invalidation, no sync), and return value. With no annotations, description fully carries behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Reasonably concise (~100 words), front-loads key action and analogy. Each sentence adds value, though could be slightly trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, when to use, behavioral traits, parameter semantics, side effects, and return value. No gaps given tool complexity and lack of annotations/output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds conflict acknowledgement reasoning and explicit rejection conditions, providing value beyond schema. Not extensive but sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Re-apply the most recently undone mutation' with a UI analogy (⌘⇧Z in OmniFocus). Distinguishes from sibling database_undo by noting it's the direct counterpart and warns against using for specific operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when (as undo counterpart) and when not (for specific operations), mentions alternative database_undo, and notes sync_trigger for propagation. Provides clear context for appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

database_undoA

Reverse the most recent document mutation, identical to ⌘Z in OmniFocus. Walks back one entry on the document's undo stack regardless of mutation source — an MCP undo can revert a manual UI edit if that was the most recent change. Mandatory confirm: true mirrors task_batch_delete's destructive-write pattern, since undo can silently revert changes the agent or another caller just made. Returns { undid: boolean } — true when an entry was undone, false when the stack was empty. Do NOT use this tool to roll back specific operations — the undo stack is opaque and you cannot inspect what would be reverted before calling. Prefer database_undo for: post-batch error recovery, retry-after-partial-failure cleanup, and integration-test teardown. Side effects: reverts whatever entry is at the top of the document's undo stack; fully invalidates the read cache (we don't know what was reverted); does NOT trigger sync. Call sync_trigger when you need the change to appear on other devices. Example: database_undo({ confirm: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesExplicit acknowledgement that undo can revert mutations from any source — MCP, manual UI edit, or sync replay. Must be exactly true. The call is rejected if this field is absent or false.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects: reverts top of undo stack, invalidates read cache, does not trigger sync. It also explains the mandatory confirm flag's role in mirroring destructive-write patterns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is thorough but somewhat lengthy. It is well-structured with front-loaded purpose, mechanism, usage, side effects, and example. Minor redundancy could be trimmed, but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all essential aspects: purpose, parameter, usage guidelines, behavior, side effects, return value, and an example. No output schema needed as return is clearly described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'confirm' is fully described in both schema and description. Description adds context about why it's mandatory and the behavior if absent, providing value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reverses the most recent document mutation, analogizing it to ⌘Z in OmniFocus. It distinguishes from siblings like database_redo and specifies precise use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly lists when to use (post-batch error recovery, retry-after-partial-failure cleanup, integration-test teardown) and when not to (rolling back specific operations). Also directs to sync_trigger for cross-device sync.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decision_clearA

Clear the decision-journal entry from a task or project's note. Strips only the decision-journal fenced block; any other user prose and sibling fences (e.g. waiting-on) are preserved. Idempotent: returns noChange:true when the target has no decision recorded. Do NOT use this to delete the target — prefer task_delete / project_delete. Returns { targetKind, targetId, cleared:true } or { targetKind, targetId, noChange:true }. Side effects: writes the target's note via task_update / project_update; sets meta.syncPending = true. Example: { "targetKind": "project", "targetId": "abc" }

ParametersJSON Schema
NameRequiredDescriptionDefault
targetIdYesID of the task or project.
targetKindYesWhether the target is a task or a project.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses idempotency with return information, side effects (writes note, sets sync flag), and two possible return shapes. No annotations provided, so description covers all behavioral traits thoroughly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each purposeful. Front-loads main action, then details idempotency, warning, returns, and side effects. No extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with 2 parameters and no output schema, the description covers purpose, behavior, side effects, return format, and provides an example. Complete and sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions. Description adds only an example and restates the enum, providing minimal extra value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it clears a specific fenced block ('decision-journal') from a task or project's note, preserving other content. Distinguishes from deletion tools by explicitly warning not to use for deleting the target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Do NOT use this to delete the target — prefer task_delete / project_delete', providing clear guidance on when not to use and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decision_recordA

Record agent memory of user judgment on a task or project — kind, reason, and an optional auto-expiry. Writes a decision-journal fenced block to the target's note (preserving any existing user prose), so future scans (e.g. project_health) can honor the decision instead of re-litigating it. Discriminates on targetKind: 'task' or 'project'. Do NOT use this for short-lived state — prefer waiting-on for follow-ups, or task_update for routine field changes. Pass idempotency_key to coalesce retries so the same decision is recorded only once. Returns { targetKind, targetId, decision } with the persisted entry. Side effects: writes the target's note via task_update / project_update; sets meta.syncPending = true. Example: { "targetKind": "project", "targetId": "abc", "decision": { "kind": "stall-is-intentional", "reason": "Strategic pause until Q3" } }

ParametersJSON Schema
NameRequiredDescriptionDefault
decisionYesThe decision payload. `recordedAt` is set automatically on write.
targetIdYesID of the task or project. Must match `targetKind` — agent-side validation, but the adapter call surfaces NotFound if the ID is wrong.
targetKindYesWhether the decision attaches to a task or a project.
idempotency_keyNoIdempotency key for retry-safe writes. Append-shaped tools like this one duplicate silently on retry without a key; supply a stable per-decision identifier and identical retries within the TTL window replay the original envelope with meta.idempotentReplay = true instead of appending another journal entry. See docs/idempotency.md.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses behavior: it writes a decision-journal fenced block to the target's note, preserves existing prose, notes side effects (writes via task_update/project_update, sets meta.syncPending), describes the return shape, and explains idempotency. With no annotations, it carries the full burden and does so comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and well-structured: starts with core purpose, then mechanism, usage caveats, idempotency, return, side effects, and an example. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested objects, side effects, idempotency, no output schema), the description covers all essential aspects: purpose, behavior, usage guidelines, parameters, idempotency, return shape, and side effects. An agent can correctly select and invoke this tool based on the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions, but the description adds significant value beyond the schema: it explains the purpose of each parameter in context (e.g., targetKind discriminates, decision payload details, idempotency_key for retry), mentions auto-set recordedAt, and provides an example. This enriches the understanding despite high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Record', the resource 'agent memory of user judgment', and the scope (task/project). It distinguishes from siblings by specifying it writes a 'decision-journal' fenced block, not a generic note, and contrasts with short-lived state tools like waiting-on and task_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (for long-term decisions) and when not to use (for short-lived state, prefer waiting-on or task_update). Provides guidance on the idempotency_key for retry safety and discriminates on targetKind, giving clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_opmlA

Export OmniFocus data as OPML XML — a structured outline format OmniFocus can import. Do NOT use to export a single task; OPML scope is project-level or broader. Three scopes: 'project' (one project + its tasks), 'folder' (all projects in a folder), or 'all' (all active projects). Returns { opml, projectCount, taskCount } where opml is a complete XML string. Safe to call repeatedly; no side effects. Example: export_opml({ scope: "project", id: "abc123" }) Example: export_opml({ scope: "all" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRequired when scope='project' (project ID from project_list) or scope='folder' (folder ID from folder_list). Omit for scope='all'.
scopeYesWhat to export: 'project' (one project), 'folder' (all projects in a folder), or 'all' (all active projects).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the tool is 'safe to call repeatedly; no side effects' and describes the return format. It does not cover potential errors or permissions, but for a read-only export, this is good.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is five sentences, well-structured, and front-loaded with the core purpose. Every sentence adds necessary information without repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately covers purpose, usage, parameters, and return format. It lacks details on error cases or what happens with invalid inputs, but overall is sufficient for a simple export tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by providing examples (e.g., export_opml({ scope: 'project', id: 'abc123' })) and clarifying that 'id' is required for specific scopes. This extra context justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool exports OmniFocus data as OPML XML, a structured outline format. It distinguishes itself from siblings like export_taskpaper (different format) and import_opml (import vs export) by clearly defining its output format and scope levels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance: 'Do NOT use to export a single task; OPML scope is project-level or broader.' It also explains three scopes with examples. Missing explicit mention of alternative tools for single-task exports, but the warning is strong enough to guide proper usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_taskpaperA

Export OmniFocus data as TaskPaper plain text. Three scopes: 'project' (one project + its tasks), 'folder' (all projects in a folder), or 'all' (all active projects). Export is lossy — HTML notes are downgraded to plain text; tag locations, attachments, and complex repetition rules are omitted. Lossiness warnings are returned in meta.warnings. Do NOT use to import data; prefer import_taskpaper for that. Returns { taskpaper, projectCount, taskCount }. Safe to call repeatedly; no side effects. Example: export_taskpaper({ scope: "project", id: "abc123" }) Example: export_taskpaper({ scope: "all" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRequired when scope='project' (project ID from project_list) or scope='folder' (folder ID from folder_list). Omit for scope='all'.
scopeYesWhat to export: 'project' (one project), 'folder' (all projects in a folder), or 'all' (all active projects).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses lossy nature of export, lists downgraded/omitted items, mentions lossiness warnings in meta.warnings, and states no side effects. No annotations provided, so description carries full burden and does so well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise at 5 sentences, front-loaded with main purpose, uses clear structure with quoted scopes and examples. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given two simple parameters, no output schema, and sibling tools, description covers purpose, usage, behavior, parameters, and examples completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds value by explaining scopes in more detail (e.g., 'one project + its tasks') and providing usage examples. Enhances understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it exports OmniFocus data as TaskPaper plain text with three scopes. Distinguishes from sibling tool import_taskpaper by explicitly saying not to use for import, and provides examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when to use each scope, gives examples, and warns against using for import, directing to alternative. Also notes safe to call repeatedly with no side effects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_createA

Create a new folder in OmniFocus. Optionally nest it inside an existing parent folder (get IDs from folder_list). Do not use to move an existing folder; prefer folder_move instead. Returns the new folder's persistent ID. Triggers a sync; call sync_trigger after to propagate to other devices. Example: folder_create({ name: "Work" }) Example: folder_create({ name: "Archive", parentId: "fld123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFolder name. Must be non-empty.
parentIdNoParent folder ID. Omit for a root-level folder. Get from folder_list.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: returns persistent ID, triggers sync. Suggests calling sync_trigger after. No annotation contradictions. Could mention uniqueness constraints, but sufficient for a create operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences covering purpose, optional nesting, negative guideline with alternative, return value and sync note. Includes examples. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 2 parameters (both described), no output schema, and sibling tools, the description covers purpose, usage, parameters, return value, and sync behavior. Lacks only minor details like uniqueness, but overall complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds context: parentId is optional for root-level, get IDs from folder_list. Examples further clarify usage. Adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Create' and resource 'a new folder in OmniFocus'. Distinguishes from sibling tools like folder_move by explicitly stating not to use this tool for moving.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (creating new folders, optionally nesting) and when-not-to-use (moving folders, prefer folder_move). Also gives context on obtaining parent IDs from folder_list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_create_describeA

Preview what folder_create would do without making any changes. Do NOT use to actually create a folder — use folder_create instead. Returns { description, plannedChanges } describing the folder that would be created. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFolder name. Must be non-empty.
parentIdNoParent folder ID. Omit for a root-level folder. Get from folder_list.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. States no side effects, read-only contract, returns { description, plannedChanges }. Lacks details on error handling or edge cases, but sufficient for a simple preview tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Multiple sentences but each adds value: purpose, exclusion, return info, side-effect claim, usage example. Front-loaded with main action. Could be slightly more concise but no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but describes return structure. Explains relationship to folder_create. For a dry-run tool with simple parameters, this is complete enough. Lacks error handling but acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good descriptions. The description adds context of mapping to folder_create parameters but does not enhance meaning beyond what schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it previews folder_create without changes, and explicitly distinguishes from the actual creation tool. Includes a warning not to use it for creating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (dry-run), when not to use (use folder_create instead), and provides workflow guidance: pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_deleteA

Delete a folder from OmniFocus. By default returns ValidationError when the folder contains projects or subfolders. Pass cascade=true to orphan all direct projects (move to no folder) and recursively delete subfolders before deleting. IRREVERSIBLE — do not use to archive; prefer folder_update to rename instead. Get the folder ID from folder_list. Triggers a sync; call sync_trigger after to propagate to other devices. Example: folder_delete({ id: "fld123" }) Example: folder_delete({ id: "fld123", cascade: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent folder ID to delete. Get from folder_list.
cascadeNoWhen true, orphan all direct projects and recursively delete subfolders before deleting. Default false — returns an error if the folder is non-empty.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses default error on non-empty, cascade behavior, irreversibility, sync trigger, and examples. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-structured paragraphs with examples, no extraneous information, each sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers essential behavioral details and examples, but does not mention what the tool returns (e.g., success status). Minor gap for a simple delete tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context beyond schema: for id it repeats, for cascade it explains default and error behavior. Adds value but schema already described parameters well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it deletes a folder from OmniFocus, distinguishes from folder_update (rename) and folder_list, and explains default vs cascade behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (delete) and when not to use (archiving), provides alternative (folder_update), explains cascade option, and tells to get ID from folder_list and call sync_trigger after.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_delete_describeA

Preview what folder_delete would do without making any changes. Do NOT use to actually delete a folder — use folder_delete instead. Returns { description, plannedChanges } describing the deletion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent folder ID to delete. Get from folder_list.
cascadeNoWhen true, orphan all direct projects and recursively delete subfolders before deleting. Default false — returns an error if the folder is non-empty.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Explicitly states 'No side effects: read-only by contract' and 'never mutates OmniFocus'. With no annotations, description fully discloses behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loads key purpose, no fluff. Each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, behavior, return value (description and plannedChanges), and relationship to sibling. No output schema, but description compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description mentions 'pass the same args' but does not elaborate on individual parameters beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it previews folder deletion without changes, distinguishing from folder_delete. Uses 'preview', 'dry-run', and explicitly says 'Do NOT use to actually delete'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs when to use (dry-run) and when not (actual deletion), directing to folder_delete instead. Provides clear example of workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_getA

Fetch a single folder by its persistent ID, including project and subfolder counts. Do not use to list multiple folders; prefer folder_list instead. Returns folder details including name, parentId, projectCount, and subfolderCount. Safe to call repeatedly; no side effects. Example: folder_get({ id: "fld123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent folder ID. Get from folder_list. IDs are stable across renames.
verboseNoWhen true, return the full unelided folder shape. Default: false — `parentId` is omitted when null. See docs/token-cost.md for the defaults table.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states 'Safe to call repeatedly; no side effects,' which is good. However, it does not disclose behavior for invalid IDs or potential errors, and could mention whether the folder must exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences plus an example, front-loaded with purpose. Every sentence adds value—usage guidance, return fields, safety, and a concrete example. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get-by-ID tool with no output schema, the description covers purpose, usage, parameters, return fields, and safety. It is complete enough for an AI agent to select and invoke correctly, especially given the rich context from sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (both params described). The description adds significant meaning: for `id`, it explains how to obtain it (`Get from folder_list`) and stability; for `verbose`, it explains the effect on output shape and references documentation. This goes well beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch a single folder by its persistent ID'—a specific verb and resource. It explicitly distinguishes itself from the sibling tool `folder_list` by warning 'Do not use to list multiple folders; prefer folder_list instead.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use ('Fetch a single folder') and when-not-to-use ('Do not use to list multiple folders') guidance, and names the alternative (`folder_list`). It also adds context that the tool includes counts and is safe to call repeatedly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_listA

List folders in OmniFocus, optionally filtered by parent folder. Do not use to fetch a single folder by ID; prefer folder_get instead. Returns a flat array with projectCount and subfolderCount per folder. Use parentId to walk the hierarchy one level at a time. Safe to call repeatedly; no side effects. Example: folder_list({}) Example: folder_list({ parentId: "fld123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoWhen true, return the full unelided folder shape. Default: false — `parentId` is omitted when null (top-level folder). See docs/token-cost.md for the defaults table.
parentIdNoReturn only direct children of this folder. Get the ID from a previous folder_list call. Omit for root folders.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states 'Safe to call repeatedly; no side effects' and describes return shape (flat array with projectCount and subfolderCount). Good but could mention more about potential performance or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with front-loaded purpose, but includes examples which are helpful. Could be slightly more concise, but every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description explains return format. Parameters fully covered with examples. Tool is simple (2 optional params) and description provides sufficient guidance for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters have schema descriptions (100% coverage). Description adds usage context: parentId for walking hierarchy, verbose for full shape, and provides examples. Excellent clarity beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List folders in OmniFocus' with optional filtering by parent folder, and explicitly distinguishes from folder_get by warning against using it for a single folder.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (listing folders, optionally filtered) and when-not-to (for single folder, use folder_get). Also advises using parentId to walk hierarchy one level at a time, but does not cover all potential contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_moveA

Move a folder to a new parent, or promote it to a root folder by passing parentId=null. Do not use to rename a folder; prefer folder_update instead. Get folder IDs from folder_list. Returns the updated folder's ID and new parentId on success. Triggers a sync; call sync_trigger after to propagate to other devices. Example: folder_move({ id: "fld123", parentId: "fld456" }) Example: folder_move({ id: "fld123", parentId: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the folder to move. Get from folder_list.
parentIdYesNew parent folder ID, or null to promote the folder to root level.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so description carries full burden. It discloses triggers a sync, returns updated folder's ID and new parentId, and gives examples. Lacks mention of potential failures or authorization, but is generally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise 5-sentence description with examples, front-loaded, no wasted words. Clear structure: purpose, usage, alternatives, return, examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, return value, and follow-up action (sync_trigger). Adequate given simple parameters and no output schema; returns described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions. Description adds context: 'id' from folder_list, 'parentId' can be null for root promotion, enhancing schema info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Move a folder to a new parent, or promote it to a root folder', using specific action verbs and distinguishing from folder_update (rename). It also mentions promoting by passing parentId=null.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (moving, promoting to root), when not to (rename), and directs to folder_update instead. Also instructs to get IDs from folder_list and to call sync_trigger afterward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_move_describeA

Preview what folder_move would do without making any changes. Do NOT use to actually move a folder — use folder_move instead. Returns { description, plannedChanges } describing the reparenting that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the folder to move. Get from folder_list.
parentIdYesNew parent folder ID, or null to promote the folder to root level.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'No side effects: read-only by contract — never mutates OmniFocus' and describes return format { description, plannedChanges }, ensuring full transparency without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences front-loaded with purpose, includes usage guidance and return info. Slightly redundant example line, but overall clear and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description adequately explains return structure ({ description, plannedChanges }) and tool's role as dry-run companion, covering all needed context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions, so baseline is 3. Description mentions 'pass the same args you would to the write tool' but adds no new semantics beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states 'Preview what folder_move would do without making any changes' and distinguishes from sibling folder_move by saying 'Do NOT use to actually move a folder — use folder_move instead.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear when-to-use guidance as a dry-run companion before the write tool, explicitly warns against using for actual moves, and instructs to pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_updateA

Rename a folder (partial patch — only supplied fields are changed). To move a folder use folder_move instead. Get the folder ID from folder_list. Returns the updated folder on success. Triggers a sync; call sync_trigger after to propagate to other devices. Example: folder_update({ id: "fld123", name: "Personal" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent folder ID. Get from folder_list.
nameNoNew folder name. Must be non-empty if supplied.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses the partial patch behavior and sync trigger side-effect. It is transparent about the mutation and required follow-up. Missing only potential permission requirements, but not essential for transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise with a clear front-loaded purpose, efficient use of sentences, and a helpful example. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema), the description is fully complete: explains what it does, how to obtain required input, what it returns, and important side-effects. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds an example and context for the 'name' parameter but does not significantly enhance meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Rename a folder (partial patch — only supplied fields are changed)' with a specific verb and resource, and distinguishes from the sibling folder_move tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions when to use an alternative ('To move a folder use folder_move instead'), how to get the folder ID from folder_list, and guides post-operation steps ('call sync_trigger after to propagate to other devices').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

folder_update_describeA

Preview what folder_update would do without making any changes. Do NOT use to actually update a folder — use folder_update instead. Returns { description, plannedChanges } showing the fields that would be patched. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent folder ID. Get from folder_list.
nameNoNew folder name. Must be non-empty if supplied.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It explicitly states 'No side effects: read-only by contract — never mutates OmniFocus' and describes the return value structure. This is transparent and honest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short (5 sentences) and well-structured: first sentence states purpose, second warns against misuse, third describes output, fourth declares safety, fifth gives usage pattern. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return format ({ description, plannedChanges }) and asserts read-only behavior. For a dry-run tool with no nested objects, this is complete and sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions for id and name. The description adds a high-level usage hint ('pass the same args'), which is helpful but not essential. The schema already does a good job, so baseline 3 is adjusted upward modestly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: preview what folder_update would do without making changes. It distinguishes from the sibling tool folder_update by explicitly warning against using this tool for actual updates, and it explains the output shape.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use (dry-run), when-not-to-use (do not update), and suggests an alternative (folder_update). It also advises passing the same arguments to both tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forecast_getA

Get forecast-view tasks from OmniFocus grouped by category: overdue, dueToday, deferredToday, flagged. Use this for 'what's on my plate today' or multi-day planning queries. Do NOT use to list all tasks across all projects; prefer task_list instead. Supply date (ISO-8601 or shortcut like 'today', 'tomorrow') and days (1–7) for the ergonomic interface, or use from/to for exact ISO-8601 ranges. All include flags default to true; set to false to omit a category. When days > 1, response also includes byDate[] grouping task IDs per calendar day (dereference from dueToday[]). Returns { overdue[], dueToday[], deferredToday[], flagged[], byDate? } plus pagination { hasMore, cursor }; byDate entries are { date, taskIds[] }. Pages span the union of all four buckets (a task in multiple buckets counts once); default 50 tasks per page (max 200). Safe to call repeatedly; no side effects. Example: forecast_get({ date: "today" }) Example: forecast_get({ date: "today", days: 3, includeFlagged: false }) Example: forecast_get({ date: "today", limit: 25, cursor: "" })

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd of date range (ISO-8601 or relative shortcut like 'today'). Use date/days for the ergonomic interface instead. Defaults to end of today.
dateNoAnchor date for the forecast (ISO-8601 or relative shortcut: today, tomorrow, yesterday, this-week, next-week). Mutually exclusive with from/to. Defaults to today.
daysNoNumber of days to cover (1–7). Default 1. When > 1, byDate[] is included in the response.
fromNoStart of date range (ISO-8601 or relative shortcut like 'today'). Use date/days for the ergonomic interface instead. Defaults to start of today.
limitNoMax unique tasks per page (1..200). Default 50. Pagination spans the union of overdue/dueToday/deferredToday/flagged: a task that appears in multiple buckets counts once. Use `cursor` to fetch subsequent pages.
cursorNoOpaque cursor from a previous forecast_get response. Must use the same filters (date/from/to/days/include* /fields) — changing filters mid-sequence returns a ValidationError.
fieldsNoRestrict each returned task (across overdue/dueToday/deferredToday/flagged/byDate) to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names are dropped silently and surface in meta.warnings.WARN_UNKNOWN_FIELDS. Allowed: name, note, noteHtml, projectId, parentId, tagIds, deferDate, deferDateFloating, dueDate, dueDateFloating, estimatedMinutes, flagged, completed, completedAt, dropped, droppedAt, available, blocked, sequential, completedByChildren, repetition, notifications, createdAt, modifiedAt, _links.
includeFlaggedNoInclude all flagged incomplete tasks. Default true.
includeOverdueNoInclude tasks overdue before the start of the range. Default true.
maxOutputBytesNoCap the serialized byte size of the forecast payload (the overdue/dueToday/deferredToday/flagged/byDate buckets together). When the page would exceed this, the server keeps as many whole tasks as fit, sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and returns a pagination cursor that resumes at the first dropped task. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single task larger than the cap is still returned whole so pagination always advances.
includeDeferredNoInclude tasks whose defer date falls within the range. Default true.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral traits: no side effects, safe to call repeatedly, pagination behavior with cursor, response structure including byDate when days>1, and handling of maxOutputBytes truncation. No contradictions with annotations since none exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, starting with purpose, then usage, parameter details, response format, and examples. It is front-loaded and informative, though slightly lengthy; could be more concise while retaining all key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, no output schema, and moderate complexity, the description covers the response structure (categories, byDate, pagination with cursor and hasMore), parameter behaviors (fields filtering, maxOutputBytes), and edge cases (cursor validation, field dropping). It feels complete for the tool's context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining ergonomic vs exact date interfaces, default inclusion of all categories, and interplay between parameters (e.g., days>1 triggers byDate). This justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves forecast-view tasks grouped by categories (overdue, dueToday, deferredToday, flagged) and explicitly distinguishes it from task_list for listing all tasks, providing specific use cases like 'what's on my plate today'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use (daily planning, multi-day queries) and when not (prefer task_list for listing all tasks). It also provides guidance on parameter choices (date/days vs from/to) and includes examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forecast_get_tagA

Read the OmniFocus forecast-tag preference: the single tag whose tasks always appear on the Forecast view alongside dated items. Use when the agent needs to answer 'what tag is the user using as their daily agenda?' or to confirm a tag before composing follow-up queries against it. Do NOT use to list tags in general — prefer tag_list. Takes no arguments. Returns { tagId: string | null, name: string | null } — name is the tag's display name (or null when tagId is null or the tag has been deleted) so the agent can describe the forecast tag without a follow-up tag_get. Read-only; no side effects; safe to retry. Backed by OmniJS Database.forecastTag.Example: forecast_get_tag()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully carries transparency. Clearly states read-only, no side effects, safe to retry, and explains return structure including null cases. Also notes backend source ('Backed by OmniJS Database.forecastTag').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, well-structured paragraph with no wasted words. Front-loaded with purpose, followed by usage, return info, and safety. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, description fully covers behavior, return value with null handling, and distinguishes from siblings. No gaps remain for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no parameters (0 params), so baseline is 4 per rubric. Description does not need to add parameter info since none exist. It adds value by explaining the return value structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Read' and identifies the resource as 'OmniFocus forecast-tag preference'. It distinguishes from sibling tools by explicitly stating 'Do NOT use to list tags in general — prefer tag_list' and implies difference from forecast_set_tag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use examples ('answer what tag is the user using as their daily agenda?') and when-not-to-use ('Do NOT use to list tags in general'). Also states read-only and safe to retry, guiding appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forecast_packA

Pack today's forecast tasks into a time budget. Use when the user asks 'I have N hours; what should I do?' or wants a focused subset of forecast tasks that fit a limited window. Do NOT use for the full forecast — prefer forecast_get for that. Do NOT use to schedule work across multiple days — pass scope='next7' as a hint, but the pack is still budget-bounded; for true multi-day planning use forecast_get with days>1 and let the agent compose. Pass budgetMinutes (1–1440) and optional filter { tagIds?, scope? }; scope is 'today' (default) or 'next7'. Returns { selected[], totalMinutes, skipped[] }. selected[] are the picks in execution order (flagged first, then dueDate ascending, then stable by ID). skipped[] surfaces tasks the agent should ask the user about: { reason: 'no-estimate' } means the task has no estimatedMinutes so couldn't be packed; { reason: 'exceeds-budget' } means it would have fit individually but was bumped by earlier higher-priority picks. Read-only; no side effects; safe to retry. Pack algorithm is greedy — predictable and explainable beats optimal-by-1-minute. Example: forecast_pack({ budgetMinutes: 120 }) Example: forecast_pack({ budgetMinutes: 240, filter: { tagIds: ["tag123"], scope: "today" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoOptional filter narrowing the candidate set before packing.
budgetMinutesYesTime budget in minutes (1–1440 — i.e. up to 24 hours). Selected tasks' estimatedMinutes will sum to ≤ this value.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: read-only, no side effects, safe to retry. It details the greedy algorithm, ordering (flagged, dueDate, ID), and explains skipped[] reasons (no-estimate, exceeds-budget).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive but slightly verbose. It front-loads the purpose and usage, then covers behavior and examples. Each sentence is meaningful, but could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return structure (selected[], totalMinutes, skipped[]) and algorithm in detail. It covers all aspects needed for correct use: parameters, behavior, side effects, and examples. Very complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining how parameters affect the algorithm, providing range limits, and including example calls. However, it doesn't add much beyond what the schema already provides for filter properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's core function: 'Pack today's forecast tasks into a time budget.' It provides specific use cases (user asks 'I have N hours; what should I do?') and explicitly distinguishes from sibling tools like forecast_get and multi-day planning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance (budgeting tasks into a time window) and explicit when-not-to-use (full forecast, multi-day scheduling) with alternatives (forecast_get). It also explains how to use it with parameters and examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forecast_set_tagA

Set or clear the OmniFocus forecast-tag preference. Use when the user wants to designate (or change) the tag whose tasks should always appear on Forecast — common during onboarding flows or context switches ('use @today as my agenda'). Do NOT use to add tags to a task — prefer task_update. Pass tagId as a TagId string to set, or null to clear. Returns { tagId: string | null, name: string | null } echoing what was applied — name is paired with the tag id so the agent can describe the change without a follow-up tag_get. Errors: NOT_FOUND when the supplied tagId does not exist. Side effects: mutation; invalidates the forecast read cache. Backed by OmniJS Database.forecastTag. Example: forecast_set_tag({ tagId: "tag123" }) Example: forecast_set_tag({ tagId: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
tagIdYesThe TagId to designate as the forecast tag, or null to clear the preference. Use null to remove the forecast-tag binding entirely.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses side effects ('mutation; invalidates the forecast read cache'), errors ('NOT_FOUND'), and return value structure. Also mentions underlying implementation ('Backed by OmniJS Database.forecastTag').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value: purpose, usage, parameters, returns, errors, side effects, examples. Front-loaded with the core action. Well-structured and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with no output schema, the description fully covers applicable context: usage, parameters, return format, errors, side effects, and examples. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context: explains the purpose of tagId (set with string, clear with null), gives examples, and describes what null does. Adds value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Set or clear the OmniFocus forecast-tag preference') with a specific verb and resource. It distinguishes itself from sibling tools like task_update by explicitly noting that this tool is not for adding tags to tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context ('onboarding flows or context switches') and when-not-to-use ('Do NOT use to add tags to a task — prefer task_update'). Also explains how to use parameters (pass tagId as string or null).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_opmlA

Import tasks from an OPML XML string into OmniFocus. Parses the OPML produced by export_opml and recreates the task hierarchy. Top-level elements are matched to existing projects by OmniFocus ID (for round-trip) then by name; unmatched project outlines land in the Inbox. LOSSY: due dates, defer dates, and flagged state are preserved; tags, notes, attachments, and repetition rules are silently dropped (not encoded in OPML). Do NOT use to export data; prefer export_opml for that. Returns { imported, tasks: [{ id, name }] } — imported is the count of tasks created and tasks pairs each new id with its display name (resolved via a single getTasksMany batch, no N+1) so the agent can confirm what landed without a follow-up read. Orphan ids (rare; the task was deleted between import and lookup) are dropped from the array. Writes to OmniFocus; call sync_trigger after import to propagate changes to other devices. Example: import_opml({ opml: "..." })

ParametersJSON Schema
NameRequiredDescriptionDefault
opmlYesWell-formed OPML XML string to import. Use the output of export_opml for a round-trip.
destinationProjectIdNoWhen set, all tasks are created in this project regardless of project headings in the OPML. Get the ID from project_list. Omit to match projects by ID/name from the OPML structure.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses round-trip matching logic (by ID, then by name), lossy behavior (preserved: due dates, defer dates, flagged; dropped: tags, notes, attachments, repetition), return format, orphan handling, and write nature. No annotations provided, so description carries full burden and does so comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is dense but efficient; front-loaded with main purpose and structure. Every sentence adds value, though slight length could be trimmed slightly without losing content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: input format, matching, lossy fields, return structure (imported count, tasks array with id/name), orphan handling, and required follow-up sync trigger. No output schema exists, so description fully compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context: opml parameter notes 'Well-formed OPML XML string' and recommends using export_opml output; destinationProjectId explains override behavior and source for project ID. Adds meaning beyond schema's brief descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action (import), resource (tasks from OPML string), and destination (OmniFocus). It specifies it parses OPML from export_opml and recreates hierarchy, distinguishing it from export_opml and import_taskpaper.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns against using for export ('Do NOT use to export data; prefer export_opml for that') and instructs to call sync_trigger after import to propagate changes. Also mentions when to omit destinationProjectId for matching by ID/name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_taskpaperA

Import tasks from TaskPaper text into OmniFocus. Parses '- Task name @tag @due(2026-01-15) @defer(2026-01-10) @flagged' lines. Indented subtasks become children of the nearest parent task. Project headings ('Project name:') map to existing OF projects by name — unrecognised headings fall back to inbox (warning emitted). Unknown @tags are created automatically. Do NOT use to export data; prefer export_taskpaper for that. Returns { tasks: [{ id, name }], warnings: string[] } — tasks pairs each new id with its display name (resolved via a single getTasksMany batch, no N+1) so the agent can confirm what landed without a follow-up read. Orphan ids (rare; deleted between import and lookup) are dropped from the array. Writes to OmniFocus; call sync_trigger to propagate changes to other devices. Example: import_taskpaper({ text: "- Buy milk @errands\n- Call dentist @due(2026-05-01)" })

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesTaskPaper-formatted text to import. Each '- Task name' line becomes a task.
targetProjectIdNoWhen set, all top-level tasks are created in this project regardless of project headings in the text. Get the ID from project_list.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the burden. It discloses parsing behavior, project matching logic, automatic tag creation, and output structure. It also notes that orphan IDs are dropped and that writes occur. Some details like idempotency or error handling are missing, but the essential behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately sized and well-structured. It includes an example and practical notes. While every sentence adds value, it could be slightly more concise. The information is front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description thoroughly explains the return value structure ({ tasks, warnings }) and the behavior of orphan IDs. It also mentions the need for sync_trigger. For a tool of this complexity, the description is complete and provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds meaning beyond the schema: it provides an example of the text format and explains the effect of targetProjectId (overrides headings). This additional context helps the agent understand parameter usage beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool imports tasks from TaskPaper text into OmniFocus. It specifies the verb (import), resource (tasks), and target (OmniFocus). It differentiates from the sibling export_taskpaper by explicitly advising against using for export.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage guidance: when to import TaskPaper text, mentions project heading mapping and fallback to inbox, advises to call sync_trigger for propagation, and explicitly warns not to use for export. Could be slightly stronger by explicitly stating alternatives for other operations, but the sibling list provides context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

internal_statusA

Return a health snapshot of the running omnifocus-mcp server. Do NOT use this to read OmniFocus data — prefer task_list, project_list, sync_status, etc. Returns { uptimeMs, ofRunning, lastSync, calendarAccess, mutation, cache, circuits, queueDepth, responseStats, latencyStats, toolDurationStats, stores, transport, density }. cache.services maps key prefixes (tag, folder, forecast, task, project) to { hits, misses, hitRate }. circuits lists each circuit-breaker name and state (closed/open/half_open). ofRunning: null = not probed; use omnifocus_doctor for a live check. lastSync mirrors sync_status data; null if getLastSync throws. calendarAccess: macOS Calendar bridge state — { available, permission: granted|denied|restricted|not-determined|unknown }. Read-only; does NOT trigger TCC prompt. mutation: Stryker mutation-score freshness { score, lastRunAt } (0–100 per ADR-0017); null when no report file is present. responseStats / latencyStats / toolDurationStats: opt-in telemetry — bytes per tool, ms per (transport, script) with spawnFloorMs, ms per tool. Null when sample rate is 0. stores: { idempotencyEntries, loopDetectorKeys } live retention-store sizes — null when not wired. transport: persistent JXA transport stats; enabled=false by default. density: negotiated response density (compact|default|full). Read-only; no side effects. Example: internal_status()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: it is read-only ('Read-only; does NOT trigger TCC prompt'), explains null conditions for fields like lastSync, and details side-effect free nature. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured, explaining each returned field systematically. Every sentence provides value, though some redundancy exists (e.g., 'Read-only; no side effects' repeated). Still, it remains focused and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description comprehensively documents every field, including null states, data sources, and examples. It covers all necessary context for an AI agent to understand the tool's behavior and output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so baseline score is 4. The description does not need to add parameter meaning as there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it returns a health snapshot of the server, and distinguishes from siblings by instructing not to use it for OmniFocus data, pointing to specific alternatives like task_list, project_list, sync_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Do NOT use this to read OmniFocus data — prefer task_list, project_list, sync_status, etc.' and mentions omnifocus_doctor for live checks, clearly indicating when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

note_appendA

Append text to the plain-text note on a task or project. Adds a newline between existing content and the new text unless the note is empty. Do not use to replace the note entirely; prefer note_set instead. Pass idempotency_key to coalesce retries — append is not naturally idempotent and replays without a key duplicate the text. Returns { updated: true, id, targetKind, name, note } — name is the parent task/project's display name (captured from the same read that fetched the existing note) so the agent can describe the change without a follow-up read; note is the full content after appending. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the change to appear on other devices. Example: note_append({ targetKind: "task", id: "abc123", text: "Follow up next week" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task or project. Get task IDs from task_list; project IDs from project_list.
textYesText to append. A newline separator is inserted before the text if a note exists.
targetKindYesThe kind of OmniFocus item whose note to append to.
idempotency_keyNoIdempotency key for retry-safe appends. `append` is not naturally idempotent — replays without a key multiply the appended text. Identical subsequent calls with the same key within the TTL window replay the original envelope with meta.idempotentReplay = true instead of appending again. See docs/idempotency.md.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description fully bears the burden. It discloses side effects (writes to OmniFocus, sets meta.syncPending = true), retry behavior via idempotency_key, and output structure. However, it does not mention authorization requirements or whether the operation is reversible, which would elevate transparency further.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but remains efficient. It front-loads the core purpose and then covers guidelines, side effects, output, and example. Could be improved by using bullet points or breaking into sections, but it is not overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description appropriately explains the return value. It covers side effects and suggests sync_trigger for propagation. All four parameters are addressed. It could mention error conditions (e.g., target not found), but overall it is sufficiently complete for a mutation tool with idempotency handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining the newline insertion behavior, the purpose of idempotency_key for retry safety, and the return structure. It also provides an example. This additional context justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Append' and resource 'plain-text note on a task or project', and explicitly distinguishes from the sibling 'note_set' by saying 'Do not use to replace the note entirely; prefer note_set instead.' This makes the purpose specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use ('Append text'), when-not-to-use (avoid for replacement, prefer note_set), and a specific use case for retry safety with idempotency_key. It also includes a clear example, offering complete guidance for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

note_getA

Read the plain-text note from a task or project. Do not use when formatting fidelity matters; prefer note_get_html instead. Returns { note } — a string (may be empty) or null when no note exists. Set targetKind to 'task' and provide a task ID, or 'project' and a project ID. Safe to call repeatedly; no side effects. Example: note_get({ targetKind: "task", id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task or project. Get task IDs from task_list; project IDs from project_list.
targetKindYesThe kind of OmniFocus item whose note to read.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully discloses read-only nature, no side effects, return format (string or null), and safe repeated usage. Example clarifies parameter usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences plus an example. Purpose is front-loaded. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with 2 params and no output schema, description covers purpose, usage, parameters, return value, and safety. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). Description adds value by explaining targetKind and id roles with example and context, exceeding schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Read the plain-text note from a task or project' with a specific verb and resource. It distinguishes from sibling note_get_html by advising against use when formatting fidelity matters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use (plain-text reading) and when to use alternative (note_get_html for formatting). Also notes safe repeated calling and no side effects. Lacks explicit 'do not use' scenarios but alternatives sufficiently inform.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

note_get_htmlA

Read the HTML fragment from a task or project note. Returns { noteHtml } — an HTML string (may be empty) or null when no note exists. Known limitation: OmniFocus 4.x's automation bridge cannot read notes as HTML, so noteHtml degrades to null there even when a note exists — use note_get for plain text. Set targetKind to 'task' and provide a task ID, or 'project' and a project ID. For plain-text access without formatting, use note_get instead. Safe to call repeatedly; no side effects. Example: note_get_html({ targetKind: "task", id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task or project. Get task IDs from task_list; project IDs from project_list.
targetKindYesThe kind of OmniFocus item whose HTML note to read.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It explicitly states 'Safe to call repeatedly; no side effects.' and mentions a known limitation. This covers safety and idempotency, but does not discuss error cases or response behavior when IDs are invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately lengthy but well-structured with front-loaded purpose, then limitation, usage, alternative, and safety. Each sentence contributes uniquely, though it could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and no output schema, the description is thorough: it explains return type, known limitations, usage instructions, alternative tool, and safety. Only minor aspects like error handling are missing, but overall it is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good parameter descriptions. The description adds value by clarifying the relationship between targetKind and id (e.g., set targetKind to 'task' and provide a task ID) and includes a usage example, which supplements the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the HTML fragment from a task or project note. It specifies the return format ({ noteHtml } — an HTML string or null) and distinguishes from sibling tool note_get by noting its plain-text alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool vs note_get: 'For plain-text access without formatting, use note_get instead.' It also explains how to set targetKind and id, and notes a known limitation about OmniFocus 4.x degredation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

note_setA

Replace the plain-text note on a task or project. Overwrites the existing note entirely. Pass note: null to clear the note. To add text without overwriting use note_append instead. Returns { updated: true, id, targetKind, name, note } — name is the parent task/project's display name (pre-fetched so the response describes the change without a follow-up read); note echoes back the final content after writing (or null if cleared). Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the change to appear on other devices. Example: note_set({ targetKind: "task", id: "abc123", note: "Check with Alice first" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task or project. Get task IDs from task_list; project IDs from project_list.
noteYesNew note text. Pass null to clear the note entirely.
targetKindYesThe kind of OmniFocus item whose note to set.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations present, so description fully covers behavior: overwrites entirely, clears with null, side effects (writes to OmniFocus, sets syncPending), and recommends sync_trigger for cross-device sync. Also details return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise single paragraph, front-loaded with purpose, no fluff. Every sentence adds necessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 params and no output schema, description fully compensates by detailing return object, side effects, and usage example. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds value by explaining source of id (from task_list or project_list) and example call, surpassing schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description specifies verb 'Replace', resource 'note', and scope 'task or project'. It distinguishes from sibling note_append by directing to use that for additive updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool (replace note) and when to use alternative (note_append for adding text). Provides usage note for clearing note with null.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

note_set_htmlA

Replace the HTML fragment note on a task or project. Overwrites the existing note entirely with the provided HTML. OmniFocus preserves its supported HTML subset (bold, italic, links, lists, inline images); unsupported elements may be stripped. Pass noteHtml: null to clear the note. Known limitation: OmniFocus 4.x's automation bridge rejects HTML note writes, so this tool fails there with OF_UNSUPPORTED — use note_set (plain text) instead. For plain-text writes use note_set instead. Returns { updated: true, id, targetKind, name, noteHtml } — name is the parent task/project's display name (pre-fetched so the response describes the change without a follow-up read); noteHtml echoes back the requested HTML (or null if cleared). Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the change to appear on other devices. Example: note_set_html({ targetKind: "task", id: "abc123", noteHtml: "Priority: high" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task or project. Get task IDs from task_list; project IDs from project_list.
noteHtmlYesHTML fragment to set as the note. Pass null to clear the note entirely.
targetKindYesThe kind of OmniFocus item whose HTML note to set.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses overwrite behavior, HTML subset limitations, null clear, OmniFocus 4.x failure, return object details (including pre-fetched name), side effects (writes, syncPending), and need for sync_trigger. No annotations provided, so description carries full burden and meets it thoroughly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence is informative and necessary. Front-loaded with purpose, then covers details, limitations, alternatives, return, side effects, and example. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive given no annotations or output schema: covers purpose, parameters, return, limitations, alternatives, side effects, and example. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds context beyond schema: explains noteHtml null to clear, targetKind enum values, id source, and provides full example. Schema coverage is 100%, but description enriches understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Replace' and resource 'HTML fragment note on a task or project', making the purpose specific. It also distinguishes itself from sibling note_set (plain text).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (HTML notes) and when not to (OmniFocus 4.x, plain text). Provides alternative (note_set) and example usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omnifocus_doctorA

Self-diagnostic for omnifocus-mcp setup. Probes server health and the live OmniFocus connection. Do NOT call as a substitute for the tool that actually does the work — only use to triage why another tool is failing; prefer internal_status when you already know setup is fine and only want server metrics. Returns { summary: 'ok' | 'degraded' | 'failed', checks: [{ name, status: 'pass' | 'warn' | 'fail', details, remediation }] }. summary is the worst status across all checks; surface each check's remediation back to the user verbatim. No side effects; will NOT launch OmniFocus (use app_launch for that). Example: omnifocus_doctor()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It states that the tool has no side effects and will not launch OmniFocus, which is critical for an agent to understand. It also describes the return format and that it probes health. However, it does not mention whether it makes network calls or requires specific permissions, but for a diagnostic tool, the provided details are sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written with no extraneous words. It starts with the core purpose, then gives usage guidance, return format, behavioral notes, and an example, all in 6 sentences. Every sentence provides essential information for the agent to correctly use the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and no output schema, the description is complete. It explains the return structure, the logic of summary, and instructs to surface remediation verbatim. It also clarifies the no side effects and distinction from other tools. The only minor gap is not stating potential performance impacts, but overall it is sufficiently complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is empty with 100% coverage. The description clarifies this by showing an example call with no arguments. According to the baseline guideline for 0 parameters, a score of 4 is appropriate since the description adds no further parameter information but is consistent with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose as a self-diagnostic for omnifocus-mcp setup, probing server health and OmniFocus connection. It distinguishes itself from the sibling tool 'internal_status' by specifying its use for triage when other tools fail, and from 'app_launch' by clarifying it does not launch OmniFocus. The verb 'probes' and resource 'server health and live OmniFocus connection' are specific and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on when to use this tool: 'only use to triage why another tool is failing.' It also explicitly advises against using it as a substitute for the actual work tool and recommends preferring 'internal_status' when only server metrics are needed. This direct comparison with a sibling tool gives the agent a clear decision criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_createA

Create a new custom OmniFocus perspective with the given name, optional rule tree, optional aggregation, and optional icon color. The shell is created via JXA make (the only supported create path) and rules + aggregation + iconColor are written via OmniJS in the same transport hop — if rule writing throws, the shell is rolled back so the database is never left with a half-configured perspective. Use BEFORE composing complex authoring flows: pair with perspective_get to clone an existing perspective, or with perspective_delete to replace one. Do NOT use to update an existing perspective — prefer perspective_update (slice C) when it lands. rules is the same shape perspective_get returns (atom | aggregate | disabled wrapper) — round-trips are lossless. Each rule atom may set at most one action* predicate; combine predicates by wrapping atoms in a RuleAggregate with aggregateType all/any/none. Tag-id and focus-id arrays must be non-empty with non-empty entries. Returns { id } — the persistent identifier of the new custom perspective. Side effects: creates a perspective in OmniFocus; invalidates the perspective cache; sets meta.syncPending = true. Custom perspectives require OmniFocus Pro — without it, the adapter throws FeatureRequiresPro. Example: perspective_create({ name: "Today's plate", aggregation: "all", rules: [{ actionStatus: "flagged" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new perspective. Must be non-empty and unique within the OmniFocus database — duplicate names are rejected with VALIDATION_ERROR.
rulesNoTop-level rule list. Empty array means 'show everything' (the default for fresh perspectives). Each rule is an atom (single action* predicate), an aggregate (compound rule with aggregateType + aggregateRules), or a disabled wrapper around either.
iconColorNoCustom icon color in [0, 1] floats { r, g, b, a }. Omit for the OmniFocus-assigned default.
aggregationNoTop-level rule aggregation. One of "all", "any", "none". Defaults to "all" when omitted.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: JXA make for shell, OmniJS for rules/aggregation/iconColor, rollback on failure, side effects (invalidate cache, set syncPending), return value, and prerequisite (Pro).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive yet well-structured: purpose, creation process, usage, rule details, return, side effects, requirements, example. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 parameters, nested objects, and no output schema, the description covers all essential aspects: purpose, input constraints, behavior, error handling, side effects, return value, and prerequisites. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds significant meaning: explains rules shape matches perspective_get, constrains atoms to one action* predicate, describes aggregate and disabled wrappers, and gives an example. Provides context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new custom OmniFocus perspective with name, optional rules, aggregation, and icon color. It distinguishes itself from update and delete siblings, and explains its role in authoring flows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: pair with perspective_get to clone or perspective_delete to replace, and do not use for updates (prefer perspective_update). Also notes the OmniFocus Pro requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_deleteA

Delete a custom OmniFocus perspective by id. Use when a perspective is no longer needed — e.g. cleaning up after a templated workflow, or rotating out a stale view. Do not use on built-in perspectives (inbox, projects, tags, forecast, flagged, nearby, review) — they cannot be deleted; the call returns a validation error. Custom perspectives require OmniFocus Pro; without it the call returns OF_FEATURE_REQUIRES_PRO. Deletion is permanent — there is no undo for perspective removal in OmniFocus, so confirm with the user before invoking on a perspective they may want to keep. Recommend a sync_trigger after deletion so other devices observe the change. Returns { id } echoing the deleted identifier. Side effects: writes to OmniFocus (removes the perspective from the document), sets meta.syncPending = true. Example: { "perspectiveId": "fOpKrtZBLaZ" } → { id: "fOpKrtZBLaZ" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
perspectiveIdYesIdentifier of the custom perspective to delete. Obtain from perspective_list (look for kind: "custom"). Built-in ids are rejected with a validation error — built-ins are immutable.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description fully discloses side effects (writes to OmniFocus, removes perspective, sets meta.syncPending=true), permanence (no undo), return value ({ id }), and error conditions (validation error for built-ins, OF_FEATURE_REQUIRES_PRO without Pro).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized, front-loaded with the primary action, followed by usage conditions, side effects, and an example. Every sentence contributes valuable information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects: what is deleted, prerequisites, error scenarios, side effects, return format, and even a recommended follow-up action (sync_trigger). No gaps given the tool's complexity and lack of output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description adds significant meaning: how to obtain a valid perspectiveId (from perspective_list, looking for kind 'custom'), notes that built-in ids are rejected, and provides an example call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it deletes a custom OmniFocus perspective by id, distinguishing it from other tools like perspective_create or perspective_update. The verb 'delete' and resource 'custom perspective' are specific, and it explicitly notes it does not apply to built-in perspectives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('cleaning up after a templated workflow, or rotating out a stale view') and when-not-to-use (built-in perspectives, which cannot be deleted). Also mentions preconditions (requires OmniFocus Pro) and recommends confirming with the user and using sync_trigger after deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_evaluateA

Evaluate an OmniFocus perspective and return its task list. Accepts both built-in ids (inbox, projects, tags, forecast, flagged, nearby, review) and custom-perspective ids obtained from perspective_list — the tool selects the correct transport internally (JXA for built-in, OmniJS for custom). Custom perspectives require OmniFocus Pro; otherwise returns an error with code OF_FEATURE_REQUIRES_PRO. Returns { tasks: Task[] } with cursor pagination (limit defaults to 50, max 200). For 'review', returns [] — use review_list_due instead. For 'nearby', returns [] (location unavailable). No side effects; read-only. Example: perspective_evaluate({ perspectiveId: "flagged" }) Example: perspective_evaluate({ perspectiveId: "flagged", limit: 50, cursor: "…" })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results per page (1..200). Default 50. Use cursor to fetch subsequent pages.
cursorNoOpaque cursor from a previous perspective_evaluate response. Must use the same perspectiveId and fields — changing them mid-sequence returns a ValidationError.
fieldsNoRestrict each returned task to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names are dropped silently and surface in meta.warnings.WARN_UNKNOWN_FIELDS. Allowed: name, note, noteHtml, projectId, parentId, tagIds, deferDate, deferDateFloating, dueDate, dueDateFloating, estimatedMinutes, flagged, completed, completedAt, dropped, droppedAt, available, blocked, sequential, completedByChildren, repetition, notifications, createdAt, modifiedAt, _links.
perspectiveIdYesOmniFocus perspective id. Accepts a built-in id (inbox, projects, tags, forecast, flagged, nearby, review) or a custom-perspective id from perspective_list (kind: custom).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully covers behavioral aspects: read-only, no side effects, cursor pagination with defaults, error handling for Pro requirement, special handling for 'review' and 'nearby' returning empty arrays.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with front-loaded purpose, but slightly lengthy. Could be condensed while retaining all essential information. Still highly informative and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive coverage for a list tool: explains return structure (tasks array), pagination details, error codes, special case return values, and provides examples. Despite no output schema, description is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds significant value: explains limit and cursor pagination behavior, lists allowed fields and their behavior (unknown dropped, warnings), provides examples and clarifies perspectiveId types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'evaluate' and resource 'OmniFocus perspective'. Specifies it returns a task list and distinguishes between built-in and custom perspective ids. Differentiates from sibling tools like perspective_list and review_list_due.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool (to evaluate a perspective) and when not (use review_list_due for 'review', warns about 'nearby' returning empty, notes custom perspectives require OmniFocus Pro). Includes examples of usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_evaluate_dry_runA

Preview a proposed OmniFocus perspective rule tree without persisting it. Creates a temporary perspective with the supplied rules, evaluates it, and always deletes the temp perspective inside one OmniJS execution. Pairs with perspective_create for the propose-then-save flow used by the perspective-author prompt: propose rules → preview matched tasks via this tool → commit via perspective_create. Custom perspectives require OmniFocus Pro; otherwise returns OF_FEATURE_REQUIRES_PRO. Do NOT use to evaluate a saved perspective — use perspective_evaluate. Returns { tasks: Task[] }. Side effects: creates and immediately deletes a sentinel-named temp perspective inside one OmniJS execution; the database state is unchanged after the call returns. Example: perspective_evaluate_dry_run({ aggregation: 'all', rules: [{ actionStatus: 'flagged' }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
rulesYesTop-level rule list to evaluate. Empty array means 'show everything' (matches every available task). Each rule is an atom (single action* predicate), an aggregate (compound rule with aggregateType + aggregateRules), or a disabled wrapper around either.
aggregationNoTop-level rule aggregation. One of "all", "any", "none". Defaults to "all" when omitted.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects: creates and immediately deletes a temporary perspective, database state unchanged. Also specifies return format { tasks: Task[] } and mentions single OmniJS execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single paragraph that efficiently covers purpose, mechanism, pairing, prerequisite, usage warning, return type, side effects, and example. No redundant sentences; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 2 parameters (one required) and no output schema, the description covers all necessary context: behavior, side effects, return type, prerequisite, and usage example. Complete for an AI agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed parameter descriptions. The description adds minimal new parameter info beyond the schema (e.g., example usage), but provides valuable context like the empty array behavior already present in schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool previews a proposed perspective rule tree without persisting it, and contrasts with perspective_evaluate for saved perspectives. The verb 'preview' and resource 'perspective rule tree' are specific and differentiated from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use: as part of propose-then-save flow with perspective_create, and warns not to use for saved perspectives. Also notes the OmniFocus Pro prerequisite and the error return if not met.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_getA

Read the full configuration of a custom OmniFocus perspective — name, top-level rule aggregation (all/any/none), the structured rule tree, and icon color (when set). Use to introspect what a perspective filters on before evaluating it, or as a building block for cloning / duplicating perspectives. Do not use on built-in perspectives (inbox, projects, tags, forecast, flagged, nearby, review) — they have no rule tree and the call returns a validation error. Use perspective_list instead to enumerate available perspectives. Custom perspectives require OmniFocus Pro; without it the call returns OF_FEATURE_REQUIRES_PRO. Returns { perspective: { id, name, aggregation, rules, iconColor } }. Safe to call repeatedly; no side effects, no writes. Example: { "perspectiveId": "fOpKrtZBLaZ" } → { perspective: { id, name: "Daily Triage", aggregation: "any", rules: [...], iconColor: { r: 0.2, g: 0.5, b: 0.9, a: 1 } } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
perspectiveIdYesIdentifier of the custom perspective to read. Obtain from perspective_list (look for kind: "custom"). Built-in ids (inbox, projects, tags, forecast, flagged, nearby, review) are rejected with a validation error — built-ins have no rule tree.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses no side effects, safe to call repeatedly, and describes error cases (built-in ids, missing Pro). Also outlines return shape and provides an example.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise single paragraph with front-loaded purpose. Every sentence adds value: purpose, use cases, restrictions, errors, return format, example. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and no output schema, the description covers all necessary information: purpose, when to use, parameter sourcing, error conditions, return structure, safety profile. Complete and self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already has a detailed description for perspectiveId (100% coverage). The description adds a concrete example and reinforces the context (obtain from perspective_list, built-ins invalid). This goes beyond the schema but the schema already covers the semantics well, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the full configuration of a custom OmniFocus perspective, listing specific fields (name, aggregation, rules, icon color). It distinguishes from siblings like perspective_list and perspective_evaluate by specifying that it is for introspection and cloning, and by warning against built-in perspectives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (introspect before evaluating, cloning) and when not (built-in perspectives, which cause validation errors). Provides alternative tool perspective_list for enumeration. Also notes OmniFocus Pro requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_listA

List all perspectives in OmniFocus — both built-in (Inbox, Projects, Tags, Forecast, Flagged, Nearby, Review) and custom (OmniFocus Pro). Do not use to evaluate a perspective; prefer perspective_evaluate for that. Returns each perspective's id, name, kind (builtin|custom), and requiresPro flag. Safe to call repeatedly; no side effects, no writes. Example: perspective_list()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully bears the burden of behavioral disclosure. It clearly states the tool is read-only, has no side effects, and returns specific fields (id, name, kind, requiresPro), providing complete transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two sentences and an example call. It is front-loaded with the primary action and effectively conveys all necessary information with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description explicitly lists the return fields and provides usage context. The tool is simple with no parameters, and the description fully addresses its behavior and output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so per guidelines the baseline is 4. The schema coverage is 100%, and the description does not need to add parameter information since there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all perspectives in OmniFocus, specifies included types (built-in and custom), and explicitly distinguishes it from perspective_evaluate, making the purpose very specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when not to use this tool (for evaluation, prefer perspective_evaluate) and notes that it is safe to call repeatedly with no side effects, offering clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perspective_updateA

Partial-patch update of a custom OmniFocus perspective. Only fields present in the input are written — omitting a field leaves the existing value unchanged. Passing iconColor: null clears the custom color back to the OmniFocus default; passing rules: [] clears the rule tree to 'show everything'. Use to rename a perspective, retune its rule tree, swap the aggregation, or recolor the icon. Do NOT use to create a new perspective (prefer perspective_create) or to alter built-in perspectives — built-in ids (Inbox, Forecast, Flagged, Projects, Tags, Nearby, Review) are rejected with VALIDATION_ERROR. rules is the same shape perspective_get returns (atom | aggregate | disabled wrapper) — round-trips are lossless. Each rule atom may set at most one action* predicate; combine predicates by wrapping atoms in a RuleAggregate with aggregateType all/any/none. Returns { id } — the persistent identifier of the patched perspective. Side effects: writes to OmniFocus; invalidates the perspective cache; sets meta.syncPending = true. Custom perspectives require OmniFocus Pro — without it, the adapter throws FeatureRequiresPro. Example: perspective_update({ perspectiveId: "abc123", name: "Today's plate", aggregation: "all" }) Example: perspective_update({ perspectiveId: "abc123", iconColor: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew display name. Must be non-empty when provided. OmniFocus rejects duplicate names.
rulesNoNew top-level rule list. Empty array clears the rule tree to 'show everything'. Each rule is an atom (single action* predicate), an aggregate (compound rule with aggregateType + aggregateRules), or a disabled wrapper around either.
iconColorNoNew custom icon color, or null to clear back to the OmniFocus default. Omit to leave the existing color unchanged.
aggregationNoNew top-level rule aggregation. One of "all", "any", "none".
perspectiveIdYesPersistent identifier of the custom perspective to patch. Get from `perspective_list`. Built-in perspective ids are rejected with VALIDATION_ERROR.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description fully discloses behavioral traits: it explains the partial-patch behavior (only provided fields written), the side effects (writes to OmniFocus, invalidates cache, sets syncPending), the requirement for OmniFocus Pro, and special handling of null/empty values for iconColor and rules. Return value { id } is also specified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but each sentence is informative and earns its place. It could be slightly more concise, but given the complexity of the tool (5 parameters, nested rule structure), the length is justified. Front-loading is good: first sentence defines operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Considering the tool's complexity, full schema coverage, and no output schema, the description is remarkably complete. It covers all essential aspects: operation, parameter behaviors, constraints, side effects, return value, prerequisites, and examples. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is high. The description adds significant value beyond the schema by explaining the effect of null iconColor, empty rules array, the round-trip nature of rules, and the constraint that built-in perspectiveIds are rejected. This goes well beyond the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Partial-patch update of a custom OmniFocus perspective' and enumerates exactly what can be updated (name, rules, iconColor, aggregation). It distinguishes from perspective_create and explicitly mentions that built-in perspectives are not modifiable, providing strong purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (rename, retune rules, swap aggregation, recolor icon) and when not to use it (DO NOT use for create or built-in perspectives), and even provides alternatives (perspective_create). This is excellent guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plugin_invokeA

Invoke a named Omni Automation plug-in action in OmniFocus. Use this when you need to run a specific installed plug-in — not for built-in OmniFocus operations. Do NOT use to run arbitrary JavaScript; for raw scripting use run_omnijs_script (requires opt-in env var). identifier is the plug-in's bundle ID (e.g. "com.example.my-plugin"). arg is an optional JSON-serialisable value passed to the plug-in action as Action.args[0]. Returns { result } where result is the plug-in's return value (arbitrary JSON). Throws NotFound if the plug-in is not installed. Side effects: plug-in may mutate OmniFocus data; call sync_trigger if you need changes on other devices. Example: plugin_invoke({ identifier: "com.example.my-plugin" }) Example: plugin_invoke({ identifier: "com.example.my-plugin", arg: { mode: "export" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
argNoOptional JSON-serialisable argument forwarded to the plug-in action as Action.args[0]. Defaults to null.
identifierYesBundle identifier of the Omni Automation plug-in to invoke (e.g. "com.example.my-plugin").

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, description fully discloses side effects (may mutate data, need sync_trigger for multi-device changes), error behavior (throws NotFound), and return format ({ result }).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with front-loaded main action, but slightly verbose; could be trimmed while retaining all key info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: purpose, usage, parameters, side effects, errors, return value, and examples. No output schema needed as return format is explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds meaning: explains identifier as bundle ID with example, and arg as optional JSON-serialisable forwarded to Action.args[0], providing context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool invokes a named Omni Automation plug-in action in OmniFocus, with specific verb and resource. Distinguishes from sibling tool run_omnijs_script for raw JavaScript execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (specific installed plug-in) and when not to use (not for built-in operations, not for arbitrary JavaScript). Points to alternative run_omnijs_script and explains parameters with examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_batch_completeA

Mark many OmniFocus projects as completed in a single JXA round trip. Completed projects are hidden from active views and closed to new task entry. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each completion succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated project_complete calls whenever completing more than one project. Each item is { id }. Returns { completed: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the project name so the agent can describe each completion without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: project_batch_complete({ items: [{ id: "prj123" }, { id: "prj456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: projects are hidden from active views, atomic validation, best-effort per-index outcomes, side effects (writes to OmniFocus, sets meta.syncPending = true), and need for sync_trigger. It also details the return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with dense, useful information. Each sentence adds value, though it could be slightly more structured (e.g., bullet points). No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a batch mutation tool with atomic validation and best-effort semantics, the description covers all essential aspects: purpose, usage, side effects, return format, and synchronization requirements. No output schema but the description compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description adds limited value beyond the schema. It provides an example and notes that the response carries the project name, but the parameter description is already clear in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it marks many OmniFocus projects as completed in a single JXA round trip, and explicitly distinguishes from the sibling tool project_complete by recommending this tool over repeated calls when completing more than one project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly recommends use for completing multiple projects over repeated project_complete calls, and describes atomic validation and best-effort execution. It does not explicitly state when not to use, but the guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_batch_dropA

Cancel (drop) many OmniFocus projects in a single JXA round trip. Dropped projects remain in OmniFocus but are treated as cancelled/inactive — they do not appear in active project lists. Use project_delete for permanent removal. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each drop succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated project_drop calls whenever dropping more than one project. Each item is { id }. Returns { dropped: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the project name so the agent can describe each drop without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: project_batch_drop({ items: [{ id: "prj123" }, { id: "prj456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully covers: atomic validation, best-effort execution, response structure, side effects (writes to OmniFocus, sets syncPending), and need to call sync_trigger. Provides comprehensive behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but well-structured: starts with main verb, explains behavior, compares to alternatives, describes validation and execution, and provides an example. Every sentence adds value; no extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complexity of batch operation with atomic validation and best-effort execution, description fully explains all critical aspects: the process, response format, side effects, and sync requirements. No output schema but return structure is described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the 'items' parameter. Description adds example usage and confirms each item is { id }, but does not add new semantic information beyond what schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Cancel (drop) many OmniFocus projects' with specific verb and resource. Distinguishes from project_delete and project_drop, and explains that dropped projects remain but are inactive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Prefer this tool over repeated project_drop calls whenever dropping more than one project.' Also distinguishes from project_delete and explains atomic validation and best-effort execution, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_completeA

Complete an OmniFocus project — marks it done with today's date and moves it out of the active view. Use when a project is finished. Do not use to archive or hide a project without completing it; prefer project_drop for that. Returns { completed: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: sets completionDate, removes from active projects, sets meta.syncPending = true. Example: project_complete({ id: "prj123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to complete.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects (sets completionDate, removes from active projects, sets syncPending) and return format, ensuring the agent understands the impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: three sentences plus an example, no fluff, front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter, the description covers purpose, usage, side effects, return format, and includes an example. Complete without requiring an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and describes the 'id' parameter sufficiently. Description adds minimal extra value but is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('marks it done with today's date and moves it out of the active view') and distinguishes from 'project_drop' which archives without completing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use ('when a project is finished') and when not to (archiving/hiding without completing), and suggests the alternative 'project_drop'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_complete_describeA

Preview what project_complete would do without making any changes. Do NOT use to actually complete a project — use project_complete instead. Returns { description, plannedChanges } describing the completion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to complete.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states 'No side effects: read-only by contract — never mutates OmniFocus'. This fully discloses behavioral traits. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concisely written in a few sentences, front-loaded with purpose, and includes essential usage info and example without any fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (1 param, no output schema), the description fully covers what the tool does, its return value, its read-only nature, and how to use it in conjunction with project_complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description for the only parameter (id). Description does not add extra meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool previews what project_complete would do without changes. It uses a specific verb ('preview') and resource ('project completion'), and explicitly distinguishes from the sibling project_complete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (dry-run companion) and when not to (do not use to actually complete). Names alternative tool (project_complete) and provides usage pattern: pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_createA

Create a new OmniFocus project. Optionally place it in a folder, assign tags, set completion criterion, status, defer/due dates, estimated minutes, flagged state, and review interval. Safety control: pass idempotency_key to make transport retries safe — identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate project. Returns { created: true, id }. Side effects: creates a project in OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the project to appear on other devices. Example: project_create({ name: "Website Redesign" }) Example: project_create({ name: "Q3 Planning", folderId: "fld123", flagged: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProject name. Required, must be non-empty.
noteNoPlain-text note for the project.
statusNoInitial project status. Default: active. Accepts: 'paused' → on-hold.
tagIdsNoTag IDs to apply to the project.
dueDateNoDue date as ISO-8601 with UTC offset.
flaggedNoFlag the project.
folderIdNoFolder ID to place the project in. Omit for root.
deferDateNoDefer date as ISO-8601 with UTC offset.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency key for retry-safe creates. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate project.
estimatedMinutesNoEstimated total duration in minutes.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
reviewIntervalDaysNoReview interval in days. Omit to use OmniFocus default.
completionCriterionNoHow the project's tasks are completed: parallel (any order), sequential (in order), or singleActions. Accepts: 'in-order' → sequential, 'in order' → sequential, 'any-order' → parallel, 'any order' → parallel.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses side effects (creates a project, sets syncPending), idempotency behavior with key, and the need to call sync_trigger for multi-device sync. With no annotations, this provides valuable behavioral context beyond the action itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively concise given the 14 parameters. It front-loads the core purpose, then lists parameters efficiently. Examples are provided. However, it could be trimmed slightly by removing redundant phrases like 'Optionally place it in a folder' since the parameter list covers it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter creation tool with no output schema, the description covers return format, idempotency, side effects, and follows up with sync guidance. The examples illustrate typical use cases. Minor gap: it does not clarify that the tool may fail if the folderId is invalid, but overall complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description adds limited value by explaining idempotency_key's purpose and providing aliases for status and completionCriterion. The examples are helpful but don't substantially deepen parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new OmniFocus project' with a specific verb and resource. It lists optional placement, tags, dates, etc., making the purpose unambiguous. However, it does not differentiate from sibling tools like project_create_describe, which is a dry-run variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention when not to use it, nor does it compare to project_create_describe, project_batch_complete, or other creation-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_create_describeA

Preview what project_create would do without making any changes. Do NOT use to actually create a project — use project_create instead. Returns { description, plannedChanges } describing the project that would be created. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProject name. Required, must be non-empty.
noteNoPlain-text note for the project.
statusNoInitial project status. Default: active. Accepts: 'paused' → on-hold.
tagIdsNoTag IDs to apply to the project.
dueDateNoDue date as ISO-8601 with UTC offset.
flaggedNoFlag the project.
folderIdNoFolder ID to place the project in. Omit for root.
deferDateNoDefer date as ISO-8601 with UTC offset.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency key for retry-safe creates. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate project.
estimatedMinutesNoEstimated total duration in minutes.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
reviewIntervalDaysNoReview interval in days. Omit to use OmniFocus default.
completionCriterionNoHow the project's tasks are completed: parallel (any order), sequential (in order), or singleActions. Accepts: 'in-order' → sequential, 'in order' → sequential, 'any-order' → parallel, 'any order' → parallel.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses no side effects, read-only by contract, never mutates OmniFocus. Describes return value structure. No annotations provided, but description adds sufficient behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus an example, front-loaded with purpose, no wasted words. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 14 parameters and no output schema, description explains return value and no-side-effect guarantee. Could elaborate on plannedChanges contents, but sufficient for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions. Description adds minimal extra meaning beyond noting to pass same args as write tool. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it previews project creation without changes, uses specific verb 'preview' and resource 'project_create'. Distinguishes from sibling 'project_create'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns against using for actual creation, directs to 'project_create' instead. Provides workflow: dry-run companion, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_deleteA

Permanently delete an OmniFocus project and ALL its contained tasks. IRREVERSIBLE — uses OmniFocus deleteObject; there is no undo. All tasks inside the project are also permanently deleted (cascade). Prefer project_drop when you want a recoverable status change. Only use project_delete when the agent has explicit user intent to permanently remove the project and its tasks. 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 delete is only performed once. Returns { deleted: true, id } on success. Side effects: removes the project and its tasks from OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the deletion to appear on other devices. Example: project_delete({ id: "prj123", dry_run: true }) Example: project_delete({ id: "prj123", expectedModifiedAt: "2026-04-01T10:00:00Z" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to delete. Get from project_list. Verify you have the correct ID before calling — this action is irreversible and deletes all contained tasks.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
idempotency_keyNoIdempotency key for retry-safe deletes. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-deleting (or re-raising NotFound on the second attempt).
expectedModifiedAtNoOptimistic-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 delete is performed. Omit to skip the check.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses irreversible cascade deletion, side effects (syncPending=true), return format, and dependency on sync_trigger for cross-device updates. No annotations provided, but description fully carries the burden with rich behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value; front-loaded with critical irreversible warning, then usage guidance, safety controls, and examples. Efficiently structured without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: what it does, when to use, safety, side effects, return value, and cross-device sync implications. No output schema exists but return format is clearly described. Adequate for a complex destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While schema coverage is 100% and provides basic descriptions, the description adds contextual meaning: purpose of dry_run as preview, expectedModifiedAt as optimistic concurrency guard, idempotency_key for retry safety. Adds examples demonstrating usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'permanently delete an OmniFocus project and ALL its contained tasks' with specific verb+resource and irreversible nature. Distinguishes from sibling 'project_drop' by contrasting recoverable vs permanent deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (only with explicit user intent to permanently remove) and when not to (prefer project_drop for recoverable status change). Provides safety controls and examples for dry_run, expectedModifiedAt, and idempotency_key.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_delete_describeA

Preview what project_delete would do without making any changes. Do NOT use to actually delete a project — use project_delete instead. Returns { description, plannedChanges } describing the permanent deletion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to delete. Get from project_list. Verify you have the correct ID before calling — this action is irreversible and deletes all contained tasks.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
idempotency_keyNoIdempotency key for retry-safe deletes. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-deleting (or re-raising NotFound on the second attempt).
expectedModifiedAtNoOptimistic-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 delete is performed. Omit to skip the check.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully covers behavior: returns { description, plannedChanges }, no side effects, read-only by contract, never mutates OmniFocus. Clearly states it's a preview only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with front-loaded purpose. Three sentences cover purpose, usage, behavior, and return value. Minor redundancy in 'No side effects' and 'read-only by contract' but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description adequately describes return structure ({ description, plannedChanges }). Covers no side effects, read-only nature, and relationship to write tool. Does not mention idempotency or optimistic concurrency, but these are in schema and not critical for usage understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with all 4 parameters fully documented. Description adds little beyond the schema for parameters, only a brief usage hint about passing same args. Baseline 3 is appropriate as description doesn't significantly enhance parameter understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it previews what project_delete would do without changes, using specific verb 'Preview' and resource 'what project_delete would do'. Distinguishes from sibling tool project_delete by explicitly saying 'Do NOT use to actually delete a project — use project_delete instead'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (dry-run companion) and when not to use (don't want to delete). Provides alternative: 'use project_delete instead'. Gives example workflow: pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_dropA

Drop an OmniFocus project — marks it as on-hold/dropped and removes it from the active view without completing it. Use to defer or abandon a project while keeping it recoverable. Do not use if the project is actually done; prefer project_complete for that. Returns { dropped: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: changes project status, sets meta.syncPending = true.Example: project_drop({ id: "prj123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to drop.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses side effects: changes project status, sets meta.syncPending = true, and describes return value shape, giving the agent full behavioral understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three clear sentences plus an example. Every sentence adds value, no redundancy. Front-loaded with action and side effects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a simple tool: describes action, usage guidance, side effects, return value, and provides an example. No gaps given one parameter and no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id) with schema description coverage 100%. Description adds example usage but no additional semantic detail beyond schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: marks a project as on-hold/dropped, removes from active view without completing. It distinguishes from project_complete, showing clear purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when not to use (if actually done, prefer project_complete) and provides context for deferring or abandoning. This helps the agent select the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_drop_describeA

Preview what project_drop would do without making any changes. Do NOT use to actually drop a project — use project_drop instead. Returns { description, plannedChanges } describing the status change that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to drop.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of explaining behavior. It states 'No side effects: read-only by contract — never mutates OmniFocus.' and describes the return value { description, plannedChanges }. This provides good transparency, though details on error handling or edge cases are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with 4 sentences that are front-loaded with the primary purpose. Every sentence adds value: purpose, usage warning, return object, read-only guarantee, and example usage pattern. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter and no output schema or annotations, the description covers the essential elements: purpose, usage instructions, return type, and safety guarantee. It could mention error behavior or input validation, but overall it is adequately complete for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the 'id' parameter with a pattern and description, providing 100% coverage. The description adds context by referencing 'the same args you would to the write tool', but does not add further detail beyond the schema. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as a dry-run for project_drop: 'Preview what project_drop would do without making any changes.' It distinguishes from the sibling project_drop by using 'Preview' and 'Do NOT use to actually drop a project — use project_drop instead.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (to preview) and when not to (use project_drop for actual drop). It also provides a usage pattern: 'pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_getA

Fetch a single OmniFocus project by persistent ID. Do NOT use for queries across projects — use project_list. When includeTaskTree=true (default), the project's flat task list is attached. Returns { project, tasks? }; safe to call repeatedly; no side effects. Example: project_get({ id: "prj123" }) Example: project_get({ id: "prj123", includeTaskTree: false })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent project ID. Get from project_list or search_query.
fieldsNoRestrict the returned project to this list of top-level fields (id is always returned). Omit for the full project shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS. Note: only the project record is projected — attached tasks keep their full shape.
verboseNoWhen true, return the full unelided shape (project + tasks). Default: false — fields equal to their documented default are omitted from both. See docs/token-cost.md for the defaults table.
includeLinksNoWhen true, the project (and each attached task, if includeTaskTree=true) carries a `_links` HATEOAS block. Default false — the block is omitted to save payload size. Use the underlying ID fields (`id`, `folderId`, `projectId`, `parentId`, `tagIds`) directly instead.
includeTaskTreeNoWhether to attach the project's tasks (flat array; clients rebuild the tree via parentId). Default true. Set to false for a fast project-only read.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries the burden. It discloses no side effects, safe to call repeatedly, and describes return shape. Omits error handling for missing IDs, but still strong for a get tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with examples. No redundant information; every sentence serves a purpose. Front-loaded with purpose and usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple nature of a get tool with 5 well-described parameters, the description covers return shape, default behavior, and safety. Examples cover main use cases. Complete for the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with detailed descriptions. Description adds examples for id and includeTaskTree and states default for includeTaskTree, but does not significantly expand on schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Fetch a single OmniFocus project by persistent ID' with a specific verb and resource. It distinguishes from sibling tool project_list by explicitly advising against cross-project queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Do NOT use for queries across projects — use project_list.' Provides clear when-to-use and when-not-to-use guidance with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_get_manyA

Fetch up to 100 projects by persistent ID in a single OmniFocus round-trip. Use when you have a set of project IDs and need full project objects for all of them. Do NOT use for a single ID — use project_get instead. Returns Project[] in input order. Missing IDs are omitted and appear in meta.warnings. Read-only; safe to retry. Example: project_get_many({ ids: ["prj123", "prj456"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of project IDs to fetch (0..100). Get IDs from project_list. Missing IDs are omitted (not errors) and appear in meta.warnings.
fieldsNoRestrict each returned project to this list of top-level fields (id is always returned). Omit for the full project shape. Empty array returns just id. Unknown names are dropped silently and surface in meta.warnings.WARN_UNKNOWN_FIELDS. Allowed: name, note, noteHtml, folderId, tagIds, status, completionCriterion, deferDate, deferDateFloating, dueDate, dueDateFloating, estimatedMinutes, flagged, reviewIntervalDays, nextReviewDate, lastReviewDate, completed, completedAt, dropped, droppedAt, taskCount, completedTaskCount, createdAt, modifiedAt, _links.
maxOutputBytesNoCap the serialized byte size of the returned projects[] array. When the response would exceed this, the server returns as many whole projects as fit (in input order), sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and lists the trimmed ids in meta.warnings.WARN_RESULT_TRUNCATED details.droppedIds — re-request those in a smaller batch or with a higher cap. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single project larger than the cap is still returned whole so the batch always makes progress.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behavioral traits: returns projects in input order, omits missing IDs with warnings in meta.warnings, and states it is read-only and safe to retry. For the maxOutputBytes parameter, it explains truncation behavior in detail, which is not obvious from the schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core purpose, followed by usage guidelines, behavioral notes, and an example. No extraneous information; every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description adequately explains the return type (Project[] in input order) and mentions meta.warnings for missing IDs. The fields parameter and maxOutputBytes are well-described. Minor gap: it doesn't explicitly state that the 'fields' parameter affects each returned project's shape, but this is implied by the parameter description. Overall, the tool is well-documented for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the two parameters (ids and fields), so baseline is 3. However, the description adds significant value beyond the schema: it clarifies the purpose of 'fields' (restrict returned fields), explains the behavior of maxOutputBytes (truncation, progress guarantee), and provides an example. This additional context justifies a score above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches up to 100 projects by persistent ID in a single round-trip, distinguishing it from project_get (single ID) and project_list (all projects). The verb 'Fetch' and resource 'projects by ID' are specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use (multiple IDs) and when not to (single ID, recommending project_get instead). Includes an example usage, making the guidance concrete and easy to follow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_listA

List projects in OmniFocus with optional filters. Use for queries across projects. Do NOT use for a known single project (use project_get). Filters: folderId, status, flagged, reviewDueBefore. Returns projects[] with pagination; safe to call repeatedly; no side effects. Example: project_list({}) Example: project_list({ status: "active", folderId: "fld123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax projects per page (1..1000). Default 50. Use `cursor` to fetch subsequent pages.
cursorNoOpaque cursor from a previous project_list response. Must use the same filters — changing filters mid-sequence returns a ValidationError.
fieldsNoRestrict each returned project to this list of top-level fields (id is always returned). Omit for the full project shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
statusNoRestrict to projects with this status. 'active' = available; 'on-hold' = paused; 'done' = completed; 'dropped' = abandoned. Omit for any status. Accepts: 'paused' → on-hold, 'completed' → done, 'cancelled' → dropped.
flaggedNotrue = flagged only; false = unflagged only; omit = both.
verboseNoWhen true, return the full unelided project shape. Default: false — fields equal to their documented default (status: 'active', completionCriterion: 'parallel', flagged: false, tagIds: [], note: null, etc.) are omitted. See docs/token-cost.md for the defaults table.
folderIdNoRestrict to projects inside this folder. Get the ID from folder_list. Omit for all folders.
includeLinksNoWhen true, each project carries a `_links` HATEOAS block (self, folder). Default false — the block is omitted to save payload size. Use the project's `id` and `folderId` fields directly instead.
maxOutputBytesNoCap the serialized byte size of the returned projects[] array. When the response would exceed this, the server returns as many whole projects as fit, sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and returns a pagination cursor that resumes at the first dropped project. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single project larger than the cap is still returned whole so pagination always advances.
reviewDueBeforeNoRestrict to projects whose next review date is strictly before this moment. ISO-8601 with offset (e.g. '2026-05-01T00:00:00-07:00'). Projects without a review interval are excluded.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description adds important behavioral context: 'Returns projects[] with pagination; safe to call repeatedly; no side effects.' This goes beyond the schema. However, it does not mention rate limits or authentication, which are typical concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short (three sentences plus two inline examples) and front-loaded with the purpose. Every sentence adds value, with no fluff. The examples are concise and illustrative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 10 parameters and no output schema, the description covers core functionality, safety, and pagination. It could be improved by noting that the cursor must respect filter consistency (already in schema but useful in description). Overall, it provides sufficient context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description lists some filters (folderId, status, flagged, reviewDueBefore) but does not add significant meaning beyond the schema's own detailed descriptions. The examples are helpful but not enough to raise the score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (List) and resource (projects), and explicitly distinguishes this tool from the sibling 'project_get' by specifying when not to use it. 'List projects in OmniFocus with optional filters' is specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use ('Use for queries across projects') and when not to ('Do NOT use for a known single project'), naming the alternative (project_get). Also mentions filters and provides examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_mark_reviewedA

Convenience alias for review_mark_reviewed — mark a single project as reviewed, setting lastReviewDate to now and advancing nextReviewDate. Use when you have a project id and want a single-call review operation. Do not use to list projects due for review; prefer review_list_due for that. Returns { id, name, lastReviewDate, nextReviewDate } — name is the project's display name (post-mutation lookup; null if the project has been deleted between write and read), and the dates echo back the new schedule so the agent can describe the result without a follow-up read. Side effects: writes to OmniFocus; sets syncPending = true. Example: project_mark_reviewed({ id: "prj123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to mark as reviewed.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects: writes to OmniFocus, sets syncPending = true. Notes that the return field 'name' may be null if the project was deleted between write and read. With no annotations provided, the description fully bears the burden and does so comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet thorough: front-loaded with purpose, then usage, return format, side effects, and example. No wasted words; every sentence serves a clear function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description fully documents the return shape. Covers purpose, usage, side effects, and example, making it complete for a simple one-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'id' is sufficiently described in the schema. The description adds value by reinforcing the context ('when you have a project id') and providing an example usage, justifying a score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it is a convenience alias for review_mark_reviewed, marks a single project as reviewed, and sets dates. Distinguishes itself from sibling tools like review_list_due and review_mark_reviewed by specifying its specific use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('when you have a project id and want a single-call review operation') and when not to use ('Do not use to list projects due for review'), providing a named alternative (review_list_due).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_moveA

Move an OmniFocus project to a different folder. Pass folderId to move into a folder, or null to move to the root (no folder). Use when reorganizing projects. Do not use to complete or drop a project. Returns { moved: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: changes the project's folder, sets meta.syncPending = true.Example: project_move({ id: "prj123", folderId: "fld456" }) Example: project_move({ id: "prj123", folderId: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to move.
folderIdYesTarget folder ID, or null to move to root.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses side effects ('changes the project's folder, sets meta.syncPending = true') and return value details (includes name for agent to describe change). Lacks error conditions or prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with multiple sentences, each adding value. It includes examples and front-loads the core purpose. No redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no output schema, the description covers purpose, parameters, side effects, and return value. It lacks error handling or permissions, but is complete enough for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description adds context about null folderId moving to root, but this is also in the schema. Examples demonstrate usage but don't add semantic meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Move an OmniFocus project to a different folder' with a specific verb and resource. It distinguishes from siblings like project_complete and project_drop by explicitly saying 'Do not use to complete or drop a project.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use ('Use when reorganizing projects') and when not to use ('Do not use to complete or drop a project'). Examples show correct invocation with folderId or null.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_move_describeA

Preview what project_move would do without making any changes. Do NOT use to actually move a project — use project_move instead. Returns { description, plannedChanges } describing the folder change that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to move.
folderIdYesTarget folder ID, or null to move to root.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It clearly states 'No side effects: read-only by contract — never mutates OmniFocus.' This fully discloses the read-only nature. It also describes the return value structure. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph of 4 sentences, each earning its place. It is front-loaded with the core purpose (Preview), then usage guidance, then behavior, then example workflow. No extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple dry-run nature, the description completely covers purpose, usage, behavior, constraints, and return value. No output schema exists, but it describes the return shape ({ description, plannedChanges }). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters (id, folderId). The description adds 'pass the same args you would to the write tool' as context but does not provide additional semantics beyond what the schema offers. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's verb ('Preview') and resource ('what project_move would do'). It explicitly distinguishes from the sibling tool 'project_move' by noting 'Do NOT use to actually move a project — use project_move instead.' The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance ('Preview what project_move would do') and when-not-to-use ('Do NOT use to actually move a project'). It includes a typical workflow: pass same args, inspect plannedChanges, then call the write tool. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_set_next_review_dateA

Set or reset a project's next review date directly. Use when the user wants to reschedule a review independent of the recurring interval — 'push the Q3 review to next Monday' without changing the cadence. Do NOT use to mark a project as reviewed (prefer review_mark_reviewed) or to change the recurring interval (prefer review_set_interval). Pass projectId and nextReviewDate (ISO-8601 with offset), or pass null for nextReviewDate to reset the date to the interval-derived schedule (last review date + review interval) — OmniFocus cannot leave a project unscheduled, so null does not clear the date. Past-dated values are accepted and surface the project as overdue immediately — matches OmniFocus's own UX. Returns { id, name, nextReviewDate } — name is the project's display name (post-mutation lookup; null if the project has been deleted), and nextReviewDate echoes back the project's new value (the recomputed schedule date when null was passed) so the agent can describe the change without a follow-up read. Errors: NOT_FOUND when projectId does not exist. Side effects: writes to OmniFocus; invalidates project + review caches; sets syncPending = true. Example: project_set_next_review_date({ projectId: "prj123", nextReviewDate: "2026-05-05T00:00:00-05:00" }) Example: project_set_next_review_date({ projectId: "prj123", nextReviewDate: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesPersistent ID of the project whose next review date should change.
nextReviewDateYesNext review date as ISO-8601 (with offset). Pass null to reset to the interval-derived schedule — OmniFocus recomputes the date from last review date + review interval and cannot leave a project unscheduled. Past-dated values are accepted and mark the project as overdue immediately.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description covers all behavioral traits: null resets to interval-derived schedule, past-dated values accepted and cause overdue, side effects (writes, cache invalidation, syncPending), errors (NOT_FOUND), and return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence adds value; front-loaded with action and usage. Slightly verbose in explaining null behavior and return details, but overall well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description details the return structure, errors, side effects, and includes examples. Fully complete for a 2-param mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). The description adds context for the null behavior of nextReviewDate and past-date acceptance, improving semantic understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Set or reset a project's next review date directly' and distinguishes from related tools like review_mark_reviewed and review_set_interval, providing a clear verb+resource+scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Includes explicit 'when to use' (reschedule independent of interval) and 'when not to use' (do not use for marking reviewed or changing interval) with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_template_deleteA

Delete a saved project template by name from the Templates folder. Returns { deleted: true, templateName } on success. Returns TemplateNotFoundError when no matching template exists — callers can distinguish 'deleted' from 'never existed'. Side effects: removes the template project; sets meta.syncPending = true. Do NOT use to delete ordinary projects — call project_delete. Example: { templateName: "Client onboarding" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateNameYesName of the template to delete. Matched case-insensitively within the Templates folder.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses return behavior (success object and TemplateNotFoundError), side effects (removes template, sets syncPending), and error distinction. It lacks details about undo or permanent deletion, but overall is highly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences front-loaded with purpose, followed by return, error, side effect, usage warning, and example. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers return value, error handling, side effects, and usage boundary. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already describes the parameter well (case-insensitive match, minLength). The description adds an example but no new semantic value beyond reinforcing the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (delete), resource (saved project template), and location (Templates folder). It distinguishes from the sibling tool project_delete with an explicit warning, ensuring the agent selects the correct tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-not-to-use guidance ('Do NOT use to delete ordinary projects — call project_delete') and includes an example, making it easy for the agent to decide when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_template_instantiateA

Spawn a new project from a saved template under the Templates folder. Substitutes {{name}} placeholders with the supplied parameters and shifts @due / @defer dates relative to the optional dueDate anchor (the earliest @due in the template). Do NOT use to copy a one-off project — prefer task_duplicate. Returns { projectId, taskCount, importWarnings }. Side effects: writes a new project + tasks; sets meta.syncPending = true. Example: { templateName: "Client onboarding", parameters: { client: "Acme" }, dueDate: "2026-06-04" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueDateNoAnchor for relative-date shifting. The earliest @due in the template becomes this date; every other @due/@defer shifts by the same delta.
parametersNoMap of placeholder name → substitution value.
templateNameYesSaved template to instantiate.
targetFolderIdNoFolder to create the new project in. Defaults to the library root.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description discloses side effects (writes new project, sets syncPending) and return value structure, going beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet comprehensive: front-loaded purpose, includes restrictions, behavior, return, and example. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers main purpose, side effects, return values, and parameter behavior. Lacks details on error cases or if no dueDate, but overall sufficient for a tool with 4 params and no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds significant meaning beyond schema: explains placeholder substitution, date shifting, and provides an example. Schema coverage is 100%, but description enriches understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Spawn a new project from a saved template' and distinguishes from sibling 'task_duplicate' by explicitly stating when not to use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-not-to-use guidance: 'Do NOT use to copy a one-off project — prefer task_duplicate.' Implies appropriate use for template-based instantiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_template_listA

List saved project templates under the Templates folder. Projects without a parseable template fence are skipped. Do NOT use to enumerate ordinary projects — call project_list. Returns { templates: [{ templateId, templateName, parameterNames, capturedAt }] }, sorted by capturedAt desc. Read-only; safe to retry. Example: call with no args; receives [] when no Templates folder exists yet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses read-only nature, safe to retry, return structure with fields, sorting order, and edge case (empty array when no Templates folder). No annotations provided, so description carries full burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences plus example, no wasted words. Purpose, exclusion, return format, and behavior are front-loaded and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with no annotations or output schema, the description covers purpose, behavior, return format, sorting, edge case, and provides an example. Fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; description adds value by explicitly stating 'call with no args' and giving an example. Schema coverage is trivially 100%, baseline 3; description provides helpful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states listing saved project templates, distinguishes from ordinary projects, and explains what counts (templates with parseable fence).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns not to use for ordinary projects and names the alternative tool (project_list). Clear when to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_template_saveA

Capture a project as a reusable template under the Templates folder (env OMNIFOCUS_TEMPLATES_FOLDER_NAME). Metadata is stored in a fenced YAML block at the top of the template-project note; TaskPaper body sits below. Do NOT use to duplicate a one-off project — prefer task_duplicate. Returns { templateId, templateName, capturedAt }. Side effects: writes folder + project; sets meta.syncPending = true. Example: { projectId: "p_001", templateName: "Client onboarding", parameterNames: ["client"] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesSource project to capture.
templateNameYesDisplay name; must be unique within the Templates folder.
parameterNamesNoOptional placeholder names for future _instantiate substitution.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return structure, side effects (writes folder+project, sets syncPending), and metadata format. Lacks explicit statement that original project is unmodified, but overall good coverage given no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences front-loaded with main action, followed by structure, guidance, return/side effects, and example. No fluff, every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers return value, side effects, folder location via env var, and example. Does not address templateName uniqueness enforcement or ID format, but given low complexity, it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description repeats schema descriptions for parameters but adds contextual example showing usage of templateName and parameterNames. No new semantic insight beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool captures a project as a reusable template, naming the folder location. It distinguishes from sibling task_duplicate, making the purpose specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs not to use for one-off duplication and directs to task_duplicate, providing clear when-to-use and when-not-to-use guidance. Implies appropriate context for template creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_updateA

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 })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent project ID. Get from project_list or project_get.
nameNoNew project name. Must be non-empty if supplied.
noteNoPlain-text note. Pass null to clear.
statusNoProject status. Use project_complete or project_drop to close a project. Accepts: 'paused' → on-hold.
tagIdsNoFull-replacement tag list. Replaces all existing tags.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
dueDateNoISO-8601 due date with UTC offset. Pass null to clear.
flaggedNoFlag or unflag the project.
noteHtmlNoHTML note. Pass null to clear. Prefer note for plain-text edits.
deferDateNoISO-8601 defer date with UTC offset. Pass null to clear.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency 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.
estimatedMinutesNoEstimated total duration in minutes. Pass null to clear.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
expectedModifiedAtNoOptimistic-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.
reviewIntervalDaysNoReview interval in days. Pass null to clear.
completionCriterionNoHow the project's tasks are completed. Accepts: 'in-order' → sequential, 'in order' → sequential, 'any-order' → parallel, 'any order' → parallel.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully covers behavioral traits: it details that only supplied fields are changed, null clears specific fields, side effects include writing to OmniFocus and setting meta.syncPending, and the return value includes updated status. It also explains concurrency guard via expectedModifiedAt and idempotency via idempotency_key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, starting with the main purpose, then clearing mechanism, usage restrictions, safety controls, return value, and examples. It is front-loaded with key information. While slightly long, every sentence contributes value; minor redundancy could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high parameter count (17) and no output schema, the description is thorough: it covers update mechanics, safety controls, side effects, return value structure, and references sibling tools for other operations. It also explains concurrency and idempotency, making the tool's behavior fully understandable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining how to clear fields (pass null), aliases for status ('paused' → on-hold), and preference for note over noteHtml. It also provides examples that clarify parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as 'Partially update mutable fields on an OmniFocus project' and distinguishes it from creation/deletion tools by explicitly stating 'Do NOT use to create or delete projects; prefer project_create or project_delete instead.' The verb 'update' combined with the resource 'project' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool (partial updates) and when not to (create/delete), with named alternatives. It also explains safety controls like dry_run and expectedModifiedAt, giving clear context for correct invocation in different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_update_describeA

Preview what project_update would do without making any changes. Do NOT use to actually update a project — use project_update instead. Returns { description, plannedChanges } showing the fields that would be patched. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent project ID. Get from project_list or project_get.
nameNoNew project name. Must be non-empty if supplied.
noteNoPlain-text note. Pass null to clear.
statusNoProject status. Use project_complete or project_drop to close a project. Accepts: 'paused' → on-hold.
tagIdsNoFull-replacement tag list. Replaces all existing tags.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
dueDateNoISO-8601 due date with UTC offset. Pass null to clear.
flaggedNoFlag or unflag the project.
noteHtmlNoHTML note. Pass null to clear. Prefer note for plain-text edits.
deferDateNoISO-8601 defer date with UTC offset. Pass null to clear.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency 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.
estimatedMinutesNoEstimated total duration in minutes. Pass null to clear.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
expectedModifiedAtNoOptimistic-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.
reviewIntervalDaysNoReview interval in days. Pass null to clear.
completionCriterionNoHow the project's tasks are completed. Accepts: 'in-order' → sequential, 'in order' → sequential, 'any-order' → parallel, 'any order' → parallel.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'No side effects: read-only by contract — never mutates OmniFocus.' It also describes the return shape ({ description, plannedChanges }) and that it is a dry-run companion. With no annotations provided, this fully discloses the behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three sentences, no wasted words. The main purpose is front-loaded in the first sentence, and subsequent sentences add necessary context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a preview tool with no output schema, the description describes the return shape explicitly. It also mentions the dry-run concept and the relationship to project_update, providing all needed context for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents all 17 parameters. The description does not add per-parameter meaning beyond saying to pass the same args as project_update. Baseline is 3, and no additional value is added for individual parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it previews what project_update would do without changes, distinguishing it from the actual update tool. It specifies the verb 'preview' and the resource 'project update', and contrasts with the sibling tool project_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Do NOT use to actually update a project — use project_update instead.' It also provides a usage pattern: pass args to inspect plannedChanges then call the write tool, giving clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

repetition_from_proseA

Deterministic prose-to-RepetitionRule helper. Pass a natural-language phrase ('every Monday', 'every 3 days', 'first Tuesday of every month') and receive a structured RepetitionRule plus a normalized description to confirm with the user. Returns one of three shapes: { kind: 'ok', rule, normalizedDescription } when the prose maps to one rule; { kind: 'ambiguous', interpretations[] } when prose admits multiple valid readings (typically 2-3) — agent picks one with the user; { kind: 'error', reason, suggestion? } for no-repetition-detected or unsupported-pattern. Supported patterns: daily/weekly/monthly/yearly, every-N-days/weeks/months/years, every weekday/weekend, every {Mon|Tue|...}, nth-weekday-of-month, nth-day-of-month, completion-relative phrasing ('after I complete it'). Time-of-day and end-conditions surface in normalizedDescription only — the canonical RepetitionRule schema doesn't carry those fields. Do NOT use this tool when the agent already has a structured RepetitionRule from another source — call task_set_repetition directly instead. Prefer this helper over ad-hoc LLM translation whenever the user's repetition phrasing is the only signal. No model calls; no side effects. Use with task_set_repetition or task_create. Example: repetition_from_prose({ prose: "every Monday" }) Example: repetition_from_prose({ prose: "every 3 days after I complete it" })

ParametersJSON Schema
NameRequiredDescriptionDefault
proseYesNatural-language phrase describing a repetition cadence. Examples: 'every Monday', 'every other Tuesday at 10am', 'first Thursday of every month after I complete it'.
anchorNoOptional date anchor — currently informational. The grammar reads time-of-day from prose into normalizedDescription; embedding it into a date is the agent's responsibility once it has anchor context.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'No model calls; no side effects' and explains the three return shapes (ok, ambiguous, error) and their implications. It also notes that time-of-day and end-conditions are only in normalizedDescription. However, it does not mention potential input length limits or exact format constraints, so it is slightly less than perfectly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then covers return shapes, supported patterns, usage guidelines, and examples. It is thorough but not overly verbose; every sentence adds value. It could be slightly more concise, but the structure is logical and easy to follow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description fully explains the three possible return shapes and their contents. It covers supported patterns, error cases, and provides usage context (with task_set_repetition or task_create). It also clarifies the anchor parameter's informational nature. The description is complete and leaves no major gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with both parameters having descriptions. The tool description adds significant value beyond the schema by providing examples for the prose parameter (e.g., 'every Monday', 'first Thursday of every month') and explaining the role of the anchor parameter as 'currently informational' and that embedding time-of-day is the agent's responsibility. This enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'Deterministic prose-to-RepetitionRule helper' and explains its function of converting natural-language phrases to structured rules. It distinguishes itself from sibling tools like task_set_repetition by explicitly stating when not to use it: 'Do NOT use this tool when the agent already has a structured RepetitionRule from another source.' This meets the highest standard of purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool: 'Prefer this helper over ad-hoc LLM translation whenever the user's repetition phrasing is the only signal.' It also specifies when to use an alternative: 'call task_set_repetition directly' if a structured rule already exists. This gives clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_list_dueA

List projects due for review in OmniFocus — those whose next review date is today or earlier, or has never been set. Only remaining projects (active or on-hold) are eligible; completed and dropped projects are never due — matches OmniFocus's Review perspective. Sorted by next review date ascending (overdue first, never-reviewed first). Do not use to get all projects; prefer project_list for that. Returns each project's id, name, nextReviewDate, lastReviewDate, and reviewIntervalDays. Safe to call repeatedly; no side effects, no writes. Example: review_list_due()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but the description explicitly states the tool has no side effects, is safe to call repeatedly, and returns a sorted list. It also describes the sorting order and return fields, adding behavioral context beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with four sentences that front-load the core purpose. Every sentence adds value: purpose, eligibility, sorting, distinction from sibling, return fields, and safety. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters, no output schema), the description fully covers what the tool does, what it returns, and when to use it. It includes eligibility, sorting, and return fields, making it complete for an effective tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema coverage is trivially 100%. The description adds no parameter-level detail but compensates by explaining the implicit filtering criteria (date conditions and project status). Baseline 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists projects due for review, specifying the resource (projects), action (list due), and condition (next review date today or earlier or never set). It also distinguishes itself from the sibling tool project_list by advising not to use it to get all projects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use (for due review projects) and explicitly advises against using it to get all projects, pointing to project_list as the alternative. However, it does not include further exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_mark_reviewedA

Mark a project as reviewed in OmniFocus — sets lastReviewDate to now and advances nextReviewDate by the project's review interval. Use this after completing a weekly review of a project. Do not use to change the review interval; prefer review_set_interval for that. Returns { id, name, lastReviewDate, nextReviewDate } — name is the project's display name (post-mutation lookup; null if the project has been deleted between write and read), and the dates echo back the new schedule so the agent can describe the result without a follow-up read. Side effects: writes to OmniFocus; sets syncPending = true. Example: review_mark_reviewed({ id: "prj123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to mark as reviewed.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description fully compensates by detailing side effects (writes to OmniFocus, sets syncPending = true) and potential edge cases (name being null if project deleted). The return shape is also specified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (~70 words) and well-structured: front-loaded purpose, usage guidelines, return info, side effects, and an example. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one parameter, no output schema, and no annotations, the description is remarkably complete. It covers purpose, usage, return values, side effects, and an example, making it self-contained for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description of the id parameter. The tool description adds an example usage, which provides context for how the parameter is used, slightly enhancing semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool marks a project as reviewed, setting lastReviewDate to now and advancing nextReviewDate by the review interval. It distinguishes itself from review_set_interval by explicitly noting it should not be used to change the interval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: use after completing a weekly review, and do not use to change the review interval, with a clear alternative (review_set_interval). This helps the agent decide when to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_set_intervalA

Set a project's review interval in OmniFocus — updates how many days between reviews. Use null to remove the recurring schedule. Do not use to mark a project as reviewed; prefer review_mark_reviewed for that. Returns { id, name, reviewIntervalDays } — name is the project's display name (post-mutation lookup; null if the project has been deleted), and reviewIntervalDays echoes back the new value (or null when cleared) so the agent can describe the change without a follow-up read. Side effects: writes to OmniFocus; sets syncPending = true. Example: review_set_interval({ id: "prj123", days: 7 }) Example: review_set_interval({ id: "prj123", days: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the project to update.
daysYesReview interval in days. Pass null to remove the recurring review schedule.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects (writes to OmniFocus, sets syncPending=true) and return value structure (id, name, reviewIntervalDays) with behavior notes (post-mutation lookup, null if deleted). Since no annotations exist, the description fully carries this burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise; 4-5 sentences with clear front-loading of purpose, then guidelines, return info, side effects, and examples. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Completely covers the tool's operation for a simple mutation with 2 params and no output schema. The return value explanation compensates for missing output schema, and side effects are disclosed. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. The description does not add significant meaning beyond the schema; it restates that days sets the interval and null removes it. No additional param-level details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'set' and resource 'project's review interval'. It explicitly distinguishes from the sibling tool 'review_mark_reviewed' by stating not to use it for marking a project as reviewed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and when-not-to-use guidance. It mentions using null to remove schedule and directs to prefer review_mark_reviewed for marking reviewed. Includes examples for both cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_queryA

Full-text search across OmniFocus task names and/or notes. Use for finding tasks by content when you don't know the ID. Supports optional filters (project, tags, flagged, completion status) and cursor pagination. Do NOT use when a known task ID is available (use task_get instead). Returns tasks[] with pagination; safe to call repeatedly; no side effects. Example: search_query({ q: "dentist" }) Example: search_query({ q: "report", projectId: "prj123", completed: "exclude" })

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query. Case-insensitive substring match. Empty string matches all tasks (useful with filters).
limitNoMax results per page (1..500). Default 50.
scopeNo'name' = search task names only; 'note' = search notes only; 'all' = both. Default 'all'.
cursorNoOpaque cursor from a previous search_query response. Must use identical filters — changing filters returns a ValidationError.
fieldsNoRestrict each returned task to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names are dropped silently and surface in meta.warnings.WARN_UNKNOWN_FIELDS. Allowed: name, note, noteHtml, projectId, parentId, tagIds, deferDate, deferDateFloating, dueDate, dueDateFloating, estimatedMinutes, flagged, completed, completedAt, dropped, droppedAt, available, blocked, sequential, completedByChildren, repetition, notifications, createdAt, modifiedAt, _links.
tagIdsNoRestrict to tasks carrying ALL of these tags. Get IDs from tag_list.
flaggedNotrue = flagged tasks only; false = unflagged only; omit = all.
completedNo'exclude' = active tasks only; 'only' = completed only; 'any' = both. Default 'exclude'.
projectIdNoRestrict to tasks in this project. Get the ID from project_list.
includeLinksNoWhen true, each task carries a `_links` HATEOAS block (self, project, parent, tags). Default false — the block is omitted to save payload size. Use the task's `id`, `projectId`, `parentId`, and `tagIds` fields directly instead.
maxOutputBytesNoCap the serialized byte size of the returned tasks[] array. When the response would exceed this, the server returns as many whole tasks as fit, sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and returns a pagination cursor that resumes at the first dropped task. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single task larger than the cap is still returned whole so pagination always advances.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares safety: 'safe to call repeatedly; no side effects.' Discloses cursor pagination constraint (must use identical filters). No annotations to contradict, but description adds behavioral context not in schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two main sentences plus two examples. Front-loaded with purpose. Every sentence adds value. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Explains return type (tasks[] with pagination), safety, and filter capabilities. Could mention meta fields from maxOutputBytes, but schema covers that. Good coverage for 11-parameter tool with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage, so baseline 3. Description adds value by summarizing filters ('project, tags, flagged, completion status'), explaining pagination cursor constraints, and giving examples. Slight improvement over schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear statement: 'Full-text search across OmniFocus task names and/or notes.' Verb 'search' + resource 'tasks' + scope. Distinguishes from sibling task_get by explicitly advising against use when ID is known.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when to use ('when you don't know the ID') and when not to ('Do NOT use when a known task ID is available'). Provides alternative (task_get). Examples show typical usage with filters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_statusA

Return the last OmniFocus sync state without triggering a new sync. Do NOT call this to initiate a sync — use sync_trigger instead. Use to check whether a previous sync completed before querying cross-device data. Returns { lastSyncAt, inFlight }. lastSyncAt is null if OmniFocus has never synced in this session. Read-only; no side effects. Example: sync_status()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description fully covers behavior: read-only, no side effects, returns lastSyncAt and inFlight, with note that lastSyncAt is null if never synced. Gives example usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: 3 sentences, front-loaded with main purpose, no wasted words. Every sentence provides essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Completely adequate for a zero-parameter tool with no output schema. Addresses common confusion with sync_trigger, explains output format, and provides usage context. No missing information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, baseline 4. Description adds value by specifying return fields (lastSyncAt, inFlight) beyond schema. Could hint at expected input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the last sync state without triggering a new sync, and distinguishes it from sync_trigger by explicitly naming the alternative. The verb 'return' and resource 'sync state' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says not to call this to initiate a sync and directs to use sync_trigger instead. Also explains when to use: to check whether a previous sync completed before querying cross-device data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_triggerA

Kick off an OmniFocus sync with Omni Sync Server. Do not call when no mutations have been made; prefer checking meta.syncPending first. Call this after any sequence of mutations (task_create, task_update, folder_create, etc.) when you need changes to appear on other devices. The sync starts immediately but completes asynchronously — this tool does not block until done. Returns meta.syncPending = false to confirm the sync was initiated. Side effects: triggers a sync request to Omni Sync Server. Example: sync_trigger()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It reveals asynchronous behavior ('starts immediately but completes asynchronously'), side effects ('triggers a sync request'), and return value ('Returns meta.syncPending = false'). Lacks details on error handling or concurrency if sync already pending, but overall transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences, front-loaded with purpose, followed by usage guidelines and behavioral details. No redundant words. Every sentence adds value. Example call included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description covers all necessary context: purpose, when to use/avoid, behavior (async, side effects), return value, and example. Differentiates from sync_status sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline is 4. The description adds no parametric detail, but none is needed. It focuses on behavior and usage, which is appropriate given zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action ('Kick off an OmniFocus sync') and resource ('Omni Sync Server'). It distinguishes from sibling tool sync_status by focusing on initiating sync, not checking status. The verb 'kick off' is specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('after any sequence of mutations when you need changes on other devices') and when not to use ('Do not call when no mutations have been made; prefer checking meta.syncPending first'). Provides clear alternatives and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_createA

Create a new tag in OmniFocus. Optionally nest it under an existing parent tag (get IDs from tag_list). Do not use to move an existing tag; prefer tag_move instead. Returns the new tag's persistent ID. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_create({ name: "errands" }) Example: tag_create({ name: "home", parentId: "tag123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTag name. Must be non-empty.
statusNoInitial status. Defaults to 'active'. Cannot create a tag in 'dropped' state. Accepts: 'paused' → on-hold.
parentIdNoParent tag ID to nest under. Omit for a root tag. Get from tag_list.
allowsNextActionNoWhether the tag allows next-action selection. Defaults to true.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes return value (persistent ID) and sync behavior. No annotation contradictions. Could mention idempotency but not required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five clear sentences with examples. Front-loaded purpose. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description covers return value, sync trigger, parent nesting, and provides examples. Complete for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions, and the description adds examples and notes on parentId usage, enhancing understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifically says 'Create a new tag in OmniFocus' and distinguishes from moving by advising 'Do not use to move an existing tag; prefer tag_move instead.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when not to use (moving) and provides alternative (tag_move). Also mentions getting parent IDs from tag_list and triggering sync.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_create_describeA

Preview what tag_create would do without making any changes. Do NOT use to actually create a tag — use tag_create instead. Returns { description, plannedChanges } describing the tag that would be created. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTag name. Must be non-empty.
statusNoInitial status. Defaults to 'active'. Cannot create a tag in 'dropped' state. Accepts: 'paused' → on-hold.
parentIdNoParent tag ID to nest under. Omit for a root tag. Get from tag_list.
allowsNextActionNoWhether the tag allows next-action selection. Defaults to true.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: it explicitly states 'no side effects: read-only by contract — never mutates OmniFocus' and describes the return shape as '{ description, plannedChanges }'. This is thorough transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with only three sentences, front-loading the core purpose. Every sentence adds value, and there is no redundancy or irrelevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (4 params, no output schema, no nested objects), the description is fully complete. It covers purpose, usage, behavior, and return value, leaving no ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds minor context by noting 'pass the same args you would to the write tool', but this doesn't significantly enhance parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as a dry-run preview for tag creation, using specific verbs like 'preview' and 'describe'. It explicitly distinguishes from 'tag_create' by stating 'Do NOT use to actually create a tag' and directing users to the sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance: use to preview planned changes, do not use to actually create. It also suggests a workflow: pass same args, inspect plannedChanges, then call the write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_deleteA

Hard-delete a tag from OmniFocus. IRREVERSIBLE — the tag and all its children are removed. Tasks that carried this tag lose it. Get the tag ID from tag_list. Prefer tag_set_status with status='dropped' to preserve history. Returns the deleted tag's ID on success. Side effects: writes to OmniFocus, sets meta.syncPending = true. Example: tag_delete({ id: "tag123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID to delete. Get from tag_list.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the transparency burden. It discloses irreversibility, deletion of children, removal from tasks, side effects (writes to OmniFocus, sets meta.syncPending), and return value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact (4 sentences) with key information front-loaded (irreversibility, action). Every sentence adds value without redundancy, including an example call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explains the return value (deleted tag ID) and side effects. It is comprehensive for a destructive tool given the context signals and sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter 'id,' and the description merely echoes the schema's note to get the ID from tag_list. No additional semantic meaning is added beyond the schema, meeting the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Hard-delete a tag from OmniFocus' with the verb 'hard-delete' and specifies the resource (tag). It distinguishes from the sibling tool 'tag_set_status' by noting its irreversibility and recommending the alternative for preserving history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Prefer tag_set_status with status='dropped' to preserve history' and instructs users to 'Get the tag ID from tag_list,' offering clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_delete_describeA

Preview what tag_delete would do without making any changes. Do NOT use to actually delete a tag — use tag_delete instead. Returns { description, plannedChanges } describing the permanent deletion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID to delete. Get from tag_list.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully discloses read-only nature, no side effects, never mutates OmniFocus. Contradictions: none.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no unnecessary words. Front-loaded with key purpose, then usage guidance, then return format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with 1 parameter, no output schema. Description explains return object structure and safety guarantees, sufficient for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 100%, description mentions passing same args as tag_delete but does not add new details beyond schema's own description of id parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it previews tag deletion, distinguishes from sibling tool tag_delete via explicit warning. Uses specific verb 'preview' and resource 'tag_delete'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs not to use for actual deletion, directs to tag_delete instead. Provides example workflow: pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_getA

Fetch a single tag by its persistent ID, including task count. Do not use to list multiple tags; prefer tag_list instead. Returns tag details; no side effects. Example: tag_get({ id: "tag123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list. IDs are stable across renames.
fieldsNoRestrict the returned tag to this list of top-level fields (id is always returned). Omit for the full tag shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
verboseNoWhen true, return the full unelided tag shape. Default: false — fields equal to their documented default are omitted. See docs/token-cost.md for the defaults table.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states 'Returns tag details; no side effects' and includes 'including task count.' This adequately discloses behavior for a simple read operation, though it lacks details on authorization or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus a brief example. Every part is essential: purpose, usage constraint, behavior, example. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool with no output schema, the description covers purpose, usage guidance, side effects, and provides an example. It is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters fully documented in the schema. The description adds only an example call, not significantly enhancing understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch a single tag by its persistent ID, including task count.' The verb 'fetch' and resource 'tag by ID' are specific, and it distinguishes itself from tag_list by warning not to use it for listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Do not use to list multiple tags; prefer tag_list instead,' providing a clear alternative and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_get_locationA

Get the geographic location trigger currently set on a tag, or null if none. Do not use to set or clear a location; prefer tag_set_location instead. Location-based tags are an OmniFocus Pro feature. Get the tag ID from tag_list. Returns { location } with name, radius, and trigger direction, or null if unset. Safe to call repeatedly; no side effects. Example: tag_get_location({ id: "tag123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description compensates fully by stating 'Safe to call repeatedly; no side effects.' and describes return value format including null case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured: purpose stated first, then usage guidance, then feature note, then return description, then example. No superfluous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only 1 required parameter and no output schema, the description covers all needed context: what it does, when to use, return format, and safe calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and baseline is 3, but description adds value by explaining where to get the ID ('Get the tag ID from tag_list') and includes an example call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Get the geographic location trigger currently set on a tag, or null if none.' Uses specific verb and resource, and distinguishes from sibling tool 'tag_set_location'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Do not use to set or clear a location; prefer tag_set_location instead.' Also provides prerequisite: 'Get the tag ID from tag_list.' And notes feature availability: 'OmniFocus Pro feature.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_get_manyA

Fetch up to 100 tags by persistent ID in a single OmniFocus round-trip. Use when you have a set of tag IDs and need full tag objects for all of them. Do NOT use for a single ID — use tag_get instead. Returns Tag[] in input order. Missing IDs are omitted and appear in meta.warnings. Read-only; safe to retry. Example: tag_get_many({ ids: ["tag123", "tag456"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of tag IDs to fetch (0..100). Get IDs from tag_list. Missing IDs are omitted (not errors) and appear in meta.warnings.
fieldsNoRestrict each returned tag to this list of top-level fields (id is always returned). Omit for the full tag shape. Empty array returns just id. Unknown names are dropped silently and surface in meta.warnings.WARN_UNKNOWN_FIELDS. Allowed: name, parentId, status, location, allowsNextAction, taskCount, createdAt, modifiedAt.
maxOutputBytesNoCap the serialized byte size of the returned tags[] array. When the response would exceed this, the server returns as many whole tags as fit (in input order), sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and lists the trimmed ids in meta.warnings.WARN_RESULT_TRUNCATED details.droppedIds — re-request those in a smaller batch or with a higher cap. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single tag larger than the cap is still returned whole so the batch always makes progress.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes missing ID handling, read-only nature, safety to retry, and max limit, fully disclosing behavioral traits despite no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise paragraph with front-loaded purpose and efficient sentences covering all critical aspects without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete description covering input, behavior, edge cases, and return format for a 3-parameter tool with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds context beyond schema with example, ordering, and explanations for all three parameters, despite 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly specifies 'Fetch up to 100 tags by persistent ID' and distinguishes from tag_get, giving specific verb and resource with differentiation from sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (set of IDs needing full objects) and when not to (single ID, use tag_get instead), providing clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_listA

List all tags in OmniFocus, optionally filtered by parent tag or status. Do not use to fetch a single tag by ID; prefer tag_get instead. Returns a flat array — use parentId to walk the hierarchy one level at a time. Safe to call repeatedly; no side effects. Example: tag_list({}) Example: tag_list({ status: "active", parentId: "tag123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoRestrict each returned tag to this list of top-level fields (id is always returned). Omit for the full tag shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
statusNoFilter by tag status. Omit to return tags of all statuses. Accepts: 'paused' → on-hold, 'cancelled' → dropped, 'archived' → dropped.
verboseNoWhen true, return the full unelided tag shape. Default: false — fields equal to their documented default (status: 'active', parentId: null, location: null, allowsNextAction: true) are omitted. See docs/token-cost.md for the defaults table.
parentIdNoReturn only direct children of this tag. Get the ID from a previous tag_list call. Omit for root tags.
maxOutputBytesNoCap the serialized byte size of the returned tags[] array. When the response would exceed this, the server returns as many whole tags as fit, sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and lists the trimmed ids in meta.warnings.WARN_RESULT_TRUNCATED details.droppedIds — narrow with parentId/status, fetch those ids via tag_get_many, or raise the cap. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single tag larger than the cap is still returned whole so the response always makes progress.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but description covers safety ('no side effects','safe to call repeatedly') and return structure (flat array, truncation with maxOutputBytes). Lacks explicit read-only label but is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise at 5 sentences, well-structured with primary purpose first, then guidelines, then examples. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with no output schema, description explains return format (flat array) and key behaviors (truncation, hierarchy walking). Covers complexity of 5 parameters effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, description adds value beyond schema: explains verbose vs fields, gives examples, details maxOutputBytes truncation mechanism. Above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List all tags in OmniFocus' with filtering options, distinguishing from siblings like tag_get (single tag) and search tools. Verb and resource are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says do not use for single tag; prefer tag_get. Gives guidance on walking hierarchy with parentId and includes examples. Clear when-to-use and when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_moveA

Move a tag to a new parent, or promote it to a root tag by passing parentId=null. Do not use to rename a tag; prefer tag_update instead. Get tag IDs from tag_list. Returns the updated tag's ID and new parentId on success. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_move({ id: "tag123", parentId: "tag456" }) Example: tag_move({ id: "tag123", parentId: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the tag to move. Get from tag_list.
parentIdYesNew parent tag ID, or null to promote the tag to root level.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return values (updated tag's ID and new parentId), sync triggering, and promotion behavior. No annotations to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with no extraneous information. Front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully covers input, behavior, output, and side effects for a simple move operation. No missing pieces given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds context beyond schema: id from tag_list, parentId null for promotion, and examples. Schema coverage is 100% but description enriches it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Move a tag to a new parent, or promote it to a root tag' and contrasts with rename. Includes examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (move/promote) and when not (rename), recommends tag_update, and tells to get IDs from tag_list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_move_describeA

Preview what tag_move would do without making any changes. Do NOT use to actually move a tag — use tag_move instead. Returns { description, plannedChanges } describing the reparenting that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the tag to move. Get from tag_list.
parentIdYesNew parent tag ID, or null to promote the tag to root level.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully discloses behavior: 'No side effects: read-only by contract — never mutates OmniFocus.' Also describes return value structure { description, plannedChanges }.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with 5 sentences; each adds value. Could be slightly tighter, but well-structured and front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description explains return value shape. Covers dry-run pattern, safety, and usage flow comprehensively for a 2-param preview tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters. Description adds context about passing same args as write tool, but doesn't elaborate beyond schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Preview what tag_move would do without making any changes.' Distinguishes from sibling tool tag_move by specifying not to use for actual moves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Do NOT use to actually move a tag — use tag_move instead.' Provides example usage: pass same args as write tool, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_set_allows_next_actionA

Enable or disable next-action selection for a tag in OmniFocus. When true, tasks with this tag are eligible for next-action promotion. Do not use to change other tag properties; prefer tag_update instead. Get the tag ID from tag_list. Returns the updated tag with allowsNextAction confirmed. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_set_allows_next_action({ id: "tag123", allowsNextAction: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.
allowsNextActionYestrue to enable next-action selection; false to disable.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explains the effect of the boolean, mentions return of updated tag with confirmation, and triggers a sync. Could mention error conditions or permissions, but overall sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences plus an example. Front-loaded with purpose. No fluff, each sentence adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description mentions return value. It covers the operation flow (get ID, call tool, sync trigger). Complete context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage with clear descriptions, but description adds context for id (from tag_list) and explains the boolean purpose. Good additional value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it enables or disables next-action selection for a tag, which is a specific and unique operation. It distinguishes from sibling tool 'tag_update' by explicitly saying not to use this for other properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when to use (next-action selection), when not to use (other properties, prefer tag_update), prerequisite (get tag ID from tag_list), and follow-up action (call sync_trigger after).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_set_locationA

Set a geographic location trigger on a tag (OmniFocus Pro only). The trigger fires when entering, leaving, or both for the specified radius. Do not use to read the current location; prefer tag_get_location instead. Get the tag ID from tag_list. Returns FeatureRequiresPro on OmniFocus Standard installs. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_set_location({ id: "tag123", latitude: 37.785, longitude: -122.407, radiusMeters: 200, trigger: "entering", name: "Office" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.
nameNoOptional human-readable name for the location (e.g. 'Home', 'Office').
triggerYesWhen to trigger: 'entering', 'leaving', or 'both'.
latitudeYesLatitude in decimal degrees (−90 to 90).
longitudeYesLongitude in decimal degrees (−180 to 180).
radiusMetersYesTrigger radius in metres. Must be ≥ 0.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the burden. It discloses the tool modifies state, is Pro-only, triggers sync, and provides an example. However, it does not explicitly state whether it overwrites an existing location trigger or how to remove one, which is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one paragraph of 5 sentences plus an example. It is front-loaded with the core purpose, concise, and contains no fluff. Every sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, 5 required, no output schema, and no annotations, the description covers purpose, alternatives, side effects, error condition, and includes an example. It does not mention how to clear a location trigger, but overall it is fairly complete for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, baseline is 3. The description restates schema info for each parameter (id, name, trigger, latitude, longitude, radiusMeters) without adding significant new meaning. The example call adds clarity but does not compensate beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Set a geographic location trigger on a tag' with specific verb and resource. It distinguishes from sibling tag_get_location by explicitly saying 'Do not use to read the current location; prefer tag_get_location instead'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use (to set a trigger), when-not-to-use (to read location), alternatives (tag_get_location), prerequisites (get tag ID from tag_list), and side effects (triggers sync, should call sync_trigger). It also warns about OmniFocus Pro requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_set_statusA

Set the lifecycle status of a tag to active, on-hold, or dropped. Dropped tags are hidden in OmniFocus but not deleted. Do not use to permanently remove a tag; prefer tag_delete instead. Get the tag ID from tag_list. Returns the updated tag with the confirmed status. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_set_status({ id: "tag123", status: "on-hold" }) Example: tag_set_status({ id: "tag123", status: "active" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.
statusNoNew lifecycle status for the tag. Accepts: 'paused' → on-hold, 'cancelled' → dropped, 'archived' → dropped.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: dropped tags are hidden not deleted, returns updated tag, triggers sync, and accepts synonym values for status. No contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet comprehensive: purpose stated first, followed by important notes, examples, and related tool references. Every sentence serves a purpose, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description explains return value and sync behavior. Covers prerequisites (ID from tag_list), alternatives (tag_delete), and post-action steps, making it fully self-contained for a focused tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already covers both parameters with descriptions. The description adds synonym mapping for status and usage examples, but overall value beyond schema is moderate. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it sets lifecycle status of a tag to active, on-hold, or dropped. Distinguishes from tag_delete by noting dropped tags are hidden, not deleted, and explicitly recommends using tag_delete for permanent removal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-not-to-use (prefer tag_delete), directs to get ID from tag_list, includes examples, and mentions post-action sync trigger with recommendation to call sync_trigger, offering thorough guidance on usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_updateA

Update mutable fields on an existing tag (partial patch). Only supplied fields are changed; omit a field to leave it unchanged. Do not use to move a tag to a different parent; prefer tag_move instead. Get the tag ID from tag_list. Returns the updated tag on success. Triggers a sync; call sync_trigger after to propagate to other devices. Example: tag_update({ id: "tag123", name: "shopping" }) Example: tag_update({ id: "tag123", status: "dropped" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.
nameNoNew tag name. Must be non-empty if supplied.
statusNoNew lifecycle status. Accepts: 'paused' → on-hold, 'cancelled' → dropped, 'archived' → dropped.
parentIdNoNew parent tag ID. Pass null to promote to root. Get from tag_list.
allowsNextActionNoWhether the tag allows next-action selection in OmniFocus.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states that only supplied fields are changed (partial patch), that it returns the updated tag on success, and that it triggers a sync, advising to call 'sync_trigger' afterward. These are important behavioral traits. However, it does not explicitly mention any authorization requirements, rate limits, or potential side effects beyond the sync. Still, the information is sufficient for safe and correct invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (7 sentences) and well front-loaded. The first sentence states the purpose, the second clarifies the patch behavior, and the third immediately distinguishes from sibling tools. Examples are placed at the end, which is appropriate. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters (1 required), no output schema, and moderate complexity, the description is complete. It covers the update behavior, the return value, the sync side effect, and prerequisites (get ID from tag_list). No important behavioral aspect is missing. The examples cover two common use cases (name change and status change).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all 5 parameters (100% coverage), providing baseline of 3. The description adds extra semantic value for several parameters: for 'id', it says 'Get from tag_list'; for 'status', it lists alias mappings (paused → on-hold, etc.); for 'parentId', it explains that passing null promotes to root and to get valid IDs from tag_list. These additions help the agent understand the domain-specific meanings beyond schema constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Update mutable fields on an existing tag (partial patch).' It specifies the resource (tag) and the verb (update). It distinguishes itself from sibling tool 'tag_move' by explicitly stating not to use it for moving a tag to a different parent, and instead recommends 'tag_move'. This provides clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Update mutable fields on an existing tag.' It also gives clear when-not-to-use guidance: 'Do not use to move a tag to a different parent; prefer tag_move instead.' Additionally, it mentions the alternative tool by name and instructs the user to get the tag ID from 'tag_list' and to call 'sync_trigger' after the update. Examples further illustrate proper usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_update_describeA

Preview what tag_update would do without making any changes. Do NOT use to actually update a tag — use tag_update instead. Returns { description, plannedChanges } showing the fields that would be patched. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent tag ID. Get from tag_list.
nameNoNew tag name. Must be non-empty if supplied.
statusNoNew lifecycle status. Accepts: 'paused' → on-hold, 'cancelled' → dropped, 'archived' → dropped.
parentIdNoNew parent tag ID. Pass null to promote to root. Get from tag_list.
allowsNextActionNoWhether the tag allows next-action selection in OmniFocus.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares read-only nature: 'No side effects: read-only by contract — never mutates OmniFocus.' No annotations provided, so description carries burden. Could mention error behavior (e.g., invalid id), but key behavioral trait is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each serving a distinct purpose: purpose, warning, return, safety, example. No superfluous text, well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description explains return format (description, plannedChanges). Covers purpose, usage, safety, and example. Completely adequate for a dry-run tool with full schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description does not add new parameter information beyond what schema provides; it only references 'same args' generically.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states 'Preview what tag_update would do without making any changes.' Clearly distinguishes from tag_update by warning not to use for actual updates. Indicates return structure (description, plannedChanges).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (preview) and when-not-to-use (actual update) with alternative named (tag_update). Includes a usage example: 'pass the same args... then call the write tool once approved.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_assignA

Apply inbox-triage style assignments to many tasks in one batch — move to a project, diff tags additively, set defer/due/flagged. Tighter schema than task_batch_update; designed for the inbox-triage prompt's confirm step. Each assignment is { taskId, projectId?, addTagIds?, removeTagIds?, deferDate?, dueDate?, flagged? }. Tag diffs are resolved via a pre-read of current tagIds; specifying both addTagIds and removeTagIds for the same tag is a no-op (remove wins). Atomicity: best-effort, per-item — OF has no transactional batch. An item succeeds only if both its move (if requested) AND its non-move update succeed. Failures are reported with errorCode prefixed 'move:' or 'update:'. Returns { assigned: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each assignment without a follow-up read. Do NOT use this tool for full task replacement — use task_update or task_batch_update for those. Prefer task_batch_assign over a sequence of single task_update calls when you have a confirmed triage plan for multiple tasks. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_assign({ assignments: [{ taskId: "abc123", projectId: "prj456", flagged: true }, { taskId: "abc789", addTagIds: ["tag1"] }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
assignmentsYesTriage assignments — one per task. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description thoroughly covers behavioral traits: atomicity (best-effort per-item), success conditions, failure reporting with prefixes, return format, side effects (writes to OmniFocus, syncPending), and tag diff resolution logic. This compensates fully for the lack of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured front-loading the primary purpose, then schema details, behavioral notes, and example. Every sentence provides necessary information without redundancy, making it efficient for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the return format (assigned and failed arrays with detailed components), side effects, and idempotency handling. It includes an example and covers all aspects needed for correct invocation, leaving no significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage with descriptions, so baseline is 3. The description adds value by explaining the interaction between addTagIds and removeTagIds (remove wins, no-op for same tag) and the overall batch behavior, which is not captured in the schema. This additional context justifies a score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool applies inbox-triage style assignments to many tasks in one batch, specifying the actions (move to project, diff tags, set defer/due/flagged). It distinguishes from sibling task_batch_update by noting a tighter schema and designated use for the inbox-triage prompt's confirm step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use and when-not-to-use: 'Do NOT use this tool for full task replacement — use task_update or task_batch_update for those. Prefer task_batch_assign over a sequence of single task_update calls when you have a confirmed triage plan.' Also mentions it is designed for the inbox-triage confirm step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_completeA

Mark many OmniFocus tasks complete in a single JXA round trip. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each completion succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_complete calls whenever you are completing more than one task. Each item is { id, at? } where at is an optional ISO-8601 completion timestamp (defaults to now). Already-completed tasks are not treated specially here — use task_complete's idempotent noChange path if you need that per-item semantics. Returns { completed: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each completion without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_complete({ items: [{ id: "abc123" }, { id: "abc456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id, at? } items. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses atomic validation (whole batch rejected on any schema failure), best-effort execution (per-index success/failure), response format with per-index outcomes, side effects (writes to OmniFocus, sets meta.syncPending), and need to call sync_trigger for cross-device propagation. No annotations exist, so description fully handles transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Approximately 120 words, front-loaded with purpose, each sentence adds necessary detail without redundancy. Structure flows logically: purpose, validation, execution, preference guidance, parameter format, contrast with sibling, return format, side effects, example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description fully explains return structure with completed/failed arrays, and the value includes task name to avoid follow-up reads. Covers validation atomicity, execution best-effort, side effects, and sync dependency. Complete for a batch mutation tool with no annotations or output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by explaining the items structure with 'at' as optional ISO-8601 timestamp defaulting to now, and provides a concrete example. The idempotency_key parameter is less elaborated but schema covers it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool marks many tasks complete in a single round trip, distinguishing it from repeated single-task completions. The verb 'mark complete' and resource 'tasks' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises to prefer this tool over repeated task_complete calls for multiple tasks. Also contrasts with task_complete for idempotent handling of already-completed tasks, providing clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_createA

Create many OmniFocus tasks in a single JXA round trip. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: once the batch reaches OmniFocus, each task succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_create calls whenever you are creating more than one task. Each item accepts the same shape as task_create (name, optional projectId or parentTaskId, note, flagged, dueDate, deferDate, estimatedMinutes, tagIds, sequential, completedByChildren). Pass idempotency_key to coalesce retries — without one, replaying a half-applied batch duplicates the applied subset. Returns { created: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name (echoed from the input) so the agent can describe each new task without a follow-up read. Side effects: creates tasks in OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the tasks to appear on other devices. Example: task_batch_create({ items: [{ name: "Buy milk" }, { name: "Call dentist", projectId: "prj123" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of task inputs. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It details atomic validation, best-effort execution, per-index outcomes, side effects (creates tasks, sets meta.syncPending = true), and idempotency key behavior. Agent gains a clear understanding of what happens during and after invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with key points front-loaded: purpose, key behaviors, usage advice, parameter summary, return format, side effects. It is slightly lengthy but every sentence contributes value. Could be trimmed by a couple of words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (batch creation with validation, best-effort, idempotency, side effects), the description covers all essential aspects: what it does, when to use, behavioral details, return format, and side effects. No output schema exists, so the return format description is crucial and well-provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions on all parameters. The description adds context beyond the schema by explaining batch behavior (atomic validation, best-effort), idempotency_key purpose, and the return shape. However, it does not elaborate on individual parameters beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create many OmniFocus tasks in a single JXA round trip.' It distinguishes itself from sibling tools by specifically recommending this tool over repeated task_create calls for multiple tasks. The verb 'create' and resource 'tasks' are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when to use this tool: 'Prefer this tool over repeated task_create calls whenever you are creating more than one task.' It also covers idempotency key usage for retries. It does not explicitly state when not to use (e.g., for a single task), but that is implied by the sibling tool task_create being preferred for single tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_create_describeA

Preview what task_batch_create would do without making any changes. Do NOT use to actually create tasks — use task_batch_create instead. Returns { description, plannedChanges } summarising all tasks that would be created. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of task inputs. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Explicitly declares no side effects, read-only by contract, never mutates OmniFocus. Also describes return value shape { description, plannedChanges }.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus an example; front-loaded with purpose and guidance. Every sentence earns its place with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple dry-run tool with 2 params and no output schema, the description covers all needed: return value, safety, workflow, and idempotency key in schema. Completely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions; description does not add extra parameter info. Baseline 3 is appropriate as description focuses on tool purpose rather than parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it previews what task_batch_create would do without changes, using specific verb 'preview' and resource 'task batch creation'. It distinguishes from sibling by warning not to create tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when NOT to use (actual creation) and provides alternative (task_batch_create). Gives clear workflow: pass same args, inspect plannedChanges, then call write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_defer_smartA

Batch variant of task_defer_smart: accepts an array of { taskId, intent } and resolves each intent independently. Same intent grammar as task_defer_smart. Do NOT use this for a single task — prefer task_defer_smart for one entry. Returns { results: [{ taskId, ok: true, resolvedDeferDate, reason } | { taskId, ok: false, error }] } — per-entry failures surface inline so one malformed entry does not abort the others. Side effects: writes the resolved deferDate to each successful task; dry_run skips writes. Triggers a sync when any entry succeeds. Example: task_batch_defer_smart({ entries: [{ taskId: '...', intent: { kind: 'next-work-day' } }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoWhen true, resolves every intent but does NOT write to OmniFocus. Useful for previewing the batch's resolved dates before committing.
entriesYesArray of { taskId, intent } pairs. Per-entry failures surface in the results array; one bad entry does not abort siblings.
idempotency_keyNoIdempotency key. Identical subsequent calls within the TTL window replay the original results envelope with meta.idempotentReplay = true.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects: writes deferDate, dry_run skips writes, triggers sync on success, per-entry failures do not abort others. With no annotations, description fully covers behavioral expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise two sentences plus example. Front-loaded: declares batch variant, array input, independent resolution. Usage guidance, return format, side effects, and example are succinctly included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return format, error handling, side effects, and dry run. Lacks explicit mention of idempotency key behavior, but schema covers it. Adequate given complexity and no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). Description adds meaning for 'entries' (per-entry failures inline) and 'dry_run'. Does not mention 'idempotency_key', but schema already describes it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies as batch variant of task_defer_smart with specific verb 'accepts an array of { taskId, intent } and resolves each intent independently'. Distinguishes from sibling task_defer_smart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when NOT to use ('Do NOT use this for a single task — prefer task_defer_smart') and explains when to use (batch of multiple tasks). Covers triggers and dry run behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_deleteA

Permanently delete many OmniFocus tasks in a single JXA round trip. IRREVERSIBLE — deleted tasks cannot be recovered. REQUIRED: pass confirm=true at the top level to acknowledge this action is irreversible; the entire batch is rejected without it. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each deletion succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_delete calls whenever deleting more than one task. Each item is { id }. Returns { deleted: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name (captured pre-delete) so the agent can describe each removal without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_delete({ confirm: true, items: [{ id: "abc123" }, { id: "abc456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.
confirmYesExplicit acknowledgement that all deletions are permanent and irreversible. Must be exactly true. The entire batch is rejected if this field is absent or false.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses irreversibility ('IRREVERSIBLE'), the confirm guard, atomic validation, best-effort execution, side effects (writes, syncPending), and return format. It provides complete behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then warnings, behavior, guidance, return format, side effects, example. Every sentence is informative. Slightly lengthy but not repetitive, earning a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a batch delete tool, the description covers all necessary aspects: when to use, prerequisites, behavior (atomic validation, best-effort), return format (including task name for agent to describe), side effects, and sync guidance. It is complete for an agent to invoke correctly without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by reinforcing the confirm requirement, explaining the best-effort semantics per item, describing the return structure with captured task name, and giving an example. This goes beyond the schema, justifying a score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Permanently delete many OmniFocus tasks in a single JXA round trip.' It also distinguishes from sibling tool 'task_delete' by explicitly stating preference for batch use when deleting more than one task.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Prefer this tool over repeated task_delete calls whenever deleting more than one task.' It also sets prerequisites (confirm=true), explains validation atomicity and best-effort execution, and mentions side effects with sync trigger recommendation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_dropA

Cancel (drop) many OmniFocus tasks in a single JXA round trip. Dropped tasks remain in OmniFocus but are treated as cancelled/inactive — they do not appear in active task lists. Use task_batch_delete for permanent removal. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each drop succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_drop calls whenever dropping more than one task. Each item is { id }. Returns { dropped: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each drop without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_drop({ items: [{ id: "abc123" }, { id: "abc456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, description fully discloses atomic validation, best-effort execution, per-index outcomes, side effects (writes to OmniFocus, sets syncPending), return format with task names, and need to call sync_trigger for cross-device changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single paragraph with front-loaded purpose, then details. No redundant words. Each sentence adds new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema or annotations, description provides complete picture: purpose, behavior, return format, side effects, example. Sufficient for agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters fully (100% coverage). Description adds value by explaining idempotency key behavior (replays within TTL return cached envelope) beyond schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it cancels (drops) many OmniFocus tasks in a single JXA round trip. Distinguishes from sibling tools like task_batch_delete and task_drop by specifying batch nature and permanence difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises to prefer this over repeated task_drop calls when dropping more than one task, and clarifies to use task_batch_delete for permanent removal. Also explains atomic validation and best-effort execution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_moveA

Move many OmniFocus tasks to new destinations in a single OmniJS round trip. Routes through OmniJS — not JXA — because JXA task.move() is unimplemented in OmniFocus 4.x. Each item specifies a task ID and exactly one destination: projectId (move into a project) or parentId (move under a parent task). Omit both to move to the inbox. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each move succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_move calls whenever moving more than one task. Returns { moved: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each move without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_move({ items: [{ id: "abc123", projectId: "prj456" }, { id: "abc789", parentId: "tsk111" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id, destination } items. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses atomic validation, best-effort execution, side effects (writes, syncPending), need for sync_trigger, and return format. Fully transparent about mutation behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with core purpose; each sentence adds value. Could be slightly more concise (e.g., combine some sentences), but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 2 well-documented parameters, no output schema (but description explains return format), and batch complexity, the description covers behavior, side effects, alternatives, and examples completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description adds meaning beyond schema: explains OmniJS context, mutual exclusivity of projectId/parentId, and behavior when both omitted (inbox). Includes an example, adding value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb+resource ('Move many OmniFocus tasks') and distinguishes from sibling 'task_move' by noting it's a batch operation and mentions the underlying technology (OmniJS vs JXA), clearly differentiating from repeated single-task calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to prefer this tool ('over repeated task_move calls whenever moving more than one task'). Provides constraints on destination fields and validation behavior, but does not explicitly list when NOT to use it (e.g., if only one task).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_uncompleteA

Mark many OmniFocus tasks as incomplete in a single JXA round trip. Reverses a previous completion — useful when a task was completed by mistake or needs to be re-done. Uncompleted tasks return to active status. Use task_batch_complete to mark tasks as completed. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each uncomplete succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_uncomplete calls whenever uncompleting more than one task. Each item is { id }. Returns { uncompleted: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each restoration without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_uncomplete({ items: [{ id: "abc123" }, { id: "abc456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explains atomic validation, best-effort execution with per-index outcomes, side effects (writes to OmniFocus, sets syncPending), and return format. Lacks mention of authentication or rate limits, but sufficient for most use cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and front-loaded with purpose. Every sentence adds value: purpose, use case, behavior, return format, side effects, example. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description fully documents return values with structure and purpose (task name for agent usage). Covers validation, execution model, side effects, and sync dependency. Complete for agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description adds minimal extra meaning beyond schema (example, mentions { id } each item), but does not elaborate on idempotency_key usage or pattern beyond schema. Adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly defines verb ('Mark many OmniFocus tasks as incomplete'), resource ('OmniFocus tasks'), and scope ('batch'). Distinguishes from sibling tools like task_batch_complete and task_uncomplete by emphasizing batch nature and reversal of completion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit preference over repeated task_uncomplete for batches, and explains atomic validation and best-effort execution. Could be more explicit about when to use task_uncomplete for single tasks, but context is clear from siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_undropA

Restore (undrop) many cancelled OmniFocus tasks in a single JXA round trip. Undropped tasks are returned to active status and will reappear in active task lists. Use task_batch_drop to cancel tasks. Validation is atomic: if any input fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each undrop succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_undrop calls whenever undropping more than one task. Each item is { id }. Returns { undropped: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — value carries the task name so the agent can describe each restoration without a follow-up read. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_undrop({ items: [{ id: "abc123" }, { id: "abc456" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id } items. Must contain at least one item.
idempotency_keyNoIdempotency key for retry-safe batches. Replays within the TTL window return the cached envelope with meta.idempotentReplay = true. See docs/idempotency.md.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: validation is atomic (rejects whole batch on any schema failure), execution is best-effort (per-index outcomes), side effects (writes to OmniFocus, sets syncPending), idempotency key behavior, and return format with per-index results including task names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. Every sentence adds value, covering purpose, behavior, alternatives, response format, side effects, and an example. There is no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description comprehensively explains the return format, side effects, and idempotency. The batch mutation tool has 2 parameters and is fully documented. The description leaves no gaps for an agent to understand its usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema, such as explaining the batch behavior, per-index outcome reporting, and idempotency key usage. It enhances understanding of how the parameters operate in practice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'restore' and resource 'many cancelled OmniFocus tasks' and distinguishes from sibling tools like task_batch_drop and task_undrop. It explicitly says 'Use task_batch_drop to cancel tasks' and 'Prefer this tool over repeated task_undrop calls whenever undropping more than one task.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool (for multiple undrops) and mentions the alternative (task_undrop). It also describes validation atomicity and best-effort execution, which helps the agent understand behavior. However, it does not explicitly state when not to use this tool or list other alternatives beyond undrop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_updateA

Partially update many OmniFocus tasks in a single JXA round trip. Validation is atomic: if any patch fails schema, the whole batch is rejected before any mutation. Execution is best-effort: each update succeeds or fails independently, and the response reports per-index outcomes. Prefer this tool over repeated task_update calls whenever you are updating more than one task. Each item is { id, patch } where patch accepts a subset of task_update's editable fields (name, note, flagged, dueDate, deferDate, estimatedMinutes, tagIds, sequential, completedByChildren). Additive tag diffs (addTags/removeTags) and safety primitives (dry_run, expectedModifiedAt, idempotency_key) are not supported in batch form; fall back to task_update for those. Returns { updated: [{index, value: { id, name }}], failed: [{index, errorCode, message}] } — name reflects the post-patch name (uses patch.name when supplied, otherwise the existing name). Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_batch_update({ items: [{ id: "abc123", patch: { flagged: true } }, { id: "abc456", patch: { dueDate: "2026-05-01T00:00:00Z" } }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id, patch } pairs. Must contain at least one item.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: atomic validation, best-effort execution, per-index outcomes, side effects (writes to OmniFocus, sets meta.syncPending), and return format. It also explains the failure modes and suggests calling sync_trigger for device sync.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and concise. It front-loads the core purpose, uses bullet-like sentences, and includes every piece of essential information (validation, execution, alternatives, unsupported features, return format, side effects, example) without waste. Each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a batch update tool with a nested parameter and no output schema, the description covers all necessary aspects: input format, validation model, execution semantics, unsupported fields, return structure, side effects, and integration with sibling tools. It is complete and self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by listing the supported fields in patch, explicitly stating what is not supported (addTags, removeTags, etc.), and providing a concrete example. This goes beyond the schema's descriptions and helps the agent understand the relationship to task_update.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb+resource: 'Partially update many OmniFocus tasks in a single JXA round trip.' It clearly distinguishes from siblings like task_update by stating 'Prefer this tool over repeated task_update calls whenever you are updating more than one task.' The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool (for updating more than one task) and when not to use it (fall back to task_update for additive tag diffs and safety primitives). It names the alternative tool and provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_batch_update_describeA

Preview what task_batch_update would do without making any changes. Do NOT use to actually update tasks — use task_batch_update instead. Returns { description, plannedChanges } summarising all patches that would be applied. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of { id, patch } pairs. Must contain at least one item.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the full burden. It explicitly states 'No side effects: read-only by contract — never mutates OmniFocus' and describes the return shape. This is strong transparency for a preview tool, though it could mention error handling or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose, usage warning, and return value with workflow. Each sentence earns its place, no fluff. Slightly verbose but well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the dry-run workflow, return shape ({description, plannedChanges}), and how to use it with the write tool. Given no output schema, this is sufficient for an agent to use the tool correctly. Could mention error cases, but overall complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for each field. The description adds only that parameters should match those of task_batch_update and that items is an array of {id, patch} pairs. This is helpful but not significantly beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Preview what task_batch_update would do without making any changes.' It identifies the tool as a dry-run for task_batch_update and distinguishes it from sibling task_batch_update by explicitly warning against using it for actual updates. The verb 'preview' and resource 'task_batch_update' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (preview), when not to use (do not actually update tasks), and provides a full workflow: 'pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.' This is clear and actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_clear_alarmsA

Remove all alarms/notifications from an OmniFocus task. After clearing, the task has no scheduled notifications. Use task_set_alarms to install a new alarm set. Returns the updated task. Mutations do not sync automatically — call sync_trigger if cross-device visibility matters. Example: task_clear_alarms({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the task to update. Get from task_list or search_query.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses key behaviors: it removes all alarms, returns the updated task, and notes the lack of automatic sync. This is sufficient for inferring safety and side effects. A minor gap is not specifying behavior when no alarms exist, but the clarity is still high.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each serving a distinct purpose: action description, post-condition, alternative tool, sync warning, and example. It is front-loaded with the core purpose and avoids redundancy, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers all essential aspects: purpose, effect, return value, sync behavior, and an example. It also links to the complementary tool, providing complete context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the parameter with 100% description coverage. The description adds an example usage call, reinforcing that `id` is required and providing context. This adds value beyond the schema, justifying a score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb 'Remove' and resource 'alarms/notifications', clearly stating the tool's action. It also distinguishes from sibling `task_set_alarms` by directing users to that tool for adding alarms, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (to clear alarms) and points to `task_set_alarms` as the alternative for installing new alarms. It also warns that mutations don't sync automatically and advises calling `sync_trigger` for cross-device visibility, providing comprehensive usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_clear_repetitionA

Remove the repetition rule from an OmniFocus task. After clearing, the task becomes a one-time item. Use task_set_repetition to set or change a rule. Returns the updated task with repetitionRule confirmed as null. Mutations do not sync automatically — call sync_trigger if cross-device visibility matters. Example: task_clear_repetition({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the task to update. Get from task_list or search_query.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the task becomes one-time, returns updated task with null repetitionRule, and that mutations don't sync automatically, requiring sync_trigger for cross-device visibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with no fluff. Front-loaded with purpose, includes an example, and covers all essential aspects in a few sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers purpose, behavior, result, side effects, and syncing adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already describes id with pattern and description. Description adds value by telling the agent where to get the id ('Get from task_list or search_query'), which is helpful beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Remove' and the resource 'repetition rule from an OmniFocus task'. It distinguishes from sibling task_set_repetition by explicitly naming it for setting/changing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (remove repetition rule) and when not to (use task_set_repetition for setting/changing). Also provides syncing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_clear_waiting_onA

Clear waiting-on tracking from an OmniFocus task. Strips the waiting-on fenced block from the task note (preserving any other user prose) and removes the configured @waiting tag from the task. Idempotent: returns noChange:true when the task has no waiting-on data. Do NOT use to delete the task or remove unrelated tags — prefer task_delete or task_update instead. Returns { id, cleared:true } or { id, noChange:true }. Side effects: writes tag + note; sets meta.syncPending = true. Example: { "taskId": "abc123" }

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYesPersistent task ID.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses idempotency, return shapes, side effects (writes tag+note, sets syncPending). Missing error cases, but given no annotations, this is thorough for a simple mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded, and each sentence adds value (core action, idempotency, alternatives, returns, side effects, example). No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, returns, side effects, and idempotency. No output schema, but return shapes are described. Lacks error handling details, but sufficient for single-param tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good parameter description; the description adds an example but no additional semantic value beyond what schema provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool clears waiting-on tracking from an OmniFocus task, specifying it strips a fenced block and removes a tag. This distinguishes it from siblings like task_delete and task_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (to clear waiting-on) and when not to (to delete task or remove unrelated tags), with named alternatives (task_delete, task_update).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_completeA

Complete an OmniFocus task — marks it done with a completion timestamp. Accepts an optional ISO-8601 date for the completion time; defaults to now. Idempotent: returns noChange: true if the task is already completed. When the task has incomplete children, returns clarification-needed asking whether to complete children too — call the clarify tool with the user's choice. Do not use to drop or delete a task. Returns { done: true, id, name } or { noChange: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: sets completedAt, sets meta.syncPending = true. Example: task_complete({ id: "abc123" }) Example: task_complete({ id: "abc123", at: "2026-05-01T09:00:00Z" })

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoISO-8601 completion time. Defaults to now.
idYesPersistent task ID.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description covers all behavioral traits: idempotency, side effects (sets completedAt and meta.syncPending), return values with name field, and the clarification-needed response for incomplete children.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: starts with main action, then details, then examples. Slightly verbose but every sentence adds value. Could be trimmed slightly but remains clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description fully explains return values. Handles complex cases like incomplete children. References the sibling `clarify` tool. No gaps in understanding the tool's complete behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by explaining default behavior for `at` and providing two concrete examples, clarifying usage beyond schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Complete an OmniFocus task — marks it done with a completion timestamp.' The verb and resource are explicit, and it distinguishes from siblings like task_delete or task_drop by warning not to use for deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: when incomplete children exist, use the `clarify` tool; do not use for dropping/deleting. Also mentions idempotent behavior and returning noChange if already completed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_complete_describeA

Preview what task_complete would do without making any changes. Do NOT use to actually complete a task — use task_complete instead. Returns { description, plannedChanges } describing the completion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoISO-8601 completion time. Defaults to now.
idYesPersistent task ID.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses critical behavior: 'No side effects: read-only by contract — never mutates OmniFocus.' It also states the return format '{ description, plannedChanges }' and confirms no mutations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences plus an example), front-loaded with the core purpose, and each sentence adds value. Slightly verbose example could be trimmed, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return type and the dry-run pattern. All parameters are documented in schema, and the context of usage with the sibling tool is clear. Complete for a preview tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description mentions passing 'the same args you would to the write tool' but adds no specific parameter semantics beyond what the schema already provides. The schema fully describes 'at' and 'id'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Preview what task_complete would do without making any changes.' It explicitly distinguishes from the sibling 'task_complete' and uses a specific verb+resource ('preview completion').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Do NOT use to actually complete a task — use task_complete instead.' Also explains the dry-run pattern and advises to inspect plannedChanges before calling the write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_convert_to_projectA

Promote an OmniFocus task to a first-class project via OmniJS Database.convertTasksToProjects(). The task's persistent identifier is preserved on the resulting project — agents can continue using the same ID as a project ID after conversion. Subtasks, notes, tags, and dates are carried over by OmniFocus automatically. Use this when a task has grown in scope and needs its own review interval, subtask hierarchy, or project-level metadata. Do NOT use on tasks already in a project — use task_move instead for reparenting; use project_create when starting from scratch. Returns { converted: true, projectId, taskId, name } — name is the task name (carried over to the new project) so the agent can describe the conversion without a follow-up read. Side effects: removes the task from the task list and adds a project; sets meta.syncPending = true. Example: task_convert_to_project({ id: "abc123" }) Example: task_convert_to_project({ id: "abc123", folderId: "fld456" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to promote.
folderIdNoPlace the new project inside this folder. Omit to place at the top of the library.
positionNoWhere within the folder or library to insert the new project. Defaults to "ending".

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavioral traits: it explains side effects ('removes the task from the task list and adds a project; sets meta.syncPending = true'), automatic transfer of subtasks/notes/tags/dates, and return value structure. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive: every sentence adds value, it front-loads the primary action, and includes examples at the end. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of conversion and no output schema, the description thoroughly explains the return value, side effects, and usage context. Sibling tools are numerous but this tool is well differentiated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is 100% covered, so baseline is 3. The description adds value by providing example usage with parameters and explaining the role of folderId and position beyond the schema, though it doesn't repeat default values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Promote an OmniFocus task to a first-class project' using a specific verb and resource. It distinguishes itself from sibling tools like task_move and project_create by explicitly contrasting when not to use them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance ('when a task has grown in scope') and when-not-to-use guidance ('Do NOT use on tasks already in a project – use task_move instead; use project_create when starting from scratch'), offering clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_createA

Create a new task in OmniFocus — in the inbox, inside a project, or as a subtask of another task. Supply exactly one of: projectId (project task), parentTaskId (subtask), or neither (inbox). Do not use for bulk creation; prefer task_batch_create for that. Safety control: pass idempotency_key to make transport retries safe — identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate task. Returns { id, name } — name echoes the supplied name so the agent can describe the new task without a follow-up read. Side effects: creates a task in OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the task to appear on other devices. Example: task_create({ name: "Buy milk" }) Example: task_create({ name: "Write report", projectId: "prj123", dueDate: "2026-05-01T00:00:00Z" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTask name. Required, must be non-empty.
noteNoPlain-text note.
tagIdsNoTag IDs to apply.
dueDateNoDue date as ISO-8601 with offset.
flaggedNoFlag the task.
deferDateNoDefer date as ISO-8601 with offset.
projectIdNoProject to add the task to. Omit for inbox or subtask.
sequentialNoIf true, subtasks must be completed in order.
parentTaskIdNoParent task ID for a subtask. Omit for inbox or project task.
dueDateFloatingNoWhen true, the due time follows the user across time zones (floating) rather than being pinned to a fixed UTC instant. Use for recurring daily tasks where '9 AM' should mean 9 AM wherever the user is. Default: false (fixed-offset).
idempotency_keyNoIdempotency key for retry-safe creates. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate task.
estimatedMinutesNoEstimated duration in minutes.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
completedByChildrenNoComplete when all subtasks complete.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description fully discloses behavioral traits: side effects (creates task, sets meta.syncPending = true), idempotency replay behavior, return value format ({ id, name } with name echo), and when sync_trigger is needed. This exceeds typical transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then placement rules, bulk warning, safety, return value, side effects, and examples. It is slightly long but efficient, with every sentence adding value. Front-loading is good.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 14 parameters and no output schema, the description covers all critical aspects: placement options, idempotency, return format, side effects, and syncing. It leaves no major gaps for this mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context: clarifies mutual exclusivity of projectId/parentTaskId, explains dueDateFloating behavior (time zone following), and details idempotency_key effect. This goes beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource ('Create a new task') and distinguishes the three placement options (inbox, project, subtask). It also explicitly calls out the sibling tool task_batch_create for bulk creation, establishing clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Supply exactly one of: projectId, parentTaskId, or neither (inbox).' It also advises against bulk creation and points to task_batch_create. Additionally, it explains idempotency key usage for safe retries and mentions side effects with sync_trigger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_create_describeA

Preview what task_create would do without making any changes. Do NOT use to actually create a task — use task_create instead. Returns { description, plannedChanges } describing the task that would be created. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTask name. Required, must be non-empty.
noteNoPlain-text note.
tagIdsNoTag IDs to apply.
dueDateNoDue date as ISO-8601 with offset.
flaggedNoFlag the task.
deferDateNoDefer date as ISO-8601 with offset.
projectIdNoProject to add the task to. Omit for inbox or subtask.
sequentialNoIf true, subtasks must be completed in order.
parentTaskIdNoParent task ID for a subtask. Omit for inbox or project task.
dueDateFloatingNoWhen true, the due time follows the user across time zones (floating) rather than being pinned to a fixed UTC instant. Use for recurring daily tasks where '9 AM' should mean 9 AM wherever the user is. Default: false (fixed-offset).
idempotency_keyNoIdempotency key for retry-safe creates. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of creating a duplicate task.
estimatedMinutesNoEstimated duration in minutes.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
completedByChildrenNoComplete when all subtasks complete.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Explicitly states 'No side effects: read-only by contract — never mutates OmniFocus.' This goes beyond the lack of annotations by clarifying the tool's safety and describing the return format (description and plannedChanges).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no redundancy. Front-loaded with core purpose, then safety note, then usage example. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the lack of output schema, the description clearly states what it returns and its role as a dry-run. It covers all essential aspects: purpose, safety, usage pattern, and relation to sibling tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the description does not need to repeat parameter details. It mentions the tool accepts the same arguments as task_create, which adds context but doesn't elaborate beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states it previews task_create without changes, distinguishes from the sibling tool by warning to use task_create for actual creation. Verb 'Preview' and resource 'task_create' are specific and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly says when to use (as a dry-run) and when not to (use task_create for actual creation). Provides workflow: pass same args, inspect plannedChanges, then call the write tool. Offers clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_defer_smartA

Defer a task to a date computed from a high-level intent (e.g. 'next work morning', 'skip weekends', 'in 3 business days'), instead of guessing an ISO date that may land on a weekend or off-hours. Variants: next-work-day, next-weekday, in-business-days, after-event (gated on calendar bridge), next-month-start, explicit-with-skip-weekends. Morning/afternoon defaults are configurable via OMNIFOCUS_MORNING_HOUR / OMNIFOCUS_AFTERNOON_HOUR env (default 09:00 / 14:00). Do NOT use this for unconditional ISO-date defers — prefer task_update with deferDate. Returns { taskId, resolvedDeferDate, reason } so the agent can echo the resolved date verbatim. Side effects: writes the resolved deferDate via task_update; supports dry_run, idempotency_key, and expectedModifiedAt for safety. Triggers a sync. Example: task_defer_smart({ taskId: '...', intent: { kind: 'next-work-day' } })

ParametersJSON Schema
NameRequiredDescriptionDefault
intentYesHigh-level defer intent. Discriminated union on `kind` — see tool description for variants.
taskIdYesID of the task to defer.
dry_runNoWhen true, validates input and resolves the intent but does NOT write to OmniFocus. Returns the resolved date + reason in the response with meta.dryRun = true.
idempotency_keyNoIdempotency key for retry-safe defers. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-applying.
expectedModifiedAtNoOptimistic-concurrency guard: ISO-8601 timestamp from a recent task_get. If the task's current modifiedAt differs, the call fails with OF_CONFLICT and no update is performed. Omit to skip the check.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description adequately discloses side effects: it writes the resolved deferDate via task_update, triggers a sync, and supports idempotency, concurrency control, and dry_run. It also returns resolvedDeferDate and reason. However, it does not explicitly state that it is a write operation or detail all possible error states, but it is fairly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the primary purpose, then systematically covers variants, environment variables, exclusions, return values, side effects, safety features, and an example. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description explains the return object (taskId, resolvedDeferDate, reason). It covers side effects (writes, sync), safety (dry_run, idempotency, expectedModifiedAt), and provides an example. The sibling tools list includes task_update and batch variants, which are adequately addressed by the 'when not to use' note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, but the tool description adds value by explaining the high-level intent concept for the 'intent' parameter, listing all variants, and noting environment variables for defaults. This exceeds what the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool defers a task to a date computed from a high-level intent, with specific verb 'Defer' and resource 'task'. It distinguishes from unconditional ISO-date defers by explicitly saying to use task_update instead, and lists multiple variants, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool (for smart defer based on intent) and when not to (for unconditional ISO-date defers, prefer task_update). It enumerates intent variants and gives an example, offering clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_deleteA

Permanently delete an OmniFocus task. IRREVERSIBLE — uses OmniFocus deleteObject; there is no undo. Prefer task_drop when you want a recoverable status change. Only use task_delete when the agent has explicit user intent to permanently remove the task. REQUIRED: pass confirm=true to acknowledge this action is irreversible; the call is rejected without it. Safety controls: set dry_run=true to preview without mutating; pass expectedModifiedAt (from a recent task_get) to reject the call if the task changed since you read it; pass idempotency_key to coalesce retries so the same delete is only performed once. Returns { deleted: true, id } on success. Side effects: removes the task from OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need the deletion to appear on other devices. Example: task_delete({ id: "abc123", confirm: true }) Example: task_delete({ id: "abc123", confirm: true, dry_run: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to delete. Get from task_list or search_query. Verify you have the correct ID before calling — this action is irreversible.
confirmYesExplicit acknowledgement that this deletion is permanent and irreversible. Must be exactly true. The call is rejected if this field is absent or false.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
idempotency_keyNoIdempotency key for retry-safe deletes. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-deleting (or re-raising NotFound on the second attempt).
expectedModifiedAtNoOptimistic-concurrency guard: ISO-8601 timestamp from a recent task_get. If the task's current modifiedAt differs, the call fails with OF_CONFLICT and no delete is performed. Omit to skip the check.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Fully discloses irreversible behavior, return format, side effects (removes from OmniFocus, sets syncPending), and suggests sync_trigger for device synchronization. No annotations to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured, front-loaded with critical warnings, each sentence serves a distinct purpose, and examples are included without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all important aspects: irreversibility, alternative, required parameter, safety options, return values, side effects, and sync guidance. Very thorough for a deletion tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds significant value beyond the schema by explaining confirm as mandatory, dry_run as preview, idempotency_key for retry safety, and expectedModifiedAt for concurrency control. Provides realistic examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it permanently deletes a task, emphasizes irreversibility, and distinguishes from the sibling tool task_drop which offers recoverable deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises when to use task_delete vs task_drop, emphasizes that explicit user intent is required, and mandates the confirm parameter with dry_run and expectedModifiedAt as safety controls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_delete_describeA

Preview what task_delete would do without making any changes. Do NOT use to actually delete a task — use task_delete instead. Returns { description, plannedChanges } describing the permanent deletion that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to delete. Get from task_list or search_query. Verify you have the correct ID before calling — this action is irreversible.
confirmYesExplicit acknowledgement that this deletion is permanent and irreversible. Must be exactly true. The call is rejected if this field is absent or false.
dry_runNoWhen true, validates input and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
idempotency_keyNoIdempotency key for retry-safe deletes. Identical subsequent calls within the TTL window replay the original envelope with meta.idempotentReplay = true instead of re-deleting (or re-raising NotFound on the second attempt).
expectedModifiedAtNoOptimistic-concurrency guard: ISO-8601 timestamp from a recent task_get. If the task's current modifiedAt differs, the call fails with OF_CONFLICT and no delete is performed. Omit to skip the check.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even without annotations, the description fully discloses the tool's behavior: it is read-only, causes no side effects, and never mutates OmniFocus. It also describes the output structure ({description, plannedChanges}) so the agent knows what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences plus an example. Every sentence adds value, and it is front-loaded with the core purpose. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 parameters, 2 required) and lack of output schema, the description sufficiently explains the return value and side-effect behavior. It covers what the agent needs to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with parameter descriptions, so the description adds little extra semantic value beyond stating to 'pass the same args you would to the write tool'. This is adequate but not exceptional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: preview a deletion without making changes. It uses specific language ('Preview what task_delete would do without making any changes') and differentiates itself from the sibling tool task_delete by explicitly warning not to use it for actual deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool (dry-run companion) and when not to (do not use for actual deletion, use task_delete instead). It also provides an example workflow: pass same args, inspect plannedChanges, then call the write tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_dropA

Drop an OmniFocus task — marks it as dropped/deferred and removes it from active view. Reversible via task_undrop. Accepts an optional ISO-8601 date. Idempotent: returns noChange: true if already dropped. Do not use to complete or delete a task. Returns { done: true, id, name } or { noChange: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: sets droppedAt, sets meta.syncPending = true.Example: task_drop({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoISO-8601 drop time. Defaults to now.
idYesPersistent task ID.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: marks as dropped/deferred, removes from active view, idempotent (noChange flag), reversible, side effects (sets droppedAt and syncPending), and return format. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear front-loaded purpose, key facts (reversible, idempotent), an example, and no fluff. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough, covering return values (done or noChange with id and name), side effects, and an example. It does not describe error scenarios or prerequisites (e.g., task must exist), but given the tool's simplicity and the lack of output schema, it is highly complete for agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for both parameters (id, at). The description adds minimal value by mentioning the optional ISO-8601 date and the default behavior, but these are already present in the schema. A score of 3 is appropriate as the description does not significantly enhance parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool drops an OmniFocus task, marks it as dropped/deferred, and removes it from active view. It explicitly distinguishes from siblings like task_undrop, task_complete, and task_delete, guiding the agent to use the correct tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use (dropping/deferring a task), when not to use (completing or deleting), and mentions an alternative (task_undrop for reversal). It also explains idempotency and return values, aiding correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_drop_describeA

Preview what task_drop would do without making any changes. Do NOT use to actually drop a task — use task_drop instead. Returns { description, plannedChanges } describing the drop that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoISO-8601 drop time. Defaults to now.
idYesPersistent task ID.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'No side effects: read-only by contract — never mutates OmniFocus.' This is critical behavioral information for a tool that could be mistaken for a write operation. Since no annotations are provided, the description fully shoulders the burden of transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with only three sentences, each serving a clear purpose: stating the action, providing a negative directive, and detailing behavior and return value. No extraneous information is included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema, no annotations), the description adequately covers purpose, usage, and side effects. It lacks explicit error handling details but is sufficient for correct invocation alongside its sibling tool task_drop.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with descriptions for both parameters (id and at) in the schema. The description adds context that the same args should be passed as to the write tool, but does not significantly enhance parameter understanding beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Preview what task_drop would do without making any changes.' It clearly distinguishes itself from the sibling tool task_drop by instructing not to use it for actual drops. The return value is described, leaving no ambiguity about the tool's role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Do NOT use to actually drop a task — use task_drop instead.' It also outlines a workflow: pass the same arguments, inspect plannedChanges, then call the write tool. This clearly differentiates usage from alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_duplicateA

Duplicate an OmniFocus task, optionally including its entire subtask subtree when recursive: true. Editable fields copy over (name, note, defer/due dates, flagged, tags, estimate, repetition); system fields (id, timestamps) regenerate; completed/dropped state is NOT carried — the duplicate is a fresh, active task. Do NOT use task_duplicate as a substitute for task_move (which reparents the existing task) or task_create (when the new task's fields differ from the source). By default the clone lands alongside the source. Provide destination with exactly one of projectId, parentId, or toInbox: true to place it elsewhere. Returns { duplicated: true, sourceId, newId, descendantCount, name } — name is the source task's name (the duplicate carries the same name) so the agent can describe the new task without a follow-up read. Side effects: creates one new task (plus descendants if recursive) in OmniFocus, sets meta.syncPending = true. Example: task_duplicate({ id: "abc123" }) Example: task_duplicate({ id: "abc123", recursive: true, destination: { projectId: "prj456" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to duplicate.
recursiveNoWhen true, clone the full subtask subtree depth-first. Default: false (clone only the task itself).
destinationNoWhere to place the duplicate. Exactly one of projectId, parentId, or toInbox: true. Omit to clone alongside the source.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: which fields copy over (name, note, defer/due dates, etc.), which regenerate (id, timestamps), that completed/dropped state is not carried, side effects (creates task, sets syncPending), and the return value structure. This is comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-organized: main purpose first, then details, warnings, return value, and examples. Each sentence serves a purpose, though it could be slightly more concise without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (recursive duplication, multiple destination options, no output schema), the description is exceptionally complete. It covers all behavioral aspects, side effects, return fields, and gives two concrete examples. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant value: it explains the default placement ('alongside the source'), the constraint on destination ('exactly one of projectId, parentId, or toInbox: true'), and provides examples for common cases. This goes beyond the schema schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource ('Duplicate an OmniFocus task') and immediately clarifies the recursive option. It also explicitly distinguishes from siblings like task_move and task_create, making the tool's unique purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-not-to-use guidance: 'Do NOT use task_duplicate as a substitute for task_move (which reparents the existing task) or task_create (when the new task's fields differ from the source).' It also explains default placement and destination options with concrete rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_extract_from_imageA

Capture tasks from an image — agent does vision, tool does plumbing. Source is a path or existing OF attachment; agent supplies proposed: ProposedTask[]. Two-phase: dryRun=true validates+echoes; dryRun=false with confirmation[] writes. attachSourceTo: 'parent-task' (default), 'each-task' (path-mode only), or 'none'. Path-mode: PNG/JPEG/HEIC/HEIF/GIF/WEBP/PDF; respects attachment-path-scope + size cap. Do NOT use when you already have structured tasks — call task_batch_create. Returns { phase, proposed?, parent?, created?, outcome? }. Side effects: dryRun=false creates tasks; call sync_trigger for cross-device. Example: task_extract_from_image({ source: { kind: "path", path: "/tmp/whiteboard.png" }, proposed: [{ name: "Follow up with Alice" }], dryRun: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNotrue (default) = preview; false requires confirmation[].
sourceYesImage source. attachment requires exactly one owner.
proposedYesAgent-supplied extraction.
confirmationNoRequired when dryRun=false. (Possibly-edited) confirmed tasks.
attachSourceToNoRe-attachment mode after task creation.parent-task
parentTaskNameNoWrapper parent task name; default 'Captured from image'.
targetProjectIdYesProject that receives the captured tasks (and the wrapper, if `parent-task` mode).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses side effects: dryRun=false creates tasks, and suggests sync_trigger for cross-device. Mentions path-mode constraints and size cap. However, lacks details on error handling or rollback.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose, then covers usage, parameters, constraints, alternatives, side effects, and example. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, no output schema, and no annotations, description covers core behavior, parameter meanings, and side effects. Lists return fields but could elaborate on error conditions. Overall fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds significant context: explains two-phase workflow, default values, path-mode restrictions, and attachSourceTo modes. Provides example with parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Capture tasks from an image' and distinguishes from sibling tool task_batch_create by noting not to use when structured tasks exist.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (have image) and when not (already structured tasks). Details the two-phase process with dryRun and confirmation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_extract_from_noteA

Mechanically split prose into a candidate-task list with source-line provenance. Source can be a task's note (kind: 'task'), a project's note (kind: 'project'), or inline text (kind: 'inline') — useful for piping a transcript through capture-meeting. Two-phase contract: dryRun=true returns { proposed, unmappedLines }; dryRun=false with confirmation: ProposedTask[] creates the (possibly-edited) tasks in targetProjectId via batchCreateTasks semantics. Returns { phase: 'dryRun', proposed, unmappedLines } or { phase: 'created', outcome: BatchOutcome } accordingly. Do NOT use this tool when you already have structured tasks — call task_batch_create directly instead. Prefer this helper when the input is a wall-of-text note that needs splitting. Side effects: dryRun=true is read-only; dryRun=false creates tasks in the target project. Mutations do not sync automatically — call sync_trigger if cross-device visibility matters. Example: task_extract_from_note({ source: { kind: "task", id: "abc123" }, dryRun: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDefault true — return proposals without creating. false requires confirmation[].
sourceYesWhere to read prose from.
confirmationNoRequired when dryRun is false. The (possibly-edited) ProposedTask[] the agent has confirmed with the user.
targetProjectIdYesProject that will receive created tasks on dryRun=false. Read-only on dryRun=true.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description fully details behavior: read-only vs create, no auto-sync, two-phase contract with return shapes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured, front-loaded with primary action, each sentence adds unique value, includes example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description provides expected return shapes, covers all use cases, and includes side effects and an example.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions; the tool description adds context on return values but not significant new parameter meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool splits prose into candidate tasks with provenance, and explicitly distinguishes from sibling task_batch_create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (wall-of-text) and when-not-to-use (structured tasks, call task_batch_create instead), plus the two-phase contract.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_find_by_nameA

Find tasks in OmniFocus by name. Returns ALL matching tasks (names are not unique in OmniFocus). Names collide in OmniFocus; prefer task_get with an ID when you have one. Use search_query instead when you need to search task notes as well, or want full-text content search. Zero matches returns an empty array — not an error. Returns tasks[]; safe to call repeatedly; no side effects. Example: task_find_by_name({ name: "Buy milk" }) Example: task_find_by_name({ name: "report", matchMode: "contains" })

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'exact' = full task name must match (default); 'prefix' = name must start with query; 'contains' = query appears anywhere in name.
limitNoMaximum number of results to return (1..500). Default 50.
queryYesName to search for. Behaviour depends on mode: exact = full name match; prefix = name starts with this string; contains = substring match anywhere in name.
caseSensitiveNotrue = match is case-sensitive; false = case-insensitive (default false).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses that the tool returns ALL matching tasks (non-unique names), is safe to call repeatedly, has no side effects, and returns an empty array for zero matches. This fully compensates for missing annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is informative but slightly verbose. It front-loads the main purpose and includes examples, but could be tightened slightly. Every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description explains return type (tasks[]) and empty array behavior. It covers side effects and safety. Missing details on pagination or rate limits, but acceptable given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds two examples and explains the matchMode options (though uses 'matchMode' instead of schema's 'mode', causing minor inconsistency). It does not describe other parameters (limit, caseSensitive) beyond schema, so it adds limited value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds tasks by name in OmniFocus, distinguishing it from siblings like task_get (by ID) and search_query (full-text search). The verb 'find' combined with the resource 'tasks by name' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool vs alternatives: prefer task_get with an ID, and use search_query for full-text content. Also clarifies behavior (empty array on no matches, no side effects), which helps the agent decide correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_find_similarA

Lexical nearest-neighbour search for de-duplicating tasks. Pass a candidate name (and optional note) and receive the top-K most-similar existing tasks ranked by a deterministic [0, 1] lexical-signal score (Jaccard token-overlap + prefix bonus + exact-name boost). Title-dominant: a perfect title match outranks a perfect note match. Use BEFORE task_create when you suspect a duplicate; the agent inspects the candidates and decides whether to create new, link to existing, or merge. Excludes completed and dropped tasks by default; opt-in via includeCompleted: true. Optional scope { projectId } or { tagId } narrows the candidate set. Returns { candidates: [{ taskId, name, score, project, tags }] } sorted by score descending — project is { id, name } | null and tags is [{ id, name }, ...]. Names are paired alongside ids via a single getProjectsMany + single getTagsMany batch (no N+1) so the agent can describe each candidate without a follow-up read. An empty result is { candidates: [] }, not an error. Do NOT use this tool for general full-text search — call task_search for that. Prefer this helper when the question is 'is this task already in the system?'. No model calls; no side effects. Read-only. Example: task_find_similar({ name: "Call dentist" }) Example: task_find_similar({ name: "Write report", scope: { projectId: "prj123" }, topK: 5 })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe candidate task name to compare against existing tasks.
noteNoOptional note text. When both the candidate and an existing task have a note, note overlap contributes to the score as a tiebreaker.
limitNoTop-K candidates to return. Default 5, max 50.
scopeNoNarrow the candidate set to one project or one tag. Mutually exclusive — supply at most one. Omit to search all open tasks.
includeCompletedNoWhen true, include completed and dropped tasks. Default false (open tasks only).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses all behavioral traits: it is read-only, has no side effects, no model calls, uses a deterministic lexical scoring algorithm, excludes completed tasks by default, supports optional scope narrowing, returns sorted candidates, and describes the output format including empty result handling. It even notes performance optimizations (batch queries).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: it opens with the core purpose and algorithm, then usage guidelines, parameter details, output format, and a performance note. Every sentence adds value without redundancy. Despite being moderately long, it is efficiently organized and front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 5 parameters including a nested scope object, a custom scoring algorithm, and no output schema, the description provides comprehensive coverage. It explains input semantics, the algorithm, output format (including field descriptions), default behaviors, and error cases. The agent can fully understand how to use the tool without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant semantic value beyond the schema: it explains the scoring algorithm, the role of 'note' as a tiebreaker, the mutual exclusivity and purpose of 'scope', the default for 'includeCompleted', and provides examples. While the schema already documents each parameter, the description enriches understanding of how they interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is a 'Lexical nearest-neighbour search for de-duplicating tasks.' It specifies the verb (search/find), the resource (tasks), and distinguishes from siblings like task_search and task_find_by_name by explicitly stating the deduplication use case. The purpose is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Use BEFORE task_create when you suspect a duplicate' and 'Do NOT use this tool for general full-text search — call task_search for that.' It also mentions alternatives like task_find_by_name, giving clear when-to-use and when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_getA

Fetch a single OmniFocus task by persistent ID. Use when you have a known task ID and need its full detail. Do NOT use for multiple IDs — use task_get_many instead. Returns the Task object plus subtaskIds[] and subtaskCount (when includeSubtasks omitted or false). Pass includeSubtasks: true to get full subtask bodies; use task_get_many to fetch specific subtasks by ID. Read-only; safe to retry. Example: task_get({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to fetch. Get from task_list or task_get_many.
fieldsNoRestrict the returned task (and each subtask) to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
verboseNoWhen true, return the full unelided task shape (every field present, even at defaults). Default: false — fields equal to their documented default are omitted. See docs/token-cost.md for the defaults table.
includeLinksNoWhen true, the task (and each subtask, if requested) carries a `_links` HATEOAS block (self, project, parent, tags). Default false — the block is omitted to save payload size. Use `id`, `projectId`, `parentId`, and `tagIds` directly instead.
includeSubtasksNoInclude full subtask bodies in the response. Default false — returns subtaskIds[] and subtaskCount instead. Pass true only when you need subtask detail; otherwise use task_get_many with subtaskIds.
notePreviewCharsNoMaximum characters of the task's note (and each subtask's note) to return. Default 200. When a note exceeds this length, the response replaces `note` with `notePreview` (the truncated text), `noteTruncated: true`, and `noteLength` (full UTF-8 byte length) — fetch the full text with note_get. Pass -1 to disable truncation and return full notes inline.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses read-only nature, safe to retry, and explains behavior of includeSubtasks, notePreviewChars, verbose, fields, and includeLinks. Covers return value structure and truncation details. No annotations provided, so description fully handles transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with purpose and key guidance. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-task fetch: covers all parameters, return values, and edge cases like note truncation. No output schema, but description adequately explains expected response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline is 3. Description adds usage context beyond schema, e.g., how includeSubtasks relates to task_get_many, and note truncation behavior. Slightly exceeds baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a single OmniFocus task by persistent ID, with a specific verb and resource. It distinguishes from sibling tools like task_get_many by explicitly stating not to use for multiple IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear guidance on when to use (known task ID, need full detail), when not to use (multiple IDs, use task_get_many instead), and when to use includeSubtasks (only if subtask detail needed, otherwise use task_get_many).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_get_manyA

Fetch up to 100 tasks by persistent ID in a single OmniFocus round-trip. Use when you have a set of task IDs from multiple sources and need full task objects for all of them. Do NOT use for a single ID — use task_get instead. Do NOT use when you only have names — use task_find_by_name. Returns Task[] in input order. Missing IDs are omitted and appear in meta.warnings. Read-only; safe to retry. Example: task_get_many({ ids: ["abc123", "abc456"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of task IDs to fetch (0..100). Get IDs from task_list, search_query, or task_find_by_name. Missing IDs are omitted (not errors) and appear in meta.warnings.
fieldsNoRestrict each returned task to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
verboseNoWhen true, return the full unelided task shape. Default: false — fields equal to their documented default are omitted. See docs/token-cost.md for the defaults table.
maxOutputBytesNoCap the serialized byte size of the returned tasks[] array. When the response would exceed this, the server returns as many whole tasks as fit (in input order), sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and lists the trimmed ids in meta.warnings.WARN_RESULT_TRUNCATED details.droppedIds — re-request those in a smaller batch or with a higher cap. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single task larger than the cap is still returned whole so the batch always makes progress.
notePreviewCharsNoMaximum characters of each task's note to return. Default 200. When a note exceeds this length, the response replaces `note` with `notePreview` (the truncated text), `noteTruncated: true`, and `noteLength` (full UTF-8 byte length) — fetch the full text with note_get. Pass -1 to disable truncation and return full notes inline.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral traits: read-only, missing IDs omitted, return order, example, and meta.warnings. It also details parameter behaviors beyond schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4-5 sentences), front-loaded with purpose, includes an example, and every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 params, no output schema), the description covers purpose, usage, behavioral details, and parameter behavior adequately. It explains return values and warnings, though meta structure could be more detailed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds some context (e.g., 'missing IDs omitted') but largely echoes schema. No significant new meaning beyond what's in the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch up to 100 tasks by persistent ID' with a specific verb and resource, and distinguishes itself from siblings like task_get and task_find_by_name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when to use (multiple IDs from multiple sources) and when not to use (single ID -> task_get, names only -> task_find_by_name), along with read-only and safe-to-retry guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_listA

List tasks in OmniFocus with optional filters (project, tag, inbox, flagged, completion, due dates). Use inbox=true to fetch unprocessed Inbox tasks. Use this for filter-based queries across tasks. Do NOT use for a known single task (use task_get). For name-based lookup, prefer task_find_by_name. For full-text content search across names and notes, prefer search_query. Returns tasks[] with pagination; safe to call repeatedly; no side effects. Example: task_list({ inbox: true }) Example: task_list({ projectId: "prj123", flagged: true }) Example: task_list({ dueBefore: "2026-05-01T00:00:00Z", completed: "exclude" })

ParametersJSON Schema
NameRequiredDescriptionDefault
inboxNotrue = Inbox tasks only (no project assignment). Cannot be combined with projectId or parentId. Use this to surface unprocessed captures without knowing their IDs.
limitNoMax tasks per page (1..1000). Default 50. Use `cursor` to fetch subsequent pages.
cursorNoOpaque cursor from a previous task_list response. Must use the same filters — changing filters mid-sequence returns a ValidationError.
fieldsNoRestrict each returned task to this list of top-level fields (id is always returned). Omit for the full task shape. Empty array returns just id. Unknown names surface in meta.warnings.WARN_UNKNOWN_FIELDS.
sortByNoField to sort tasks by: 'createdAt' (default), 'dueDate', 'modifiedAt', or 'name'. Tasks with no value for the chosen field (e.g. no dueDate) sort last.
tagIdsNoRestrict to tasks carrying ALL of these tag IDs. Get IDs from tag_list.
flaggedNotrue = flagged only; false = unflagged only; omit = all.
verboseNoWhen true, return the full unelided task shape (every field present, even at defaults). Default: false — fields equal to their documented default (flagged: false, completed: false, tagIds: [], note: null, dueDate: null, etc.) are omitted from the wire payload. An omitted field means the default applies. See docs/token-cost.md for the full defaults table.
dueAfterNoTasks with dueDate strictly after this moment. ISO-8601 with offset.
parentIdNoRestrict to direct children of this task (subtasks). Get the ID from task_get or task_list.
availableNotrue = only tasks available to work on now (not blocked, not deferred). Omit = all.
completedNo'exclude' = active tasks only; 'only' = completed tasks only; 'any' = both. Omit for adapter default.
dueBeforeNoTasks with dueDate strictly before this moment. ISO-8601 with offset (e.g. '2026-04-21T17:00:00-04:00').
projectIdNoRestrict to tasks in this project. Get the ID from project_list. Omit for all projects.
includeLinksNoWhen true, each task carries a `_links` HATEOAS block (self, project, parent, tags). Default false — the block is omitted to save payload size. Use the task's `id`, `projectId`, `parentId`, and `tagIds` fields directly instead.
updatedSinceNoReturn only tasks modified strictly after this timestamp. Accepts ISO-8601 with offset (e.g. '2026-04-21T10:00:00-07:00') or a relative shortcut: today, yesterday, this-week, next-week, end-of-week, end-of-month. Use this for incremental sync: call without updatedSince on session start, then pass the previous response timestamp on subsequent calls. Note: deleted tasks cannot be detected — use a snapshot resource for deletion detection.
sortDirectionNoSort direction: 'asc' (default, oldest/lowest first) or 'desc' (newest/highest first).
deferredBeforeNoTasks deferred until before this moment (already unlocked or soon). ISO-8601 with offset.
maxOutputBytesNoCap the serialized byte size of the returned tasks[] array. When the response would exceed this, the server returns as many whole tasks as fit, sets meta.truncatedAtCap=true with meta.bytesReturned and meta.itemsReturned, and returns a pagination cursor that resumes at the first dropped task. Omit for no cap. Values above the server's hard ceiling (~1 MiB) are clamped. A single task larger than the cap is still returned whole so pagination always advances.
notePreviewCharsNoMaximum characters of each task's note to return. Default 200. When a note exceeds this length, the response replaces `note` with `notePreview` (the truncated text), `noteTruncated: true`, and `noteLength` (full UTF-8 byte length) — fetch the full text with note_get. Pass -1 to disable truncation and return full notes inline.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It states 'Returns tasks[] with pagination; safe to call repeatedly; no side effects,' which discloses key behavioral traits. However, it could be more explicit about read-only nature or potential performance impacts, but overall it is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at about 5 sentences, well-structured with purpose, usage guidelines, and examples. Every sentence is informative and none are redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (20 parameters, no output schema), the description covers purpose, usage, behavioral traits, and examples. It mentions pagination but lacks detail on return format; however, the schema and parameter descriptions fill that gap. Overall complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value through usage examples (e.g., task_list({ inbox: true })) and clarifies that filters like `inbox` cannot be combined with `projectId`. This goes beyond the schema's individual descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List tasks in OmniFocus with optional filters' and distinguishes from siblings like task_get, task_find_by_name, and search_query. It specifies the verb 'list' and resource 'tasks' with scope, making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explicitly states when to use this tool ('filter-based queries across tasks') and when not to, with direct alternatives for single task retrieval, name lookup, and full-text search. This provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_moveA

Move an OmniFocus task to a new location — a different project, another task (as a subtask), or the inbox. Exactly one destination must be specified: projectId, parentId, or toInbox: true. Do NOT use task_move to reorder siblings within the same parent (task_reorder handles that); prefer task_update when you only need to change editable fields, not reparent. Idempotent: returns noChange: true when the task is already at the destination. Returns { moved: true, id, from, to } or { noChange: true, id, at }. Side effects: reparents the task in OmniFocus, sets meta.syncPending = true. Example: task_move({ id: "abc123", projectId: "prj456" }) Example: task_move({ id: "abc123", parentId: "tsk789" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to move.
toInboxNoSet to true to move the task to the inbox (clear any project or parent). Mutually exclusive with projectId and parentId.
parentIdNoMove under this parent task (as a subtask). Mutually exclusive with projectId and toInbox.
projectIdNoMove into this project. Mutually exclusive with parentId and toInbox.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description discloses idempotency (returns noChange), side effects (reparents, sets syncPending), and response format. It lacks auth/permission info but is otherwise thorough for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six sentences, front-loaded with purpose, then guidelines, then details. Every sentence provides unique value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description includes return format details. Covers all essential behavioral aspects for a moderate-complexity tool with three destination types. No annotations, yet description is comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage. Description adds 'Exactly one destination must be specified: projectId, parentId, or toInbox: true,' reinforcing mutual exclusivity beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Move an OmniFocus task to a new location — a different project, another task (as a subtask), or the inbox.' This is a specific verb-action with resource and scope, distinguishing it from siblings like task_reorder and task_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Do NOT use task_move to reorder siblings within the same parent (task_reorder handles that); prefer task_update when you only need to change editable fields, not reparent.' This provides clear when-not-to-use and alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_move_describeA

Preview what task_move would do without making any changes. Do NOT use to actually move a task — use task_move instead. Returns { description, plannedChanges } describing the reparenting that would occur. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent ID of the task to move.
toInboxNoSet to true to move the task to the inbox (clear any project or parent). Mutually exclusive with projectId and parentId.
parentIdNoMove under this parent task (as a subtask). Mutually exclusive with projectId and toInbox.
projectIdNoMove into this project. Mutually exclusive with parentId and toInbox.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It explicitly states 'No side effects: read-only by contract — never mutates OmniFocus' and 'Preview what task_move would do without making any changes', fully disclosing the read-only behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with clear front-loading of purpose. Every sentence adds value, including an example workflow. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return shape ({ description, plannedChanges }). Covers side effects, usage workflow, and behavioral contract. Complete for a simple preview tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds minimal parameter-specific detail beyond the schema, though it implies parameters match those of task_move. No deeper semantic guidance provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: preview what task_move would do without making changes. It explicitly distinguishes from the actual move tool (task_move) and specifies the return format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (preview) and when-not-to-use (do not use to actually move). Names the alternative tool (task_move) and describes a complete workflow: pass same args, inspect plannedChanges, then call the write tool once approved.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_parse_transport_textA

Parse OmniFocus transport text DSL into structured task objects — no tasks are created. Supports @tag, #due-date, ::defer-date, !!, and //note tokens; a leading 'Project: Name' line sets the project context for subsequent tasks. Do not use this tool to create tasks; pass the returned tasks[] to task_create separately. Returns tasks[] with name, tagNames, dueDate, deferDate, flagged, note, and projectName fields, plus count and an optional warnings[] for unparseable dates. Tag names and project names are raw strings — resolve to IDs with tag_list before passing to task_create. Read-only; no side effects. Example: task_parse_transport_text({ text: "Buy milk @errands !!\nWrite report #2026-05-01" })

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesTransport text to parse. One task per line; 'Project: Name' prefix sets project context.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description takes full burden. States 'Read-only; no side effects.' Mentions return warnings for unparseable dates, disclosing error handling. Behavior is fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact yet comprehensive, covering purpose, syntax, usage note, return fields, read-only note, and example with no superfluous content. Front-loaded with key points.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description enumerates all return fields. Addresses input format, dependencies (tag_list), and side effects. Complete for a single-parameter parse tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema with 100% coverage already describes 'text' parameter; description adds context about line-by-line parsing and project prefix syntax, enhancing meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States clearly: 'Parse OmniFocus transport text DSL into structured task objects — no tasks are created.' Lists supported tokens and explicitly distinguishes from task creation, making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises not to use for creation and directs to pass returned tasks to task_create. Also instructs to resolve raw tag/project names with tag_list. Provides clear when-to-use and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_reclassifyA

Predicate-driven bulk task reclassification with a mandatory two-phase contract. Phase 1 (dryRun: true): match tasks by predicate, return { matched, proposed: [{taskId, before, after}] } with no mutations. Phase 2 (dryRun: false): require confirmation echoing the matched count from the prior dry-run; mismatch fails fast. Caps at 200 matches per apply; use task_batch_update with explicit IDs for larger sets. Predicate AST: title-contains / tag / project leaves and and / or / not combinators (full shape in JSONSchema). Changes apply uniformly: addTags, removeTags, setProject, setFlagged. Do NOT use this tool when you have explicit task IDs — call task_batch_update directly. Side effects (apply phase only): writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_reclassify({ predicate: { kind: "tag", tagId: "tag123" }, changes: { setFlagged: true }, dryRun: false, confirmation: "3" })

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoDefault true — return the diff without mutating. false requires `confirmation` echoing the matched count from a prior dry-run.
changesYesChanges applied uniformly to every matched task.
predicateYesAST for selecting tasks. Composable via and/or/not. Always evaluated against open (non-completed, non-dropped) tasks.
confirmationNoWhen dryRun is false, the matched count from the most recent dry-run, as a string (e.g. "42"). Mismatch with the actual current match count fails the call fast.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects (writes to OmniFocus, sets syncPending), requires sync_trigger for visibility, explains dry-run vs apply phases, and failure conditions like confirmation mismatch. No annotations present, so description carries full burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is a single well-structured paragraph covering all key topics. While thorough, it is somewhat lengthy but front-loaded with essential concepts. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complex predicate AST, two-phase protocol, and no output schema, the description completely covers input constraints, behavior, side effects, exclusions, and provides an example. Agent has sufficient information to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description adds context by explaining the dry-run default, confirmation echoing requirement, and predicate AST structure, enhancing understanding beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as 'Predicate-driven bulk task reclassification' with a two-phase contract. It distinguishes itself from sibling tools like task_batch_update by explicitly saying not to use it when explicit task IDs are known.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use (predicates, bulk) and when not to (explicit IDs), with direct alternative (task_batch_update). Also explains the two-phase contract, match cap, and confirmation requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_reorderA

Reorder an OmniFocus task among its siblings. OmniFocus has no numeric sibling index — position is always expressed relative to another task (before / after) or as the absolute start / end of a container. Do NOT use task_reorder to reparent a task to a different project or parent (task_move handles reparenting); prefer task_move when the task needs to change containers without caring about sibling order. Exactly one positioning form must be set: { before }, { after }, or { at, in }. Returns { reordered: true, id, position }. Side effects: changes sibling order in OmniFocus, sets meta.syncPending = true. Example: task_reorder({ id: "abc123", before: "abc456" }) Example: task_reorder({ id: "abc123", at: "start", in: { projectId: "prj456" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoAbsolute position within a container. Requires `in` to identify the container.
idYesPersistent ID of the task to reorder.
inNoRequired when `at` is set; ignored otherwise.
afterNoPosition the task immediately after this sibling. Reference must share the same parent.
beforeNoPosition the task immediately before this sibling. Reference must share the same parent.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully covers behavior. Discloses side effects (changes sibling order, sets meta.syncPending = true), return structure, and the fact that OmniFocus has no numeric sibling index. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear, front-loaded purpose. Each sentence adds value: purpose, constraint, sibling differentiation, return format, side effects, examples. No redundant or vague statements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema and complex parameters, the description covers all essential aspects: return values, side effects, constraints, and examples. It is fully self-contained and leaves no major gaps for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). Description adds significant value by explaining the three positioning forms (before, after, at+in) and that exactly one must be set, plus two examples. This goes beyond the schema's individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Reorder an OmniFocus task among its siblings' with a specific verb and resource. It explicitly distinguishes from 'task_move' by noting that reparenting is handled by that sibling tool, making the differentiation strong.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use ('reorder among siblings') and when not to use ('Do NOT use to reparent'), along with the alternative ('prefer task_move'). Also states the constraint that exactly one positioning form must be set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_set_alarmsA

Replace the alarm/notification set on an OmniFocus task atomically. Pass an array of alarms; this overwrites any existing alarms in full. Each alarm is one of: {kind:'due-relative', offsetSeconds:N} (positive = before due date, negative = after), {kind:'defer-relative', offsetSeconds:N} (relative to defer date), or {kind:'absolute', fireAt:ISO-8601 string}. Relative kinds require the task to already have the corresponding date set, or the call returns a VALIDATION error. Use task_clear_alarms to remove all alarms with no payload. Returns the updated task. Mutations do not sync automatically — call sync_trigger if cross-device visibility matters. Example: task_set_alarms({ id: "abc123", alarms: [{ kind: "due-relative", offsetSeconds: 3600 }] }) Example: task_set_alarms({ id: "abc123", alarms: [{ kind: "absolute", fireAt: "2026-05-01T09:00:00Z" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the task to update. Get from task_list or search_query.
alarmsYesFull replacement set of alarms. Empty array is permitted and equivalent to task_clear_alarms.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: atomic replacement, requirement for task dates when using relative kinds, return of updated task, and the fact that mutations do not sync automatically (requires sync_trigger for cross-device visibility). It also notes that empty array is equivalent to task_clear_alarms. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph that includes the action, behavior, alternatives, error cases, and two examples. Every sentence contributes necessary information without redundancy, and it is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (2 parameters, no output schema, no nested objects, no annotations), the description is largely complete. It covers inputs, behavior, errors, alternatives, and syncing. A minor gap is that it doesn't detail the structure of the returned 'updated task', but given the absence of an output schema, this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds extra value beyond the schema by explaining the equivalence of empty array to task_clear_alarms, detailing the three kinds of alarms with examples, and clarifying the offsetSeconds sign meaning. This additional context justifies a score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Replace the alarm/notification set on an OmniFocus task atomically', specifying the verb 'replace' and the resource 'alarm/notification set on an OmniFocus task'. It distinguishes from the sibling tool 'task_clear_alarms' by noting that an empty array is equivalent, and provides examples showing usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use the tool (to replace alarms), mentions the alternative 'task_clear_alarms' for removing all alarms with no payload, and states the error condition where relative kinds require the task to already have the corresponding date set, returning a VALIDATION error. This provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_set_repetitionA

Set the repetition rule on an OmniFocus task. Overwrites any existing rule. Use task_clear_repetition to remove a rule entirely. Returns the updated task ID; call task_get for the full object. Mutations do not sync automatically — call sync_trigger if cross-device visibility matters. Example: task_set_repetition({ id: "abc123", rule: { method: "fixed", unit: "days", steps: 7 } }) Example: task_set_repetition({ id: "abc123", rule: { method: "start-again", unit: "weeks", steps: 1 } })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the task to update. Get from task_list or search_query.
ruleYesRepetition rule to apply. 'method': 'fixed' repeats on the original schedule, 'start-again' sets the next defer date from completion, 'due-again' sets the next due date from completion. 'unit': time unit for the interval. 'steps': how many units between occurrences (minimum 1). 'weekdays': optional array of day names — only valid when unit is 'weeks'. 'monthlyAnchor': optional day-of-month or weekday-position — only valid when unit is 'months'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description discloses behavioral traits: it overwrites existing rules, returns only the updated task ID (not full object), and mutations don't sync automatically. This is helpful, though it could include more on error handling or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two core sentences and two examples, all front-loaded and waste-free. Every sentence serves a purpose: stating action, overriding behavior, alternatives, return value, sync caveat, and illustrative examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with nested input and no output schema, the description covers key aspects: what it does, return format, sync behavior, and examples. It doesn't need to repeat schema details. A small gap is lack of mention of error scenarios or validation, but overall it's complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions. The description adds value through two examples showing valid rule structures, which helps clarify the nested object even though the schema already explains it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Set the repetition rule') and the resource ('OmniFocus task'). It distinguishes from the sibling tool 'task_clear_repetition' by mentioning its purpose for removal, and provides concrete examples showing usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description guides usage by noting when to use the alternative (task_clear_repetition to remove) and warns about sync behavior (call sync_trigger for cross-device visibility). However, it doesn't explicitly mention prerequisites (e.g., task must exist) or compare with other similar tools like task_set_alarms.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_set_waiting_onA

Record that an OmniFocus task is waiting on someone or something. Tags the task with the configured @waiting tag (creating the tag if absent) and writes a structured waiting-on fenced block to the top of the task note. The fence preserves any existing user prose in the note. Round-trips through task_get / task_get_many as a structured waitingOn field. Surfaces in the omnifocus://waiting-on resource sorted by days overdue. Use to systematize follow-ups; do NOT use for task completion or scheduling. Returns { id, waitingOn } with the persisted entry. Side effects: writes tag + note; sets meta.syncPending = true. Example: { "taskId": "abc123", "whom": "Alex", "what": "design review", "followUpAfter": "2026-05-05T17:00:00Z" }

ParametersJSON Schema
NameRequiredDescriptionDefault
whatNoOptional short description of what is being waited on.
whomYesPerson, team, or system being waited on. Required.
sinceNoISO-8601 date the wait began. Defaults to now. Use to backfill historical waits.
taskIdYesPersistent task ID.
followUpAfterNoISO-8601 date past which the agent should nudge if still unresolved. Drives daysOverdue in the omnifocus://waiting-on resource.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully carries the burden. It discloses side effects: writes tag + note, sets meta.syncPending = true. It also explains round-trips through task_get and the return format. No hidden behaviors omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: starts with purpose, then details of behavior, then usage guidelines, then return value and side effects. Every sentence adds value, no redundancy. Appropriate length for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and five parameters, the description covers all necessary aspects: purpose, parameters, side effects, return format, and usage context. It also mentions the waiting-on resource. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds significant meaning: explains whom as person/team/system, what as optional short description, since defaults to now and backfill use, followUpAfter drives daysOverdue. Provides an example call. This goes well beyond the schema's minimal descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool records that a task is waiting on someone/something, tags with @waiting, and writes a structured block. It distinguishes itself from siblings by specifying what it does not do (completion/scheduling) and mentioning related tools like task_clear_waiting_on. The verb 'Record' and resource 'task waiting on' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use to systematize follow-ups' and 'do NOT use for task completion or scheduling,' providing clear when-to and when-not-to guidance. Also mentions the omnifocus://waiting-on resource for surfacing results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_uncompleteA

Mark an OmniFocus task as incomplete — removes its completion timestamp. Idempotent: returns noChange: true if the task is already incomplete. Do not use to drop or delete a task. Returns { done: true, id, name } or { noChange: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: clears completedAt, sets meta.syncPending = true.Example: task_uncomplete({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent task ID.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses side effects (clears completedAt, sets syncPending), return value structure with noChange flag, and idempotency. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences plus an example. Front-loaded with action, then details and side effects. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return values and their semantics (done, noChange, name allows agent to describe change). Side effects are fully specified. Complete for a simple mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter fully described in schema (id with pattern and description). Description adds no extra meaning, but schema coverage is 100%, meeting baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states 'Mark an OmniFocus task as incomplete' with clear verb and resource. Distinguishes from siblings like task_complete and task_delete by noting it is the inverse of completion and not for deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns against using for drop/delete. Mentions idempotency. Lacks explicit comparison to batch variants like task_batch_uncomplete, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_undropA

Restore a dropped OmniFocus task — clears its dropped status and returns it to the active view. Idempotent: returns noChange: true if the task is not dropped. Do not use to complete a task. Returns { done: true, id, name } or { noChange: true, id, name } — name lets the agent describe the change without a follow-up read. Side effects: clears droppedAt, sets meta.syncPending = true.Example: task_undrop({ id: "abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent task ID.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects (clears droppedAt, sets meta.syncPending), return format (two possible objects), and idempotency. This is comprehensive for a single-operation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with purpose, and efficiently covers return types, side effects, and an example. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately explains return values, behavior, and side effects. It is complete for a simple restoration tool with one parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description for the 'id' parameter. The description adds an example call but does not enrich the parameter semantics beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Restore a dropped OmniFocus task — clears its dropped status and returns it to the active view,' which uses a specific verb ('restore') and resource ('dropped task'), and uniquely identifies the tool among many task-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear negative guidance ('Do not use to complete a task') and explains idempotent behavior, but does not explicitly compare to sibling tools like task_uncomplete or task_batch_undrop. However, the intent is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_updateA

Partially update mutable fields on an OmniFocus task. Only supplied fields are changed; omit a field to leave it unchanged. Do not use to complete or delete a task; prefer task_complete or task_delete instead. Two tag-update modes: (1) supply tagIds to replace the full tag set; (2) supply addTags and/or removeTags to apply a diff without reading first. Supplying tagIds together with addTags/removeTags is a ValidationError. setFlagged is a convenience alias for flagged. Safety controls: set dry_run=true to preview the patched task without mutating; pass expectedModifiedAt (from a recent task_get) to reject the call if the task changed since you read it; pass idempotency_key to coalesce retries so the same update is only performed once. Returns the updated task. Side effects: writes to OmniFocus, sets meta.syncPending = true. Call sync_trigger when you need changes to appear on other devices. Example: task_update({ id: "abc123", flagged: true }) Example: task_update({ id: "abc123", dueDate: "2026-05-01T00:00:00Z", addTags: ["tag456"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent task ID. Get from task_list or search_query.
nameNoNew task name. Must be non-empty if supplied.
noteNoPlain-text note. Pass null to clear. HTML round-trip available in M3.
tagIdsNoFull-replacement tag list. Replaces all existing tags. Mutually exclusive with addTags/removeTags.
addTagsNoTags to add. No-op for tags the task already has. Mutually exclusive with tagIds.
dry_runNoWhen true, validates input, computes the patched task (pre-fetch merged with the supplied fields), and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
dueDateNoISO-8601 due date with UTC offset. Pass null to clear.
flaggedNoFlag or unflag the task. Alias: setFlagged.
deferDateNoISO-8601 defer date with UTC offset. Pass null to clear.
removeTagsNoTags to remove. No-op for tags the task doesn't have. Mutually exclusive with tagIds.
sequentialNoWhether subtasks must be completed in order.
setFlaggedNoConvenience alias for flagged. Use when your intent is specifically to set or clear the flag without touching other fields.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency 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.
estimatedMinutesNoEstimated duration in minutes. Pass null to clear.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
expectedModifiedAtNoOptimistic-concurrency guard: ISO-8601 timestamp from a recent task_get. If the task's current modifiedAt differs, the call fails with OF_CONFLICT and no update is performed. Omit to skip the check.
completedByChildrenNoWhether the task completes when all children are complete.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description bears full burden. Discloses partial update behavior, side effects (writes to OmniFocus, meta.syncPending), safety controls, tag mode mutual exclusivity, and concurrency guard. Thoroughly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: purpose first, then exclusions, tag modes, safety controls, examples. Every sentence is meaningful. No fluff despite length. Front-loaded with essential info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 18 params, no output schema, description covers purpose, exclusions, tag behavior, safety controls, side effects, concurrency, and example usage. Adequately complete for a complex mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, so baseline 3. Description adds context by explaining tag update modes, safety controls, and alias (setFlagged). Provides examples. Adds value beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Partially update mutable fields on an OmniFocus task' and distinguishes from siblings by explicitly advising against using this for complete/delete, pointing to task_complete/task_delete. Also explains two tag-update modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and when-not-to-use guidance, naming alternatives. Explains tag modes, safety controls (dry_run, expectedModifiedAt, idempotency_key), and side effect of sync_trigger. Comprehensive context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_update_describeA

Preview what task_update would do without making any changes. Do NOT use to actually update a task — use task_update instead. Returns { description, plannedChanges } showing the fields that would be patched. No side effects: read-only by contract — never mutates OmniFocus. Example: dry-run companion — pass the same args you would to the write tool, inspect plannedChanges, then call the write tool once approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPersistent task ID. Get from task_list or search_query.
nameNoNew task name. Must be non-empty if supplied.
noteNoPlain-text note. Pass null to clear. HTML round-trip available in M3.
tagIdsNoFull-replacement tag list. Replaces all existing tags. Mutually exclusive with addTags/removeTags.
addTagsNoTags to add. No-op for tags the task already has. Mutually exclusive with tagIds.
dry_runNoWhen true, validates input, computes the patched task (pre-fetch merged with the supplied fields), and returns a preview envelope with meta.dryRun = true; no adapter call is made and no mutation occurs.
dueDateNoISO-8601 due date with UTC offset. Pass null to clear.
flaggedNoFlag or unflag the task. Alias: setFlagged.
deferDateNoISO-8601 defer date with UTC offset. Pass null to clear.
removeTagsNoTags to remove. No-op for tags the task doesn't have. Mutually exclusive with tagIds.
sequentialNoWhether subtasks must be completed in order.
setFlaggedNoConvenience alias for flagged. Use when your intent is specifically to set or clear the flag without touching other fields.
dueDateFloatingNoWhen true, the due time is floating (follows the user across time zones).
idempotency_keyNoIdempotency 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.
estimatedMinutesNoEstimated duration in minutes. Pass null to clear.
deferDateFloatingNoWhen true, the defer time is floating (follows the user across time zones).
expectedModifiedAtNoOptimistic-concurrency guard: ISO-8601 timestamp from a recent task_get. If the task's current modifiedAt differs, the call fails with OF_CONFLICT and no update is performed. Omit to skip the check.
completedByChildrenNoWhether the task completes when all children are complete.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It states 'No side effects: read-only by contract — never mutates OmniFocus,' which is a key behavioral trait. It also mentions the return envelope format. However, it does not detail error conditions (e.g., invalid id) or behavior when dry_run parameter is not set (the parameter exists in schema but not mentioned in description). Still, the main behavioral aspect is well-covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with four sentences covering purpose, warning, output, and usage. It is clear and efficient, but could be slightly more structured (e.g., bullet points for key points). No unnecessary words, but not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is a dry-run preview with no output schema, the description explains the return value (plannedChanges) and the read-only nature. It also gives a usage example. However, it omits mention of the dry_run parameter (exists in schema) and does not cover what happens if the update would fail validation, which would be useful for a preview tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not add per-parameter detail beyond the schema; it does add overall context (same args as task_update, returns plannedChanges). But since schema already has thorough descriptions, the description does not significantly improve parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it previews task_update without making changes, explicitly distinguishes from task_update, and specifies the output (description, plannedChanges). The verb 'preview' and resource are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use (before task_update), when not to use (not for actual updates), and provides a usage pattern: pass same args, inspect plannedChanges, then call write tool. It names the alternative (task_update) and explains the companion relationship.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_deleteA

Delete a registered outbound webhook by name. Idempotent — returns noChange:true when the named webhook does not exist. Off by default — requires OMNIFOCUS_WEBHOOKS_ENABLED=1. Do NOT use this for bulk-clear operations; this tool removes exactly one entry. Returns { name, deleted:true } or { name, noChange:true }. Side effects: rewrites the registry config file at ~/Library/Application Support/omnifocus-mcp/webhooks.json. Example: webhook_delete({ name: "slack-billing" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the registered webhook to delete. Idempotent — unknown names return noChange:true.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses idempotency (returns noChange:true for unknown names), side effects (rewrites config file), and configuration requirement (off by default).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences with front-loaded purpose. Includes a valuable example but is slightly lengthy. Generally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers return values, side effects, and configuration. For a simple delete tool with one parameter, it provides all necessary context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the name parameter's idempotency and return behavior. The description does not add additional parameter meaning beyond what is in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes a registered outbound webhook by name, distinguishing it from sibling tools like webhook_list, webhook_register, and webhook_test. It specifies it removes exactly one entry and is idempotent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (delete a specific webhook by name) and when not to use (not for bulk-clear operations). Also notes the requirement for environment variable OMNIFOCUS_WEBHOOKS_ENABLED=1.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_listA

List every registered outbound webhook by name, trigger, and createdAt timestamp. URLs and secrets are NEVER surfaced — only metadata safe to display. Use this to confirm what's wired up; delete unwanted entries via webhook_delete. Off by default — requires OMNIFOCUS_WEBHOOKS_ENABLED=1. Do NOT use this to retrieve URLs or secrets — by design they remain on-disk only. Returns { webhooks: WebhookSummary[] } in registration order. Read-only; safe to call repeatedly. Example: webhook_list()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses read-only nature, absence of URLs/secrets in output, environment variable requirement (OMNIFOCUS_WEBHOOKS_ENABLED=1), and return order. Fully transparent about all behavioral traits beyond what schema or annotations (none) provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with front-loaded purpose, but contains several sentences that could potentially be condensed. Still efficient and earns its length with useful details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description fully covers return format, order, safety characteristics, and configuration requirement. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist in schema (0 params), so baseline is 4. Description adds no parameter info, but none is needed. No improvement possible.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists webhooks by name, trigger, and createdAt. It distinguishes from sibling tools like webhook_delete and webhook_register, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises when to use (confirm wired-up webhooks) and when not to (retrieve URLs/secrets). References alternative tool webhook_delete. Provides clear context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_registerA

Register an outbound webhook that fires when an OmniFocus state change matches the supplied trigger. Off by default — requires OMNIFOCUS_WEBHOOKS_ENABLED=1 in the environment, mirroring the raw-script gating. URLs must use https:// (http:// is rejected at registration). An optional secret enables HMAC-SHA256 signature verification by the receiver via X-OmniFocus-Signature: sha256=; the secret is stored on disk only and is never echoed back through any tool response. Do NOT use this to call this MCP server itself — webhooks are outbound only. Returns { webhook: WebhookSummary } where the summary omits both URL and secret. Side effects: writes to the registry config file at ~/Library/Application Support/omnifocus-mcp/webhooks.json (mode 0600). Example: webhook_register({ name: "slack-billing", url: "https://hooks.slack.com/services/...", trigger: { on: "task-completed", filter: { tagId: "tag_xyz" } } })

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesOutbound HTTPS URL. http:// is rejected at registration (per ADR-0016 §4b).
nameYesStable name for the webhook. Unique within the registry; used as the lookup key. ≤64 chars, no whitespace.
secretNoOptional HMAC seed (8–256 chars). When set, every delivery includes an X-OmniFocus-Signature: sha256=<hex> header so the receiver can verify authenticity. Stored on disk only; never echoed.
triggerYesWhat triggers a webhook fire — one of task-completed, task-created, or project-status-changed. Each variant accepts an optional filter narrowing which entities count.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: the environment gating, URL rejection, secret handling (never echoed, stored on disk only), return value omission, side effects (writes to config file with mode 0600), and the outbound-only nature. This is highly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with the core purpose, followed by constraints, behavioral details, side effects, and an example. Every sentence adds value, and it is appropriately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 4 parameters and nested trigger objects, the description covers all essential aspects: purpose, prerequisites, behavioral details, side effects, return value, and an example. It is complete for an agent to correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the description adds limited new meaning beyond the schema. It provides an example and contextual warnings (e.g., 'Do NOT use this to call this MCP server itself'), but the parameter descriptions are already detailed in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Register an outbound webhook that fires when an OmniFocus state change matches the supplied trigger.' It uses specific verbs and resources, and distinguishes from sibling tools like webhook_delete, webhook_list, and webhook_test.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use the tool, including the environment variable requirement and the HTTPS-only URL constraint. It warns against using it to call the MCP server itself. However, it does not explicitly compare to other webhook tools or specify when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_testA

Fire a synthetic event through a registered webhook to verify it's wired correctly. Goes through the same HTTPS POST + HMAC + retry + circuit-breaker path as a real delivery — if the receiver doesn't see this event, it won't see real ones either. Off by default — requires OMNIFOCUS_WEBHOOKS_ENABLED=1. Do NOT use this for load testing — circuit-breaker counters apply to synthetic events too. Returns { name, delivered: true } on dispatch success, { name, error } when the webhook is not registered. Note: 'delivered' means the dispatcher attempted delivery; the receiver's actual response is not surfaced (per ADR-0016 §4e: failures log to stderr, never throw upward). Side effects: makes one outbound HTTPS POST to the registered URL with a synthetic event payload. Example: webhook_test({ name: "slack-billing" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the registered webhook to fire a synthetic event through.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description bears full burden. It discloses HTTPS POST with HMAC/retry/circuit-breaker, off-by-default, side effects (outbound POST), return values, and that 'delivered' means attempted delivery only. Also references ADR for logging behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is efficiently structured with purpose first, followed by operational details, warnings, return info, notes, and example. No filler; each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter testing tool with no output schema, the description covers all necessary aspects: purpose, mechanics, prerequisites, constraints, return format, side effects, and an example. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds example usage and clarifies the parameter's role beyond the schema description. While not necessary, the example enhances understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fires a synthetic event through a registered webhook to verify wiring. It distinguishes from sibling tools like webhook_register and webhook_list by focusing on testing. The verb 'fire' and resource 'webhook' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (verify webhook wiring) and when not to use (load testing). Mentions prerequisite environment variable. Does not require alternative tool mention as siblings are distinct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

window_get_stateA

Read the active perspective and focus container of the front OmniFocus window. UI-affecting tool family — only meaningful in pair-assistant flows where the user is looking at OmniFocus. Headless agents should ignore. Use when the agent needs to know what view the user currently sees, or to confirm that a prior window_set_* took effect. Do NOT use to evaluate a perspective's data — prefer perspective_evaluate, which doesn't depend on UI state. Takes no arguments. Returns { perspectiveName: string | null, focusContainerIds: string[] } — perspectiveName is null when no perspective is bound; focusContainerIds is [] when the window isn't focused on a project or folder. Errors: OF_WINDOW_UNAVAILABLE when OmniFocus has no front window. Read-only; safe to retry. Example: window_get_state()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description fully covers behavior: read-only, safe to retry, explains return values (including null/empty cases), and lists error conditions. No hidden traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with purpose first, then usage guidance, return details, errors, and example. Slightly verbose with example, but each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no parameters and no output schema, the description covers purpose, usage, return format, errors, and read-only nature. Complete and actionable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so schema coverage is 100%. Description explicitly confirms 'Takes no arguments,' which adds clarity beyond the empty schema. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the active perspective and focus container. It distinguishes from sibling tools like window_set_* and perspective_evaluate, making its unique purpose evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (to know current view, confirm prior set), when not to use (for data evaluation), and gives context for pair-assistant flows vs headless agents. Also provides alternative tool perspective_evaluate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

window_set_focusA

Set or clear the front OmniFocus window's focus container (a project or folder). UI-affecting tool — only meaningful when the user can see OmniFocus. Headless agents should not fire this. Use when the user asks 'focus on this project' or a guided flow wants to scope the visible view. Do NOT use to filter task data — prefer task_list { projectId } or perspective_evaluate instead, both of which work without touching the user's UI. Pass containerId (a ProjectId or FolderId) to focus, or null to clear focus. Returns { focusContainerIds: string[] } — single-element array when focused, [] when cleared. Errors: OF_WINDOW_UNAVAILABLE (no front window), OF_NOT_FOUND (containerId is neither a project nor a folder). Side effects: changes the user's visible window state; no data caches invalidated. Example: window_set_focus({ containerId: "prj123" }) Example: window_set_focus({ containerId: null })

ParametersJSON Schema
NameRequiredDescriptionDefault
containerIdYesProjectId or FolderId to focus the front window on, or null to clear focus.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavioral traits: UI-affecting, changes visible window state, no data cache invalidation, return structure, error types (OF_WINDOW_UNAVAILABLE, OF_NOT_FOUND), and side effects. It also warns headless agents should not fire this, providing complete transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

All sentences are information-dense and purposeful. Well-structured: purpose first, then UI warning, usage guidance, alternatives, parameter detail, return value, errors, side effects, examples. No redundant text; every part earns its place under 10 sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a UI-affecting tool without an output schema, the description is complete. It covers purpose, usage boundaries, parameter semantics, return format, error conditions, and side effects. No gaps remain for an agent to safely use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, but description adds significant meaning: explains that containerId can be a ProjectId or FolderId to set focus, or null to clear. Includes two concrete examples (prj123, null) and clarifies the effect on return value. This far exceeds basic schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it sets/clears the focus container (project/folder) on the front OmniFocus window. It contrasts with siblings like task_list and perspective_evaluate by explicitly stating not to use for filtering data, and notes that headless agents should avoid it. This makes the purpose distinct and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: when user says 'focus on this project' or for guided flows. Also gives when-not-to-use: headless agents and for filtering task data. Points to specific alternatives (task_list with projectId, perspective_evaluate) that work without affecting UI.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

window_set_perspectiveA

Switch the front OmniFocus window to a named perspective (built-in or custom). UI-affecting tool — only meaningful when the user can see OmniFocus. Headless agents should not fire this. Use when the user asks 'show me my flagged tasks' or a guided weekly-review prompt wants to navigate the user's UI. Do NOT use to evaluate a perspective's results — prefer perspective_evaluate, which doesn't touch the user's UI. Pass perspectiveName (case-sensitive, matches OF's UX). Built-in names: Inbox, Projects, Tags, Forecast, Flagged, Review, Nearby, Completed, Changed. Returns { perspectiveName }. Errors: OF_WINDOW_UNAVAILABLE (no front window), OF_NOT_FOUND (no perspective with this name). Side effects: changes the user's visible window state; no data caches invalidated. Example: window_set_perspective({ perspectiveName: "Flagged" })

ParametersJSON Schema
NameRequiredDescriptionDefault
perspectiveNameYesName of the perspective to activate. Case-sensitive. Built-in or custom perspectives both work.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations present, but description fully discloses UI-affecting nature, side effects (visible window changes, no cache invalidation), errors (OF_WINDOW_UNAVAILABLE, OF_NOT_FOUND), and return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections, though slightly verbose. Every sentence adds value, including warnings, usage, and examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return format ({ perspectiveName }). Covers parameter details, errors, side effects, and usage context completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers perspectiveName with description; description adds case-sensitivity, built-in name list, and example, exceeding schema info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool switches the front OmniFocus window to a named perspective, listing built-in names and custom perspectives. Distinguishes from perspective_evaluate for evaluating results.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use (user requests like 'show flagged tasks' or guided review) and when not (headless agents), with alternative perspective_evaluate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 146 tool updatesv2.0.2
    • First observedapp_launch
    • First observedapp_window_new
    • First observedapp_window_new_tab
    • First observedattachment_add
    • First observedattachment_create
    • First observedattachment_delete
    • First observedattachment_list
    • First observedattachment_remove
    • First observedattachment_save_to_path
    • First observedchanges_since
    • First observedclarify
    • First observeddatabase_redo
    • First observeddatabase_undo
    • First observeddecision_clear
    • First observeddecision_record
    • First observedexport_opml
    • First observedexport_taskpaper
    • First observedfolder_create
    • First observedfolder_create_describe
    • First observedfolder_delete
    • First observedfolder_delete_describe
    • First observedfolder_get
    • First observedfolder_list
    • First observedfolder_move
    • First observedfolder_move_describe
    • First observedfolder_update
    • First observedfolder_update_describe
    • First observedforecast_get
    • First observedforecast_get_tag
    • First observedforecast_pack
    • First observedforecast_set_tag
    • First observedimport_opml
    • First observedimport_taskpaper
    • First observedinternal_status
    • First observednote_append
    • First observednote_get
    • First observednote_get_html
    • First observednote_set
    • First observednote_set_html
    • First observedomnifocus_doctor
    • First observedperspective_create
    • First observedperspective_delete
    • First observedperspective_evaluate
    • First observedperspective_evaluate_dry_run
    • First observedperspective_get
    • First observedperspective_list
    • First observedperspective_update
    • First observedplugin_invoke
    • First observedproject_batch_complete
    • First observedproject_batch_drop
    • First observedproject_complete
    • First observedproject_complete_describe
    • First observedproject_create
    • First observedproject_create_describe
    • First observedproject_delete
    • First observedproject_delete_describe
    • First observedproject_drop
    • First observedproject_drop_describe
    • First observedproject_get
    • First observedproject_get_many
    • First observedproject_list
    • First observedproject_mark_reviewed
    • First observedproject_move
    • First observedproject_move_describe
    • First observedproject_set_next_review_date
    • First observedproject_template_delete
    • First observedproject_template_instantiate
    • First observedproject_template_list
    • First observedproject_template_save
    • First observedproject_update
    • First observedproject_update_describe
    • First observedrepetition_from_prose
    • First observedreview_list_due
    • First observedreview_mark_reviewed
    • First observedreview_set_interval
    • First observedsearch_query
    • First observedsync_status
    • First observedsync_trigger
    • First observedtag_create
    • First observedtag_create_describe
    • First observedtag_delete
    • First observedtag_delete_describe
    • First observedtag_get
    • First observedtag_get_location
    • First observedtag_get_many
    • First observedtag_list
    • First observedtag_move
    • First observedtag_move_describe
    • First observedtag_set_allows_next_action
    • First observedtag_set_location
    • First observedtag_set_status
    • First observedtag_update
    • First observedtag_update_describe
    • First observedtask_batch_assign
    • First observedtask_batch_complete
    • First observedtask_batch_create
    • First observedtask_batch_create_describe
    • First observedtask_batch_defer_smart
    • First observedtask_batch_delete
    • First observedtask_batch_drop
    • First observedtask_batch_move
    • First observedtask_batch_uncomplete
    • First observedtask_batch_undrop
    • First observedtask_batch_update
    • First observedtask_batch_update_describe
    • First observedtask_clear_alarms
    • First observedtask_clear_repetition
    • First observedtask_clear_waiting_on
    • First observedtask_complete
    • First observedtask_complete_describe
    • First observedtask_convert_to_project
    • First observedtask_create
    • First observedtask_create_describe
    • First observedtask_defer_smart
    • First observedtask_delete
    • First observedtask_delete_describe
    • First observedtask_drop
    • First observedtask_drop_describe
    • First observedtask_duplicate
    • First observedtask_extract_from_image
    • First observedtask_extract_from_note
    • First observedtask_find_by_name
    • First observedtask_find_similar
    • First observedtask_get
    • First observedtask_get_many
    • First observedtask_list
    • First observedtask_move
    • First observedtask_move_describe
    • First observedtask_parse_transport_text
    • First observedtask_reclassify
    • First observedtask_reorder
    • First observedtask_search
    • First observedtask_set_alarms
    • First observedtask_set_repetition
    • First observedtask_set_waiting_on
    • First observedtask_uncomplete
    • First observedtask_undrop
    • First observedtask_update
    • First observedtask_update_describe
    • First observedwebhook_delete
    • First observedwebhook_list
    • First observedwebhook_register
    • First observedwebhook_test
    • First observedwindow_get_state
    • First observedwindow_set_focus
    • First observedwindow_set_perspective

TDQS

A4.1/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, with detailed descriptions that explicitly state when to use which. Overlapping concerns are minimized through precise naming and usage guidance, e.g., task_find_by_name vs task_search vs search_query each target different search modes.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern (e.g., task_create, folder_list) with a cohesive sub-naming for batch operations (task_batch_*) and describe variants. Minor exceptions like 'clarify' are single-purpose helpers that do not break the overall pattern.

Tool Count1/5

With 146 tools, the server far exceeds the recommended range. Even considering the complexity of OmniFocus, the count is extreme and likely overwhelms agents, with many redundant describe variants and separate tools that could be merged.

Completeness5/5

The server covers the full lifecycle of tasks, projects, folders, tags, perspectives, attachments, notes, reviews, sync, webhooks, and UI control. It includes batch operations, search, forecasting, templates, and advanced features like decisions and waiting-on, leaving no obvious gaps.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/torsday/omnifocus-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server