Skip to main content
Glama
Todoist AI MCP Server
by Doist

Todoist MCP Server

Library for connecting AI agents to Todoist. Includes tools that can be integrated into LLMs, enabling them to access and modify a Todoist account on the user's behalf.

These tools can be used both through an MCP server, or imported directly in other projects to integrate them to your own AI conversational interfaces.

Using tools

1. Add this repository as a dependency

npm install @doist/todoist-mcp

2. Import the tools and plug them to an AI

Here's an example using Vercel's AI SDK.

import { findTasksByDate, addTasks } from '@doist/todoist-mcp'
import { TodoistApi } from '@doist/todoist-sdk'
import { streamText } from 'ai'

// Create Todoist API client
const client = new TodoistApi(process.env.TODOIST_API_KEY)

// Helper to wrap tools with the client
function wrapTool(tool, todoistClient) {
    return {
        ...tool,
        execute(args) {
            return tool.execute(args, todoistClient)
        },
    }
}

const result = streamText({
    model: yourModel,
    system: 'You are a helpful Todoist assistant',
    tools: {
        findTasksByDate: wrapTool(findTasksByDate, client),
        addTasks: wrapTool(addTasks, client),
    },
})

Related MCP server: Todoist MCP Server

Using as an MCP server

Quick Start

You can run the MCP server directly with npx:

npx @doist/todoist-mcp

Setup Guide

The Todoist MCP server is available as a streamable HTTP service for easy integration with various AI clients:

Primary URL (Streamable HTTP): https://ai.todoist.net/mcp

Claude Desktop

  1. Open Settings → Connectors → Add custom connector

  2. Enter https://ai.todoist.net/mcp and complete OAuth authentication

Cursor

Create a configuration file:

  • Global: ~/.cursor/mcp.json

  • Project-specific: .cursor/mcp.json

{
    "mcpServers": {
        "todoist": {
            "command": "npx",
            "args": ["-y", "mcp-remote", "https://ai.todoist.net/mcp"]
        }
    }
}

Then enable the server in Cursor settings if prompted.

Claude Code (CLI)

The fastest setup is the official Todoist plugin, which wires up the MCP server for you:

/plugin marketplace add doist/todoist-mcp
/plugin install todoist@doist

OAuth runs in your browser the first time you use a Todoist tool. See Anthropic's plugin docs for more.

If you'd rather configure the MCP server manually, run:

claude mcp add --transport http todoist https://ai.todoist.net/mcp

Then launch claude, execute /mcp, and select the todoist MCP server to authenticate.

Visual Studio Code

  1. Open Command Palette → MCP: Add Server

  2. Select HTTP transport and use:

{
    "servers": {
        "todoist": {
            "type": "http",
            "url": "https://ai.todoist.net/mcp"
        }
    }
}

Other MCP Clients

npx -y mcp-remote https://ai.todoist.net/mcp

For more details on setting up and using the MCP server, including creating custom servers, see docs/mcp-server.md.

Features

A key feature of this project is that tools can be reused, and are not written specifically for use in an MCP server. They can be hooked up as tools to other conversational AI interfaces (e.g. Vercel's AI SDK).

This project is in its early stages. Expect more and/or better tools soon.

Nevertheless, our goal is to provide a small set of tools that enable complete workflows, rather than just atomic actions, striking a balance between flexibility and efficiency for LLMs.

For our design philosophy, guidelines, and development patterns, see docs/tool-design.md.

Available Tools

For a complete list of available tools, see the src/tools directory.

OpenAI MCP Compatibility

This server includes search and fetch tools that follow the OpenAI MCP specification, enabling seamless integration with OpenAI's MCP protocol. These tools return JSON-encoded results optimized for OpenAI's requirements while maintaining compatibility with the broader MCP ecosystem.

Dependencies

MCP Server Setup

See docs/mcp-server.md for full instructions on setting up the MCP server.

Local Development Setup

See docs/dev-setup.md for full setup instructions and CONTRIBUTING.md for contributor workflows and quality checks.

MCP Apps

This project includes support for MCP Apps – interactive UI widgets rendered inline in AI chat interfaces. Widgets provide rich visual representations of tool outputs (e.g., task lists) instead of plain text.

See docs/mcp-apps.md for the widget architecture, build pipeline, and development workflow.

Quick Start

After cloning and setting up the repository:

  • npm start - Build and run the MCP inspector for testing

  • npm run dev - Development mode with auto-rebuild and restart

  • npm run tool:list - List available tools for direct execution

  • npm run tool -- <tool-name> '<json-args>' - Run a tool directly without MCP

When using npm run tool, include -- before tool arguments so npm forwards them to scripts/run-tool.ts.

Example check before write operations: npm run tool -- user-info '{}' This confirms which Todoist account the current TODOIST_API_KEY is connected to.

run-tool uses TODOIST_API_KEY from your .env file (created from .env.example by npm run setup). Use a test account or a temporary project when running write operations to avoid modifying real data.

Contributing

See CONTRIBUTING.md for:

  • Development workflow

  • Running tools directly with scripts/run-tool.ts

  • Testing and quality checks

  • Commit conventions

Releasing

This project uses release-please to automate version management and package publishing.

How it works

  1. Make your changes using Conventional Commits:

    • feat: for new features (minor version bump)

    • fix: for bug fixes (patch version bump)

    • feat!: or fix!: for breaking changes (major version bump)

    • docs: for documentation changes

    • chore: for maintenance tasks

    • ci: for CI changes

  2. When commits are pushed to main:

    • Release-please automatically creates/updates a release PR

    • The PR includes version bump and changelog updates

    • Review the PR and merge when ready

  3. After merging the release PR:

    • A new GitHub release is automatically created

    • A new tag is created

    • The publish workflow is triggered

    • The package is published to npm

Available Tools

47 tools
add-commentsA

Add multiple comments to tasks or projects, optionally notifying collaborators. Each comment must specify either taskId or projectId.

NameRequiredDescriptionDefault
commentsYesThe array of comments to add.

Output Schema

NameRequiredDescription
commentsYesThe created comments.
failuresYesComments that could not be added, identified by their content, with the reason for each.
totalCountYesThe total number of comments created.
failureCountYes
successCountYes
totalRequestedYes
addedCommentIdsYesThe IDs of the added comments.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive, open-world write, so the safety profile is covered. The description adds that the tool operates in batch and that notification is opt-in, which is useful context. What it omits is meaningful for a batch mutation: no statement about partial-failure semantics, duplicate handling, or permission requirements.

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 short sentences, zero filler, with the batch scope and the per-item ID constraint front-loaded. Each sentence carries distinct 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?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description covers the batch shape and the ID constraint. It is only marginally incomplete in not resolving whether both taskId and projectId may be supplied on the same comment.

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 would be 3. The description genuinely adds meaning by stating that each comment must carry either taskId or projectId — a mutual-requirement constraint the schema does not encode (neither field is individually required and there is no oneOf). That is real value beyond the structured 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?

States a specific verb ('Add') and resource ('comments') with the batch aspect ('multiple') and the two valid parent resources (tasks or projects) made explicit. It is clearly distinguishable in verb from siblings like find-comments and update-comments, though it never names them directly.

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

Usage Guidelines3/5

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

'Optionally notifying collaborators' and 'Each comment must specify either taskId or projectId' give preconditions for a valid call. However, there is no explicit guidance on when to use this versus update-comments (editing an existing comment) or find-comments, leaving the agent to infer the choice from the verb alone.

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

add-filtersA

Add one or more new personal filters. Filters are saved custom views using query syntax to organize tasks.

NameRequiredDescriptionDefault
filtersYesThe array of filters to add.

Output Schema

NameRequiredDescription
filtersYesThe created filters.
failuresYesFilters that could not be created, with the reason for each.
totalCountYesThe total number of filters created.
failureCountYes
successCountYes
totalRequestedYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this as a non-read-only, non-idempotent, non-destructive mutation. The description adds useful domain context that filters are personal saved views using query syntax, but it does not disclose duplicate-name behavior, validation failures, or what is returned.

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 two concise sentences with no wasted wording. The primary action is front-loaded, followed by a useful clarification of what a filter is.

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 create operation with full schema coverage, annotations, and an output schema, the description is largely complete. A minor gap is that it does not mention duplicate handling or error behavior, but nothing essential for invocation is missing.

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 the filters array, required name and query fields, color, favorite status, and description. The description only adds that one or more filters are accepted and that queries use syntax, matching rather than exceeding the schema baseline.

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 states a specific verb and resource: adding new personal filters, described as saved custom views using query syntax. It distinguishes creation from updating or finding filters only implicitly through 'new', but an agent can tell what the tool does.

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

Usage Guidelines3/5

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

Usage is implied: use this when creating one or more new personal filters. However, the description does not explicitly contrast with update-filters or find-filters, nor does it state conditions such as handling existing filters.

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

add-labelsC

Add one or more new personal labels.

NameRequiredDescriptionDefault
labelsYesThe array of labels to add.

Output Schema

NameRequiredDescription
labelsYesThe created labels.
failuresYesLabels that could not be created, with the reason for each.
totalCountYesThe total number of labels created.
failureCountYes
successCountYes
totalRequestedYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnly=false, destructive=false and idempotent=false, so the safety profile is covered. The description adds only that labels are 'personal', and says nothing about duplicate-name behavior, partial-batch failure, or whether later calls overwrite prior labels — gaps that matter for a non-idempotent create.

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?

A single front-loaded sentence with zero waste. It is efficiently written, though its brevity leaves real questions unanswered rather than being a model of structured guidance.

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

Completeness3/5

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

With rich schema coverage, full annotations and an output schema, the definition is minimally sufficient to invoke the tool. It is incomplete on batch semantics — whether one invalid or duplicate label fails the whole array — which is the main thing an agent can't derive from structured fields.

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% and the nested label object documents name, color (including fallback to charcoal), order and isFavorite in detail. The description contributes nothing beyond the schema, so the baseline of 3 applies.

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?

States a specific verb (add) and resource (new personal labels) with a scope qualifier ('personal') that hints at non-shared labels. It does not explicitly distinguish itself from update-labels or add-projects, so an agent must infer the boundary from the name alone.

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?

There is no when-to-use guidance, no exclusion against update-labels for existing labels, and no mention of what happens if a label name already exists. The only implicit signal is 'new', which the agent must interpret on its own.

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

add-projectsC

Add one or more new projects.

NameRequiredDescriptionDefault
projectsYesThe array of projects to add.

Output Schema

NameRequiredDescription
failuresYesProjects that could not be created, with the reason for each.
projectsYesThe created projects.
totalCountYesThe total number of projects created.
failureCountYes
successCountYes
totalRequestedYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already disclose that this is a non-read-only, non-idempotent, non-destructive mutation. The description adds no behavioral context such as duplicate handling, required permissions, or side effects beyond what annotations provide.

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

Conciseness3/5

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

The single sentence is front-loaded and free of fluff, but it is severely under-specified for a creation tool with a rich nested schema. Brevity here reflects omission rather than optimized conciseness.

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

Completeness3/5

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

The schema and annotations cover most invocation details, and the output schema means return values need not be described. However, the description lacks usage and behavioral context that would help an agent choose and call this tool confidently.

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%, and the nested project fields are fully documented in the schema. The description adds no parameter meaning beyond the schema, so the baseline of 3 is appropriate.

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 states a specific verb and resource: 'Add one or more new projects.' It clearly conveys project creation and batch scope, but does not differentiate from siblings such as update-projects or add-tasks.

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 when-to-use guidance, prerequisites, or alternatives. It does not mention when to choose add-projects over update-projects or find-projects.

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

add-remindersA

Add reminders to tasks. Supports three types: "relative" (minutes before due), "absolute" (specific date/time), or "location" (geofence-triggered). Each reminder must specify a taskId. Reminders notify their creator unless notifyUser says otherwise.

NameRequiredDescriptionDefault
remindersYesArray of reminders to create (max 25). Each reminder must specify a type: "relative" (minutes before due), "absolute" (specific date/time), or "location" (geofence trigger).

Output Schema

NameRequiredDescription
failuresYesReminders that could not be created, with the reason for each.
remindersYesThe created reminders.
totalCountYesTotal number of reminders created.
failureCountYes
successCountYes
totalRequestedYes
addedReminderIdsYesIDs of the created reminders.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral default — reminders notify their creator unless notifyUser says otherwise — but says nothing about duplicate handling or whether re-adding the same reminder is safe, which matters given idempotentHint=false.

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 tight sentences, front-loaded with the action and the type taxonomy, then the taskId requirement, then the recipient default. Nothing is wasted and no sentence repeats another.

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 an output schema, full annotation coverage, and a rich oneOf schema, the description supplies what structured fields cannot: the type taxonomy framing and the default recipient rule. The remaining gap is routing relative to update-reminders, which the sibling list makes relevant.

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 taskId, minuteOffset, due, locLat/locLong, service, etc. The description only restates the type taxonomy at a high level ("relative" minutes before due, "absolute" specific date/time, "location" geofence), adding framing but no field-level detail 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 opens with a specific verb+resource ("Add reminders to tasks") and enumerates the three supported reminder types, so an agent knows exactly what the tool produces. It does not, however, differentiate itself from the sibling update-reminders or find-reminders, which keeps it short of a 5.

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

Usage Guidelines3/5

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

"Each reminder must specify a taskId" and the type breakdown imply when the tool applies (creating new reminders on existing tasks), but there is no explicit guidance on when to use this versus update-reminders/find-reminders, nor any stated prerequisites such as collaboration on the task's project.

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

add-sectionsC

Add one or more new sections to projects.

NameRequiredDescriptionDefault
sectionsYesThe array of sections to add.

Output Schema

NameRequiredDescription
failuresYesSections that could not be created, with the reason for each.
sectionsYesThe created sections.
totalCountYesThe total number of sections created.
failureCountYes
successCountYes
totalRequestedYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that: it does not say what happens on duplicate section names (relevant given idempotentHint=false), whether the batch is atomic, or whether permissions are required.

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?

A single front-loaded sentence with zero filler. It is arguably too terse for the tool's complexity, but that gap is captured under contextual completeness rather than counted as verbosity here.

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

Completeness3/5

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

Output schema and rich annotations reduce the burden, and the schema fully documents the single nested parameter. Still missing is anything about duplicate handling, batch failure semantics, or ordering of created sections, which matters for a non-idempotent create 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%, with nested field descriptions for name, projectId (including the 'inbox' sentinel) and description already documented. The description contributes no parameter meaning beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource ('Add ... new sections to projects') and makes the batch nature explicit with 'one or more.' It is distinguishable from update-sections/find-sections by convention, but the description never names them, so sibling differentiation is only implicit.

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?

No when-to-use guidance, no exclusions, no mention of update-sections as the alternative for modifying existing sections. The only signal is the verb 'Add', which the agent must infer from the name.

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

add-tasksB

Add one or more tasks to a project, section, or parent. Supports assignment to project collaborators.

NameRequiredDescriptionDefault
tasksYesThe array of tasks to add (max 25).

Output Schema

NameRequiredDescription
tasksYesThe created tasks.
failuresYesTasks that could not be created, with the reason for each.
totalCountYesThe total number of tasks created.
failureCountYes
successCountYes
totalRequestedYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the mutation profile is covered. The description's only added claim, 'supports assignment to project collaborators', is already documented on the responsibleUser property, and it says nothing about batch partial-failure behavior or the collaborator-membership prerequisite beyond what the schema states.

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?

Two compact sentences with the verb and targets front-loaded, no filler. It is efficient but so terse that it barely engages with a fairly complex batch payload.

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

Completeness3/5

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

An output schema and full parameter documentation exist, so return values need not be explained. However, for a non-idempotent batch mutation this description omits the 25-task cap, duplicate-risk on retry, and what happens if only some tasks in the array fail – gaps that matter for correct invocation.

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% and the nested task properties are richly documented, so the baseline of 3 applies. The description adds only the vague 'one or more' framing and the container list, without any syntax, ordering, or required-field guidance 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?

States a specific verb (add) and resource (tasks) plus the three target containers (project, section, parent), so an agent can distinguish it from update-tasks or add-sections. It stops short of explicitly naming the sibling it supersedes for modification.

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

Usage Guidelines3/5

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

The phrase 'Add one or more tasks to a project, section, or parent' implies the usage context (task creation, batch-capable), but it never states when to prefer this over update-tasks or when to use add-sections instead. Usage is inferable rather than explained.

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

analyze-project-healthA
Idempotent

Trigger a new health analysis for a project. Use this when the health data is stale or you want a fresh assessment. The analysis may take time to complete — use get-project-health afterward to see updated results.

NameRequiredDescriptionDefault
projectIdYesThe ID of the project to analyze. This triggers a new health analysis which may take some time to complete.

Output Schema

NameRequiredDescription
healthYesThe health response returned after triggering analysis.
messageYesA human-readable message about the analysis status.
projectIdYesThe project ID.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context about the asynchronous nature: 'The analysis may take time to complete.' This goes beyond the annotations by telling the agent to expect a delay and to poll get-project-health for results.

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 two sentences with zero waste. It front-loads the action, then adds usage guidance and a timing caveat. Every word 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 single-parameter, non-destructive tool with an output schema and a clear sibling for retrieval, the description covers the trigger condition, the async nature, and the follow-up step. It is 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%: the single parameter projectId is fully described in the schema with 'The ID of the project to analyze. This triggers a new health analysis which may take some time to complete.' The tool description does not add further parameter semantics, so the baseline of 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 action: 'Trigger a new health analysis for a project.' It uses a specific verb (trigger) and resource (project health), distinguishing it from siblings like get-project-health which retrieves results. 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?

Provides explicit when-to-use guidance: 'Use this when the health data is stale or you want a fresh assessment.' It also names the alternative follow-up tool: 'use get-project-health afterward to see updated results.' This is strong guidance for selection and invocation.

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

complete-tasksA
Destructive

Complete one or more tasks by their IDs.

NameRequiredDescriptionDefault
idsYesThe IDs of the tasks to complete.

Output Schema

NameRequiredDescription
failuresYesFailed task completions with error details.
completedYesThe IDs of successfully completed tasks.
failureCountYesThe number of failed task completions.
successCountYesThe number of successfully completed tasks.
totalRequestedYesThe total number of tasks requested to complete.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnly=false, and idempotent=false, so the safety profile is covered. The description itself adds no additional behavioral context such as irreversibility, side effects, or relationship to other states, but it does not contradict the 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 one sentence, front-loaded, and contains no filler or redundant wording. Every part earns its place: the action, the resource, and the input basis.

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 single-parameter batch mutation tool backed by rich annotations and an output schema, the description provides enough to understand the core operation. It could mention the relationship to uncomplete-tasks or emphasize the destructive nature, but the annotations already supply the essential safety signal.

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 fully describes the only parameter, 'ids', including that it is an array of strings with minItems 1. The description repeats the concept of task IDs without adding extra meaning, constraints, or input-format details 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 is specific: 'Complete one or more tasks by their IDs' clearly states the verb, resource, and required input. It also distinguishes the tool from sibling tools like uncomplete-tasks and update-tasks by naming the exact task-completion action.

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

Usage Guidelines3/5

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

The intended usage is implicitly clear: provide task IDs and mark those tasks as completed. However, there is no explicit guidance about when not to use it, how it differs from update-tasks, or that tasks could later be reversed via uncomplete-tasks.

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

delete-objectA
DestructiveIdempotent

Delete a project, section, task, comment, label, filter, reminder, or location_reminder by its ID. Projects can be deleted whether active or archived (find archived ones via find-projects with archivedStatus); note a workspace project must be archived before it can be deleted, while personal projects can be deleted regardless.

NameRequiredDescriptionDefault
idYesThe ID of the entity to delete.
typeYesThe type of entity to delete.

Output Schema

NameRequiredDescription
successYesWhether the deletion was successful.
deletedEntityYesInformation about the deleted entity.

TDQS

A4.2/5.0
Behavior4/5

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

It adds nuance beyond the annotations (destructiveHint, idempotentHint) by specifying that workspace projects must be archived before deletion, while personal projects can be deleted regardless. It also implies that deletion of projects is permanent and that archived projects are found via find-projects. It is consistent with the annotations and provides additional operational 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 extremely concise and front-loaded: it lists the entity types in the first clause, then gives a focused note about project deletion and the archived subset. No unnecessary words, no fluff. 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?

Given the range of deletable types and the nuance about project deletion, the description is quite complete. It covers the full scope, warns about the workspace archive rule, and references find-projects for archived ones. It omits explicit description of return behavior, but the presence of an output schema and the destructiveHint annotation make that acceptable. Overall, it provides sufficient operational 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?

Both parameters (id, type) are fully described in the schema (100% coverage), including enum values for type. The description re-lists the allowed types and mentions the usage of ID, which adds little beyond what the schema already provides. The baseline of 3 is appropriate because the description does not deepen the meaning of the parameters beyond what is given.

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 it deletes a project, section, task, comment, label, filter, reminder, or location_reminder by ID. It explicitly lists all supported types and uses a specific verb ('Delete') with the resource, distinguishing it as the deletion tool among sibling 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?

It provides clear conditional guidance for project deletion: archived vs. active, workspace (must be archived first) vs. personal (no prior requirement). It also directs to find archived projects via find-projects if needed, offering a context for use. No explicit 'when-not-to-use' is given because no other delete tool exists.

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

export-project-templateA
Idempotent

Export an existing project as a Todoist template, either as CSV content or as a shareable URL. Use it to duplicate a project, share its structure, or hand the CSV to import-project-template. To read a project rather than export it, use find-tasks instead — it returns structured tasks rather than raw CSV. The project itself is not modified, but the "url" format uploads a copy and returns a link that anyone holding it can open.

NameRequiredDescriptionDefault
formatNoHow to return the template. "file" returns the CSV content, which can be passed straight back to import-project-template. "url" returns a shareable download link instead, and is the better choice for large projects because it does not return the whole file.file
projectIdYesThe ID of the project to export as a template.
useRelativeDatesNoExport due dates relative to the import date (e.g. "day 3") instead of absolute dates. Defaults to false.

Output Schema

NameRequiredDescription
formatYesThe format the template was exported in.
contentNoThe template as CSV content. Only present when format is "file".
fileUrlNoThe shareable download URL. Only present when format is "url".
fileNameNoThe generated template file name. Only present when format is "url".
lineCountNoNumber of rows in the exported CSV. Only present when format is "file".

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=true, so the safety profile is partially covered; the description adds the non-obvious facts that the source project is not modified and that the 'url' format uploads a copy returning a publicly openable link. This is real value beyond annotations, though permission requirements and size limits are left implicit (large-project guidance lives in the 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?

Three tight sentences, front-loaded with the action and its outputs, then use cases, then the sibling pointer, then the side-effect caveat. No repeated or filler content.

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 an output schema present, return values needn't be explained, and the description still covers formats, side effects, and the correct sibling for read-only needs. Minor gap: nothing about required permissions or workspace scope for the upload path, which matters for an open-world 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% and the format enum is fully documented in the schema, including the large-project rationale. The description only echoes that two formats exist and says nothing about useRelativeDates, so it adds no semantics 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?

Opens with a specific verb+resource ('Export an existing project as a Todoist template') and immediately names the two output forms (CSV content or shareable URL). An agent can distinguish this from import-project-template and find-tasks without opening any schema.

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?

Gives concrete use cases (duplicate a project, share its structure, hand CSV to import-project-template) and an explicit exclusion: 'To read a project rather than export it, use find-tasks instead — it returns structured tasks rather than raw CSV.' Both when-to-use and the named alternative are present.

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

fetchA
Read-onlyIdempotent

Fetch the full contents of a task or project by its ID. The ID should be in the format "task:{id}" or "project:{id}". (Comments may exist; use find-comments to retrieve them.)

NameRequiredDescriptionDefault
idYesA unique identifier for the document in the format "task:{id}" or "project:{id}".

Output Schema

NameRequiredDescription
idYesThe ID of the fetched document.
urlYesThe URL of the document.
textYesThe text content of the document.
titleYesThe title of the document.
metadataNoAdditional metadata about the document.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral context by stating that the tool returns the full contents and explicitly noting that comments are not included and should be fetched separately via find-comments.

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 with no filler. The core action is front-loaded, followed by the required ID format and a concise caveat about comments. 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?

Given the single parameter, robust annotations, and an existing output schema, the description covers everything needed to invoke the tool correctly: what it fetches, the ID format, and what it does not return. No critical information is missing.

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%, and the single 'id' parameter is already documented with the exact format. The tool description repeats that format rather than adding new semantic meaning, so it meets the baseline without exceeding 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 states a specific verb ('Fetch') and resource ('full contents of a task or project by its ID'), and gives the exact ID formats. This makes it clearly distinct from the many sibling find* and search tools, which are for discovery rather than retrieval by known ID.

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 clearly conveys that the tool is for fetching a single task or project via a prefixed ID, and it explicitly directs comment retrieval to find-comments. It does not explicitly enumerate alternatives like find-tasks or find-projects, but the 'by its ID' framing provides enough contextual guidance.

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

fetch-objectA
Read-onlyIdempotent

Fetch a single task, project, comment, or section by its ID. Use this when you have a specific object ID and want to retrieve its full details. Set includeChildren to also get its direct subtasks or sub-projects.

NameRequiredDescriptionDefault
idYesThe unique ID of the object to fetch.
typeYesThe type of object to fetch.
includeChildrenNoAlso return the direct children of the object: subtasks for a task, sub-projects for a project. Returns childCount plus a compact list, flagging each child that has children of its own. Use this to check whether a task hides subtasks instead of a speculative find-tasks lookup. Ignored for comments and sections.

Output Schema

NameRequiredDescription
idYesThe ID of the fetched object.
typeYesThe type of object fetched.
objectYesThe fetched object data.
childrenNoDirect children only: subtasks for a task, sub-projects for a project. Completed subtasks and archived sub-projects are excluded.
childCountNoThe number of direct children listed in children. Only present when children were requested and the type supports them. 0 means the object definitively has none.
childrenErrorNoPresent when the children lookup failed or returned incomplete information. When no children are listed alongside it, childCount is unknown - do not read its absence as "no children".
hasMoreChildrenNoPresent when the object has more than 25 direct children and the list was truncated. Page through the rest with find-tasks by parentId for subtasks, or find-projects for sub-projects.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only that returning an object yields "full details"; it says nothing about behavior for an unknown ID, a mismatched type, or permission failures. It does not contradict the 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?

Three short sentences, front-loaded with the resource scope, then the usage condition, then the optional flag. Nothing is redundant or padded.

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 an output schema present, return-value explanation is unnecessary, and annotations plus 100% schema coverage handle most remaining gaps. The description covers what matters for correct invocation; only error/not-found behavior is unaddressed, which is minor for a pure read 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 schema already documents all three parameters, including the detailed includeChildren semantics (childCount, compact list, ignored for comments/sections). The description's includeChildren sentence mostly restates the schema, so baseline 3 applies.

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 gives a specific verb ("Fetch") and enumerates the exact resources (task, project, comment, section) plus the lookup key (ID). It implicitly separates itself from the find-* siblings by framing the tool around a known ID and full detail retrieval, but it never names an alternative outright.

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?

"Use this when you have a specific object ID and want to retrieve its full details" is a clear triggering condition that naturally excludes search-style tools. It lacks an explicit when-not or a named alternative such as find-tasks/find-projects, which keeps it below a 5.

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

find-activityA
Read-onlyIdempotent

Retrieve activity logs to monitor and audit changes in Todoist. Shows events from all users by default (use initiatorId to filter by specific user). To answer what someone completed in a period, including recurring task occurrences, use objectType "task", eventType "completed", and dateFrom/dateTo. For a first-person question ("what did I get done"), also set initiatorId to the current user from user-info, or the answer includes collaborators' completions. Track task completions, updates, deletions, project changes, and more with flexible filtering. Activity history availability and retention depend on the user plan.

NameRequiredDescriptionDefault
limitNoMaximum number of activity events to return.
cursorNoPagination cursor for retrieving the next page of results.
dateToNoExclusive end of the activity range, as an ISO 8601 date or date-time. For all events on 2026-08-02, use "2026-08-03T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.
taskIdNoFilter events by parent task ID (for subtask events).
dateFromNoInclusive start of the activity range, as an ISO 8601 date or date-time. For all events on one local calendar day, use that day's start, for example "2026-08-02T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.
objectIdNoFilter by specific object ID (task, project, or comment). Requires objectType.
eventTypeNoType of event to filter by.
projectIdNoFilter events by parent project ID.
objectTypeNoType of object to filter by.
initiatorIdNoFilter by the user ID who initiated the event. A first-person question ("what did I complete") needs this: without it the results cover every collaborator. Get the ID from user-info when you do not already have it.

Output Schema

NameRequiredDescription
eventsYesThe activity events.
hasMoreYes
nextCursorNo
totalCountYesThe total number of events in this page.
appliedFiltersYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds non-obvious behavior the annotations cannot: results span all users unless initiatorId is set, and history availability/retention vary by plan. Useful additions; pagination flow and result volume are left to the schema.

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 the core purpose, then query recipes, then the caveat — a sensible ordering. The sentence "Track task completions, updates, deletions, project changes, and more with flexible filtering" is largely filler that restates earlier content.

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 an output schema present and 100% param coverage, the description only needs to supply selection logic and gotchas, which it does (default scope, initiatorId rule, retention). Pagination behavior across the cursor and how large histories are returned is the only notable omission.

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 would be 3, but the description adds real semantic value on top: the initiatorId/first-person rule, the objectType+eventType combination that answers completion questions, and the default all-users scope. It does not add detail on limit/cursor or the date range semantics beyond what the schema documents.

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?

Specific verb+resource ("Retrieve activity logs") plus an explicit purpose (monitor and audit changes in Todoist) and a scope statement (all users by default). It distinguishes its coverage (completions, updates, deletions, project changes) but never names the closest sibling, find-completed-tasks, so an agent must reason about overlap itself.

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?

Very clear situational routing: objectType "task" + eventType "completed" + dateFrom/dateTo for period-completion questions, and initiatorId for first-person questions, with the failure mode spelled out ("or the answer includes collaborators' completions"). It stops short of naming alternatives or stating when to prefer find-completed-tasks instead.

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

find-commentsA
Read-onlyIdempotent

Find comments by task, project, or get a specific comment by ID. Exactly one of taskId, projectId, or commentId must be provided.

NameRequiredDescriptionDefault
limitNoMaximum number of comments to return
cursorNoPagination cursor for retrieving more results.
taskIdNoFind comments for a specific task.
commentIdNoGet a specific comment by ID.
projectIdNoFind comments for a specific project. Project ID should be an ID string, or the text "inbox", for inbox tasks.

Output Schema

NameRequiredDescription
hasMoreYes
commentsYesThe found comments.
searchIdYesThe ID that was searched for (comment, task, or project ID).
nextCursorNo
searchTypeYesThe type of search performed: "single" (comment ID), "task" (task ID), or "project" (project ID).
totalCountYesThe total number of comments in this page.

TDQS

A4.2/5.0
Behavior3/5

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

The annotations (readOnlyHint, idempotentHint, destructiveHint) already convey the non-mutating nature. The description adds no extra side-effect information, but it does not contradict the annotations either. Given the annotations cover the key behavioral aspects, a score of 3 is appropriate.

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, clear sentence that conveys all essential information without unnecessary elaboration. It is well-structured and easily parsed.

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 covers the input requirements and the purpose. While it does not specify the return format, for a straightforward find operation this is not critical. The absence of output schema is not a major gap given the simplicity of 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?

The description adds the mutual exclusivity rule that is not evident from the schema alone, which is vital for correct usage. However, it does not elaborate beyond that; the schema descriptions for individual parameters are minimal, but the description compensates with the exclusivity constraint.

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 comments by task, project, or ID, and the verb 'find' specifies a read-only search operation. It distinguishes itself from sibling tools like find-tasks or find-projects by focusing specifically on comments.

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 states that exactly one of taskId, projectId, or commentId must be provided, which is a crucial usage constraint. While it does not explicitly contrast with alternatives, the tool's purpose is unambiguous for comment lookup scenarios.

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

find-completed-tasksA
Read-onlyIdempotent

Get completed tasks in a date range. For "what did I complete/get done" questions, use find-activity instead — it reports completion events, including every occurrence of a recurring task, which this tool does not. since/until are optional and default to a 7-day window when omitted. Includes all collaborators by default. Person-specific queries (summaries, plans, reports) require responsibleUser.

NameRequiredDescriptionDefault
getByNoThe method to use to get the tasks: "completion" to get tasks by completion date (ie, when the task was actually completed), "due" to get tasks by due date (ie, when the task was due to be completed by).completion
limitNoThe maximum number of tasks to return.
sinceNoOptional start date for completed tasks. Format: YYYY-MM-DD. Defaults to 6 days before until (or today if until is omitted), resulting in a 7-day window.
untilNoOptional end date for completed tasks. Format: YYYY-MM-DD. Defaults to 6 days after since (or today if since is omitted), resulting in a 7-day window.
cursorNoThe cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters).
labelsNoThe labels to filter the tasks by
parentIdNoThe ID of the parent task to get the tasks for.
projectIdNoThe ID of the project to get the tasks for. Project ID should be an ID string, or the text "inbox", for inbox tasks.
sectionIdNoThe ID of the section to get the tasks for.
workspaceIdNoThe ID of the workspace to get the tasks for.
labelsOperatorNoThe operator to use when filtering by labels. This will dictate whether a task has all labels, or some of them. Default is "or".
responsibleUserNoFilter completed tasks assigned to this user. User ID, name, or email. For personal queries (summaries, plans, reports), set to current user from user-info to exclude collaborators. Defaults to all collaborators.

Output Schema

NameRequiredDescription
tasksYesThe found completed tasks.
hasMoreYes
nextCursorNo
totalCountYesThe total number of tasks in this page.
appliedFiltersYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the recurring-task limitation, the 7-day default window behavior, and that all collaborators are included by default. It stops short of describing pagination or result ordering, so a 4 rather than 5.

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-loads purpose, then sibling routing, then key parameter defaults — a sensible order with no wasted sentences. It is dense but each sentence carries information; minor compression could still improve readability.

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 12-parameter tool with an output schema and full annotations, the description covers purpose, the critical alternative, defaults, and the collaborator/responsibleUser scoping rule. Combined with the rich schema and output schema, an agent has everything needed to call it 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 the baseline is 3; the description earns above that by clarifying the since/until default window and the responsibleUser semantics (defaults to all collaborators, set to current user for personal reports). It doesn't elaborate on getBy, limit, or labels beyond the schema, so not a full 5.

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 a specific verb (get) and resource (completed tasks) with explicit scope (date range), and immediately distinguishes itself from find-activity. An agent can tell exactly what this returns versus the sibling without opening either schema.

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 routes 'what did I complete' questions to find-activity and explains the recurring-task caveat that differentiates the two. It also tells the agent that person-specific queries require responsibleUser, giving concrete when-to-use/when-not guidance.

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

find-filtersA
Read-onlyIdempotent

List all personal filters or search for filters by name. Filters are saved custom views that use query syntax to organize tasks (e.g. "today & p1", "#Work & overdue").

NameRequiredDescriptionDefault
searchNoSearch for a filter by name (partial and case insensitive match). If omitted, all filters are returned.

Output Schema

NameRequiredDescription
filtersYesThe found filters.
totalCountYesThe total number of filters returned.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral scope beyond annotations by specifying 'personal filters' and explaining the filter concept, which helps the agent understand what data will be returned.

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 with no filler: the primary operation is front-loaded, and the clarifying example is compact and informative. 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 low-complexity, single-optional-parameter read-only tool with a full output schema, the description is complete. It explains the domain concept, the two modes of invocation, and the scope without requiring additional 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 description coverage is 100%, so the schema fully documents the 'search' parameter including partial and case-insensitive matching and the omitted-parameter behavior. The description only restates 'by name' and adds no new 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 uses a specific verb ('List'/'search') with a clear resource ('filters') and scope ('personal'). It also explains what a filter is with concrete query syntax examples, making the tool's purpose unmistakable and distinguishable from task or project finders.

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 clearly conveys the two usage modes: list all filters or search by name. It does not explicitly name alternatives or exclusions, but the definition of filters as saved custom views gives enough context for an agent to know when this tool applies versus task/project search tools.

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

find-labelsA
Read-onlyIdempotent

List personal labels and shared labels. Personal labels have full metadata (id, name, color, order, isFavorite) and support pagination and name search (partial, case insensitive). Shared labels are labels used on tasks shared with you — they are returned as names only (no IDs or metadata). When searching, all matching personal labels are fetched across all pages and returned as a single result set (limit and cursor are ignored). When not searching, personal labels are returned with pagination.

NameRequiredDescriptionDefault
limitNoThe maximum number of labels to return.
cursorNoThe cursor to get the next page of labels (cursor is obtained from the previous call to this tool, with the same parameters). Ignored when searchText is provided.
searchTextNoSearch for a label by name (partial and case insensitive match). Supports wildcards (e.g. "work*" for prefix match). Use "\*" for a literal asterisk. If omitted, all labels are returned.

Output Schema

NameRequiredDescription
labelsYesThe found personal labels.
hasMoreYes
nextCursorNo
totalCountYesThe total number of labels in this page.
sharedLabelsYesNames of all shared labels visible to you. These have no IDs or metadata — use their names directly when filtering tasks.
appliedFiltersYes

TDQS

A4.9/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by detailing the pagination behavior, search handling (ignoring limit/cursor), and the distinction between personal and shared label metadata. It also discloses that shared labels lack IDs and metadata, which is crucial for downstream 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?

The description is well-structured, starting with the general purpose, then explaining the two types of labels, and then the two behavioral modes. It is dense but clear, with no fluff or redundant phrases, and every sentence adds distinct 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 moderate complexity (two label types, pagination, search behavior), the description covers all major aspects: what is returned, how pagination works, how search affects results, and the metadata difference. Combined with the rich annotations, it is complete 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.

Parameters4/5

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

The schema covers the parameters well (100% coverage), so the description adds context beyond the schema by explaining how they interact: limit/cursor are ignored during search, and searchText supports wildcards. That said, it doesn't add unique high-value info beyond what the schema already describes, but it does contextualize 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 what the tool lists labels, distinguishing personal labels vs shared labels, making the purpose is clear and distinct from siblings like find-labels' siblings like find-tasks or find-projects. It specifies the resource (labels) and the action (list/search) with precision.

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?

It explicitly explains when to use the tool (listing labels, searching by name) and contrasts with alternatives implicitly: by noting shared labels are returned as names only. The description even notes the difference in behavior when searching vs not, guiding the agent on parameter usage.

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

find-project-collaboratorsA
Read-onlyIdempotent

Find Todoist users (collaborators, teammates) by name or email to look up their user ID. Use this whenever the user asks to find, look up, or identify a person — e.g. "find Carrie's user ID", "who is Ernesto", "look up a user". When projectId is omitted, searches across the collaborators of every shared project the authenticated user has access to, plus the authenticated user themselves — an empty result means the person is not a collaborator on any project you share with them, not necessarily that they do not exist in Todoist. When projectId is provided, searches only that project. Partial, case-insensitive match on name and email.

NameRequiredDescriptionDefault
projectIdNoOptional. If provided, searches only collaborators of this project. If omitted, searches across the collaborators of all shared projects the authenticated user can access (plus the authenticated user themselves) — use this for general "find a user" / "who is X" lookups.
searchTermNoSearch for a user by name or email (partial and case insensitive match). If omitted, all users are returned.

Output Schema

NameRequiredDescription
totalCountYesThe total number of users found.
projectInfoNoInformation about the project (only present when projectId was provided).
collaboratorsYesThe found users.
appliedFiltersYes
totalAvailableNoThe total number of available users before the search filter was applied.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=true, idempotentHint=true), the description adds critical behavioral nuance: explains search scope (all shared projects vs one project), notes partial case-insensitive matching, and importantly clarifies that an empty result doesn't mean the user doesn't exist in Todoist—just not a collaborator. This is valuable context for interpreting results.

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—two sentences plus inline parameter explanations—and front-loads the purpose and usage. Every sentence adds value, with no filler or 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 read-only lookup tool with 2 optional parameters, the description covers usage, scope, edge cases (empty result meaning), and matching behavior. An output schema exists, so return format is covered. Given tool complexity and rich annotations, this is 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 description coverage is 100%, so the input schema already fully describes both parameters (projectId, searchTerm) with the same details the description provides. The description adds no new meaning beyond the schema, hence baseline 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 clearly states the tool finds Todoist users by name or email to look up their user ID, with concrete examples ('find Carrie's user ID', 'who is Ernesto'). It distinguishes from sibling find-tasks/find-projects by being specifically for people/collaborators.

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 guidance ('Use this whenever the user asks to find, look up, or identify a person') and clarifies behavior with/without projectId. It doesn't mention when not to use or name alternatives, but the context is clear enough for a single-purpose lookup tool.

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

find-projectsA
Read-onlyIdempotent

List all projects or search for projects by name. By default only active projects are returned; use archivedStatus ('archived' or 'all') to include archived projects. When searching or when archivedStatus is 'all', all matching projects are returned (pagination is ignored). Otherwise projects are returned with pagination.

NameRequiredDescriptionDefault
limitNoThe maximum number of projects to return.
cursorNoThe cursor to get the next page of projects (cursor is obtained from the previous call to this tool, with the same parameters).
searchTextNoSearch for a project by name (partial and case insensitive match). Supports wildcards (e.g. "work*" for prefix match). Use "\*" for a literal asterisk. If omitted, all projects are returned.
archivedStatusNoWhich projects to return by archive status: 'active' (default, non-archived only), 'archived' (archived only), or 'all' (both active and archived). Each project includes an isArchived field. Archived projects can be deleted via the delete-object tool (type: 'project').

Output Schema

NameRequiredDescription
hasMoreYes
projectsYesThe found projects.
nextCursorNo
totalCountYesThe total number of projects in this page.
appliedFiltersYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, so description doesn't need to repeat that. It adds valuable behavioral details: that archived projects can be deleted via delete-object, and that pagination is ignored in certain modes. However, it doesn't explicitly state that returns are read-only beyond annotations, but that's covered. Also, it notes that archivedStatus 'all' ignores pagination, which is useful. Minor gap: no mention of rate limits or auth, but not critical. A 4 is appropriate given the good annotation coverage and useful edge-case note.

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 concise, three sentences, front-loaded with main purpose. Each sentence adds new information: purpose and default, pagination behavior, and the isArchived field/deletion note. 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 read-only list/search tool with rich schema (100% coverage) and output schema present, description covers all key aspects: default filtering, pagination behavior, wildcard search, and archived status handling. It even links to deletion, which is helpful. Given complexity, 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 description coverage is 100%, and the description adds significant extra meaning beyond schema: it explains the interaction between archivedStatus and pagination, and clarifies that archivedStatus 'all' can be used to include archived projectsament. It also mentions isArchived field and deletion path, enriching parameter semantics beyond raw 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 lists or searches projects by name, with a specific verb 'find' and resource 'projects', and differentiates from siblings like find-tasks and find-sections by focusing on projects. Also explains default active-only behavior, adding specific 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?

Explicitly explains when to use it: to list all projects or search by name. Mentions default behavior (active only), when to use archivedStatus, and how pagination behaves in different modes. Names alternative deletion via delete-object for archived projects, providing usage context.

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

find-remindersA
Read-onlyIdempotent

Find reminders by task ID (returns all reminder types), or get a specific reminder by its ID. Use reminderId for time-based reminders and locationReminderId for location reminders.

NameRequiredDescriptionDefault
taskIdNoFind all reminders for a specific task. Returns both time-based and location reminders.
reminderIdNoGet a specific time-based reminder (relative or absolute) by its ID.
locationReminderIdNoGet a specific location reminder by its ID.

Output Schema

NameRequiredDescription
searchIdYesThe ID used for the search.
remindersYesThe found reminders (time-based and location).
searchTypeYesThe search type used: "task", "reminder", or "location_reminder".
totalCountYesTotal reminders in this response.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful fact that a taskId lookup returns both time-based and location reminders, but says nothing about result volume, pagination, or behavior when no reminder matches.

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?

Two short clauses, front-loaded with the primary taskId use case followed by the single-item modes. No filler; the only mild redundancy is repeating the parameter-level distinctions already in the schema.

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 a full output schema present and 100% parameter description coverage, the description need not explain return values, and it correctly frames the two access patterns. Missing only the mutual exclusivity of the three ID parameters and any empty-result behavior.

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% and each parameter already carries its own description that essentially duplicates the description text ('Get a specific time-based reminder ... by its ID'). The description adds no format, prefix, or ID-provenance information beyond the schema, so baseline 3 applies.

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?

States a specific verb (find) and resource (reminders), and enumerates the two lookup modes: by task ID (returning all types) or by a specific reminder ID. It does not name or contrast any sibling (e.g. find-tasks, update-reminders), so it stops short of full differentiation.

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

Usage Guidelines3/5

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

The description gives mode-selection guidance (reminderId for time-based, locationReminderId for location), which is real usage direction. But there is no guidance on when to reach for this tool versus add-reminders/update-reminders or find-tasks, and no note that the three parameters are mutually exclusive alternatives.

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

find-sectionsA
Read-onlyIdempotent

Search for sections by name or other criteria in a project. When searching, uses server-side search to avoid fetching all sections.

NameRequiredDescriptionDefault
projectIdYesThe ID of the project to search sections in. Project ID should be an ID string, or the text "inbox", for inbox tasks.
searchTextNoSearch for a section by name (partial and case insensitive match). Supports wildcards (e.g. "work*" for prefix match). Use "\*" for a literal asterisk. If omitted, all sections in the project are returned.

Output Schema

NameRequiredDescription
sectionsYesThe found sections.
totalCountYesThe total number of sections found.
appliedFiltersYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish this is read-only, idempotent, and non-destructive. The description adds useful behavioral context by disclosing that it uses server-side search to avoid fetching all sections, which is not apparent from the 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 two sentences, front-loaded with the main purpose, and each sentence adds value. There is no redundant or filler 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?

This is a simple two-parameter read-only search tool with a complete schema and output schema. The description, combined with the rich annotations and schema, provides enough context for an agent to select and invoke 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?

Schema description coverage is 100%, with both projectId and searchText fully described in the schema. The description adds no additional parameter-level meaning, so the baseline score 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 uses a specific verb ('Search'), identifies the resource ('sections'), and scopes it to a project. It clearly separates this read/search tool from mutation siblings like add-sections and update-sections.

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 context: searching for sections within a project by name or criteria. It also adds a rationale for the server-side search behavior, but it does not explicitly state when not to use it or mention alternative tools.

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

find-tasksA
Read-onlyIdempotent

Find tasks by text search, project/section/parent container, responsible user, labels, a raw Todoist filter string, or a saved filter by ID or name (filterIdOrName). At least one filter must be provided.

NameRequiredDescriptionDefault
limitNoThe maximum number of tasks to return.
cursorNoThe cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters).
filterNoA raw Todoist filter query string (e.g. "today", "p1", "##Work", "(today | overdue) & p1"). Combined with other filters using AND. Cannot be used with projectId, sectionId, parentId, or filterIdOrName.
labelsNoThe labels to filter the tasks by
parentIdNoFind subtasks of this parent task.
projectIdNoFind tasks in this project. Project ID should be an ID string, or the text "inbox", for inbox tasks.
sectionIdNoFind tasks in this section.
searchTextNoThe text to search for in tasks.
filterIdOrNameNoThe ID or name of a saved Todoist filter. The filter's query will be fetched and used to find tasks. Cannot be used with the `filter` parameter, projectId, sectionId, or parentId.
labelsOperatorNoThe operator to use when filtering by labels. This will dictate whether a task has all labels, or some of them. Default is "or".
responsibleUserNoFind tasks assigned to this user. Can be a user ID, name, or email address. The current user also includes unassigned tasks.
responsibleUserFilteringNoHow to filter by responsible user when responsibleUser is not provided. "assigned" = only tasks assigned to others; "unassignedOrMe" = only unassigned tasks or tasks assigned to me; "all" = all tasks regardless of assignment. Default value will be `unassignedOrMe`.

Output Schema

NameRequiredDescription
tasksYesThe found tasks.
hasMoreYes
nextCursorNo
totalCountYesThe total number of tasks in this page.
appliedFiltersYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds the non-obvious behavioral constraint that at least one filter must be supplied, but it does not add further context about pagination, filter-combination behavior, or permission requirements beyond what the schema provides.

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 front-loaded sentence plus a brief mandatory-filter constraint. It communicates the core capability and the key validation rule without repetition or 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?

Given rich annotations, 100% schema coverage, and an output schema, the description covers the essential purpose and the at-least-one-filter rule. It is nearly complete, though it could better route the agent among its date-oriented and completed-task siblings.

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 input schema already documents all 12 parameters in detail. The description lists the filtering modes but adds no substantive parameter semantics beyond what is already present in the schema; baseline 3 is appropriate.

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 states a clear verb ('Find') and resource ('tasks') and enumerates the supported filtering modes: text search, project/section/parent, responsible user, labels, raw Todoist filter, and saved filter. It does not explicitly distinguish this tool from close siblings like find-tasks-by-date or find-completed-tasks, so it falls short of a 5.

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

Usage Guidelines3/5

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

The description includes the important constraint that at least one filter must be provided, which is useful usage guidance. However, it does not say when to use this tool versus find-tasks-by-date, find-completed-tasks, or search, so the alternative-selection guidance is implied rather than explicit.

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

find-tasks-by-dateA
Read-onlyIdempotent

Get tasks by date range. startDate='today' includes overdue items. Default responsibleUserFiltering='unassignedOrMe' excludes others' tasks.

NameRequiredDescriptionDefault
limitNoThe maximum number of tasks to return. Default is 10.
cursorNoThe cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters).
labelsNoThe labels to filter the tasks by
daysCountNoThe number of days to get the tasks for, starting from the start date. Default is 1 which means only tasks for the start date.
startDateNoThe start date to get the tasks for. Format: YYYY-MM-DD, or 'today', which by default also includes overdue tasks.
overdueOptionNoHow to handle overdue tasks. 'overdue-only' to get only overdue tasks, 'include-overdue' to include overdue tasks along with tasks for the specified date(s), and 'exclude-overdue' to exclude overdue tasks. Default is 'include-overdue'.
labelsOperatorNoThe operator to use when filtering by labels. This will dictate whether a task has all labels, or some of them. Default is "or".
responsibleUserNoFilter tasks assigned to this user. User ID, name, or email. The current user also includes unassigned tasks.
responsibleUserFilteringNoFilter when responsibleUser is omitted. 'assigned'=assigned to others; 'unassignedOrMe'=unassigned+mine; 'all'=everyone. Default: 'unassignedOrMe'.

Output Schema

NameRequiredDescription
tasksYesThe found tasks.
hasMoreYes
nextCursorNo
totalCountYesThe total number of tasks in this page.
appliedFiltersYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish this as a read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond them: 'today' includes overdue items, and the default responsibleUserFiltering excludes other users' tasks.

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 short sentences with no filler. The core purpose and the two non-obvious default behaviors are front-loaded and easy to scan.

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 covers the key non-obvious defaults for a date-based task query. Pagination and label-filtering mechanics are left to the fully documented schema and output schema, which is acceptable given their richness.

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 explains all nine parameters. The description reinforces two important parameter behaviors, but adds little unique syntax or meaning beyond the structured 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 states a specific verb and resource: 'Get tasks by date range.' This clearly distinguishes it from generic task-search or mutation siblings, though it does not explicitly name an alternative tool like find-tasks.

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

Usage Guidelines3/5

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

Usage is implied by the date-range focus and the two default-behavior notes, but the description never states when to choose this tool over siblings such as find-tasks or find-completed-tasks. No exclusions or prerequisites are given.

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

get-overviewA
Read-onlyIdempotent

Get a Markdown overview. Called without a projectId, returns the account's project and section structure only — no tasks — for navigation. Pass a projectId (or "inbox" for the Inbox) to get that project's tasks grouped by section.

NameRequiredDescriptionDefault
projectIdNoOptional project ID. Use "inbox" for the Inbox. If provided, returns that project's tasks grouped by section. If omitted, returns the project and section structure for the whole account with no tasks.

Output Schema

NameRequiredDescription
typeYesThe type of overview returned.
inboxNoInbox information (account overview only).
statsNoStatistics object (project overview only).
tasksNoList of tasks (project overview only).
projectNoProject details (project overview only).
projectsNoList of projects with hierarchy, folders, and ordering (account overview only).
sectionsNoList of sections (project overview only).
totalTasksNoTotal number of tasks.
projectInfoNoProject information (project overview only).
totalProjectsNoTotal number of projects (account overview only).
totalSectionsNoTotal number of sections (project overview only).
hasNestedProjectsNoWhether account has nested projects (account overview only).
tasksWithoutSectionNoNumber of tasks not in any section (project overview only).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value beyond annotations by disclosing the Markdown return format, the parameter-dependent mode switch, the exclusion of tasks in the account-wide view, and section grouping 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?

Two sentences with zero waste. The primary deliverable (Markdown overview) is front-loaded, and the mode-dependent behavior is packed into a compact second sentence that covers both call variants.

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 read-only, single-optional-parameter tool with annotations covering safety and an output schema present, the description fully covers invocation modes, output format, and scope. Nothing an agent needs to call it correctly is missing.

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% — the schema already documents projectId, the 'inbox' special value, and the two behavioral outcomes. The description reinforces this but adds minimal new meaning beyond the schema's own parameter 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 states a specific verb and resource ('Get a Markdown overview') and precisely distinguishes the two invocation modes: account structure without a projectId versus tasks grouped by section with one. This clearly differentiates it from siblings like find-tasks, find-projects, and get-productivity-stats.

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 explicit when-to-use conditions for both modes: omit projectId for navigation structure only, or pass projectId/'inbox' to get tasks grouped by section. It implies the alternative use cases (navigating vs. retrieving tasks) but does not name sibling tools explicitly or state 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.

get-productivity-statsA
Read-onlyIdempotent

Get comprehensive productivity statistics including daily/weekly completion breakdowns, goal streaks (current, last, max), karma score and trends, and historical karma data. Useful for productivity analysis and tracking goal progress. Reports counts, streaks and karma only, never the tasks themselves — for "what did I complete", use find-activity.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
goalsYesGoal and streak information.
karmaYesCurrent karma score.
daysItemsYesDaily completion breakdown (most recent days).
weekItemsYesWeekly completion breakdown (most recent weeks).
karmaTrendYesKarma trend direction (e.g., "up" or "down").
projectColorsYesMap of project ID to color key.
completedCountYesTotal number of completed tasks (all-time).
karmaGraphDataYesHistorical karma data points for graphing.
karmaLastUpdateYesTimestamp of the last karma update.
karmaUpdateReasonsYesRecent karma change events with reasons.

TDQS

A4.7/5.0
Behavior4/5

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

The description adds behavioral context beyond the annotations: it specifies the tool reports counts, streaks, and karma only, never the tasks themselves. This is valuable because it clarifies the output scope. The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well-covered. The description could add more about the output structure, but the output schema exists to cover that.

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. It front-loads the core purpose, then lists the specific data types, and ends with a clear exclusion and pointer to an alternative. 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 has zero parameters, a rich output schema, and strong annotations (readOnly, idempotent, non-destructive), the description is complete. It covers what the tool does, what it returns, and when to use an alternative. The output schema handles return value details, so the description doesn't need to enumerate them.

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 schema description coverage is 100% (vacuously true). The description adds value by explaining what the tool returns (daily/weekly breakdowns, streaks, karma trends), which is the main semantic content. Since there are no parameters to document, a baseline of 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's purpose: retrieving comprehensive productivity statistics including daily/weekly completion breakdowns, goal streaks, karma score and trends, and historical karma data. It explicitly distinguishes itself from sibling tools by noting it reports counts, streaks, and karma only, never tasks themselves, and directs users to find-activity for task-level details.

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: it is useful for productivity analysis and tracking goal progress, and it explicitly states when NOT to use it (for 'what did I complete' queries, use find-activity instead). This clear differentiation from the sibling tool find-activity is excellent.

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

get-project-activity-statsA
Read-onlyIdempotent

Get daily and optional weekly task completion counts for a project over a configurable time window (1-12 weeks). Useful for identifying completion trends and patterns.

NameRequiredDescriptionDefault
weeksNoNumber of weeks of activity data to retrieve (1-12, default 2).
projectIdYesThe ID of the project to get activity stats for.
includeWeeklyCountsNoInclude weekly rollup counts alongside daily counts.

Output Schema

NameRequiredDescription
dayItemsYesDaily task completion counts.
projectIdYesThe project ID.
weekItemsNoWeekly completion rollups. Only included when includeWeeklyCounts is true.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds context about granularity and time window but does not disclose additional behavioral aspects like handling of missing data or aggregation details. This is adequate given the annotation coverage.

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 two sentences, directly states the function, and includes a usage note. No filler or redundancy, earning a perfect score for conciseness.

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-only statistics tool with an output schema, the description covers the essential purpose, scope, and use case. It does not need to explain return format since the output schema exists, and annotations cover safety. It is 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 all parameters are documented in the schema. The description adds contextual meaning (e.g., 'daily' and 'weekly' align with weeks and includeWeeklyCounts) but does not deeply explain parameter semantics 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 verb 'Get' and resource 'project activity stats' (task completion counts), with scoping details (daily, optional weekly, time window). It distinguishes from siblings like get-productivity-stats and find-activity by focusing on project-specific completion trends.

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 a clear use case ('identifying completion trends and patterns'), which implies when to use it. However, it does not explicitly mention alternatives or when not to use it, so it lacks exclusions.

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

get-project-healthB
Read-onlyIdempotent

Get a comprehensive health assessment for a project including completion progress, health status (EXCELLENT, ON_TRACK, AT_RISK, CRITICAL), and optional detailed context with project metrics and task-level data. Use includeContext=true for that full detail.

NameRequiredDescriptionDefault
projectIdYesThe ID of the project to check health for.
includeContextNoInclude detailed health context with project metrics and task-level data. May produce large output for projects with many tasks.

Output Schema

NameRequiredDescription
healthYesProject health assessment.
contextNoDetailed project context with metrics and task data. Only included when includeContext is true.
progressYesProject completion progress.
projectIdYesThe project ID.
projectNameYesThe project name.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate a read-only, idempotent, non-destructive operation. The description adds behavioral context by naming the returned status values and optional contextual detail, but it does not disclose potential performance implications, rate limits, or other operational caveats beyond what the schema already notes about large output.

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 two sentences, front-loaded with the primary action and output, and the second sentence gives useful parameter guidance 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?

Given the rich annotations, 100% parameter coverage, and presence of an output schema, the description is mostly complete. It lacks alt-tool guidance for 'analyze-project-health', but that is primarily covered by the usage guidelines dimension; otherwise the description adequately supports 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 description coverage is 100%, so the parameters are already well documented. The description adds minimal parameter-related value beyond what the schema provides; 'includeContext=true for full detail' is essentially restated in 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 the tool performs a health assessment for a project and lists key outputs: completion progress and health status values. However, it does not explicitly differentiate itself from the sibling tool 'analyze-project-health', which may serve a similar purpose.

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 only usage guidance is the parameter-level instruction 'Use includeContext=true for that full detail.' The description does not state when to choose this tool over alternatives like 'analyze-project-health', 'get-project-activity-stats', or 'get-productivity-stats'.

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

get-workspace-insightsA
Read-onlyIdempotent

Get aggregated health and progress insights across all projects in a workspace. Accepts workspace name or ID, with optional project ID filtering. Useful for a cross-project health overview.

NameRequiredDescriptionDefault
projectIdsNoOptional list of project IDs to scope insights to specific projects.
workspaceIdOrNameYesThe workspace ID or name. Supports exact ID, exact name match (case-insensitive), or unique partial name match.

Output Schema

NameRequiredDescription
workspaceIdYesThe resolved workspace ID.
workspaceNameYesThe resolved workspace name.
projectInsightsYesHealth and progress insights for each project in the workspace.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds context by noting the output is 'aggregated' and scoped 'across all projects', which goes beyond the schema and helps the agent understand the tool's behavior. No contradiction with 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 two sentences, front-loaded with the primary action and scope, then provides input details and a use case. Every sentence adds value and there is no wasteful repetition or filler.

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-only tool with a rich output schema, high schema parameter coverage, and strong annotations, the description fully covers purpose, input semantics, and usage context. No additional behavioral or output details are necessary, and the agent has enough information to select and 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 baseline is 3. The description only restates what the schema already says ('Accepts workspace name or ID, with optional project ID filtering') without adding additional format, defaults, or edge-case semantics, so it earns the baseline score.

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 a specific verb ('Get') and resource ('aggregated health and progress insights across all projects in a workspace'), which makes the core purpose unambiguous. It differentiates from project-specific tools by the 'across all projects' scope, though it does not explicitly name sibling alternatives or contrast with tools like get-productivity-stats.

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 phrase 'Useful for a cross-project health overview' provides a clear context for when to use this tool. However, it does not mention when not to use it or explicitly point to alternative sibling tools, so it stops short of a full 5.

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

import-project-templateA

Import a template into an existing project, adding its tasks, sections and comments to whatever is already there. Source it by template ID/URL or by passing CSV content from export-project-template. To start a new project from a template, create the project with add-projects first, then import into it. This writes immediately and cannot be undone, so only run it against a project the user named.

NameRequiredDescriptionDefault
localeNoLocale for the imported content when using `templateId`. Defaults to "en".
projectIdYesThe ID of the existing project to import the template into.
templateIdNoThe template to import — either a gallery slug ("product-launch"), a personal template ID ("UT_28Ex..."), or a full Todoist template URL, which is reduced to the ID automatically. Gallery templates work for anyone; personal templates only for the account that owns them. There is no way to list templates through this server, so only use the ID or URL the user supplied. Provide either this or `csvFileContent`, not both.
csvFileContentNoRaw CSV template content, as produced by export-project-template. Provide either this or `templateId`, not both.

Output Schema

NameRequiredDescription
tasksYesTasks created by the import.
commentsYesComments created by the import.
sectionsYesSections created by the import.
totalCountYesThe total number of objects created by the import.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false; the description adds the important nuance that the write is immediate and irreversible, plus the constraint to confirm the target project with the user. It does not explain merge/conflict behavior (e.g. duplicate task names) for a non-idempotent operation, which would be the remaining high-value 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?

Three tight sentences with no filler: purpose first, sourcing second, precondition and risk last. Every sentence carries information an agent would otherwise have to guess.

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?

An output schema exists so return values need not be described. For a 4-parameter, non-idempotent write tool with full annotation coverage, the description covers purpose, sourcing, prerequisite and risk without leaving an agent unable to call 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 coverage is 100%, so the schema already documents projectId, locale, templateId and csvFileContent, including the mutual exclusivity. The description's only added value is provenance — that CSV content comes from export-project-template — which is a useful but small increment over 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?

Specific verb+resource with added scope: 'Import a template into an existing project, adding its tasks, sections and comments to whatever is already there.' It also implicitly separates itself from export-project-template, the inverse operation, by describing where the CSV comes from.

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 the two sourcing paths (template ID/URL vs. CSV from export-project-template) and gives the prerequisite workflow for a new project: 'create the project with add-projects first, then import into it.' It also names when-not to act freely: 'only run it against a project the user named.'

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

list-workspacesA
Read-onlyIdempotent

Get all workspaces for the authenticated user. Returns workspace details including ID, name, plan type (STARTER/BUSINESS), user role (ADMIN/MEMBER/GUEST), link sharing settings, guest permissions, creation date, and creator ID.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
typeYesThe type of the response.
countYesThe total number of workspaces.
workspacesYesList of workspaces.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare `readOnlyHint: true` and `idempotentHint: true`, so safety is established. The description adds value by listing the returned fields (ID, name, plan type, role, etc.) but doesn't add behavioral nuances like rate limits, auth scope, or pagination, which would be a bonus.

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 two sentences long, leads with the action and scope, and efficiently enumerates the returned data fields. Every word earns its place with 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?

For a simple list operation with zero parameters, read-only annotations, and a provided output schema, the description is complete enough. It could mention pagination or absence of filtering, but the phrase 'all workspaces' handles it adequately for most agents.

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?

There are zero parameters, and the schema coverage is 100% (vacuously). The baseline is 4 for no params; the description doesn't need to explain parameters, but it also doesn't add any extra clarity about optional query capabilities (none exist).

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 a specific verb ('Get') and resource ('all workspaces') and explicitly scopes to 'the authenticated user'. It distinguishes itself from the many 'find-*' sibling tools by indicating a full, unfiltered listing.

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

Usage Guidelines3/5

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

The usage is implied—it's the obvious list operation for workspaces—but there is no explicit guidance on when to use this versus the `find-*` alternatives or any exclusions. It doesn't say 'use this instead of X' or mention context like pagination.

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

manage-assignmentsA
Destructive

Assign, unassign or reassign up to 50 tasks at once. Assigning notifies the new assignee. Each task is updated independently, so one failure does not undo the others; failures are reported per task. Use dryRun to check the changes first.

NameRequiredDescriptionDefault
dryRunNoIf true, validates operations without executing them.
taskIdsYesThe IDs of the tasks to operate on (max 50).
operationYesThe assignment operation to perform.
responsibleUserNoThe user to assign tasks to. Can be "me" (assigns to current user), a user ID, name, or email. Required for assign and reassign operations.
fromAssigneeUserNoFor reassign operations: the current assignee to reassign from. Can be user ID, name, or email. Optional - if not provided, reassigns from any current assignee.

Output Schema

NameRequiredDescription
resultsYesResults of the assignment operations.
summaryNoSummary of the operation.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, non-idempotent and open-world, but the description adds meaningfully beyond them: assigning sends a notification to the new assignee, and each task is updated independently so failures are partial and reported per task. Those side-effect and partial-failure semantics are exactly the kind of context an agent needs before firing a destructive batch call.

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 short sentences, zero filler, with the operation/scope front-loaded and the risk mitigations (per-task failure isolation, dryRun) trailing in priority order. Every sentence carries information an agent would otherwise have to infer.

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 destructive batch mutation with five parameters, the description covers batch limits, partial-failure behavior, notification side effects, and the dryRun escape hatch, and an output schema exists to explain per-task results. Nothing needed to invoke it correctly is missing.

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% — every parameter, including the operation enum, responsibleUser's "me"/ID/name/email forms, and fromAssigneeUser's optionality, is documented in the schema itself. The description only restates the 50-item cap and mentions dryRun, so it adds essentially nothing new; baseline 3 applies.

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 opens with a specific verb triple (assign/unassign/reassign) plus the resource (tasks) and the batch scope (up to 50 at once), which lets an agent distinguish this from single-object tools like update-tasks or complete-tasks. It stops short of naming a sibling alternative explicitly, so it is clear but not sibling-routed.

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

Usage Guidelines3/5

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

"Use dryRun to check the changes first" is a concrete usage recommendation, and the 50-task cap sets a practical boundary. However, there is no explicit when-to-use/when-not guidance and no mention of the obvious alternative (looping update-tasks), leaving the choice largely implied.

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

project-managementB
Idempotent

Archive or unarchive a project by its ID.

NameRequiredDescriptionDefault
actionYesThe action to perform on the project.
projectIdYesThe ID of the project.

Output Schema

NameRequiredDescription
projectYesThe updated project.
successYesWhether the action was successful.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, which informs the agent of the operation's safety profile. The description adds the explicit archive/unarchive semantics but does not explain side effects like whether the project is hidden or if collaborators are notified. This is adequate given the annotations cover the core behavioral aspects.

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, front-loaded sentence that immediately conveys the action and target. It wastes no words and includes no filler, earning a top score for conciseness.

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 a low-complexity tool and an output schema present, the description need not explain return values. The archive/unarchive toggle is simple, and the description plus annotations sufficiently cover the operation's context. Minor gaps like error handling or invalid IDs are not expected to be in a description at this level.

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 documents both parameters ('action' and 'projectId') with 100% coverage, so the description rests at baseline 3. The description's phrase 'by its ID' mirrors the schema's projectId description and the enum options, adding no new meaning. No additional parameter details are needed.

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 function: 'Archive or unarchive a project by its ID,' using a specific verb and resource. It distinguishes this tool from siblings like add/update/find projects through the unique action words, though it does not explicitly contrast with any sibling, such as 'project-move'.

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 instead of alternatives, nor does it discuss prerequisites or context. There is no mention of when archiving is appropriate or when to use a different project-management sibling tool.

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

project-moveC
DestructiveIdempotent

Move a project between personal and workspace contexts.

NameRequiredDescriptionDefault
actionYesThe action to perform on the project.
folderIdNoOptional target folder ID within the workspace.
projectIdYesThe ID of the project to move.
visibilityNoOptional access visibility for the project in the workspace (restricted, team, or public).
workspaceIdNoThe target workspace ID. Required when action is move-to-workspace.

Output Schema

NameRequiredDescription
projectYesThe moved project.
successYesWhether the move was successful.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already carry the full safety profile (destructiveHint=true, idempotentHint=true, openWorldHint=false), but the description adds nothing on top. For a destructive cross-context move, it says nothing about what is destroyed or altered — e.g. whether collaborators, folder placement, or visibility are reset — which is exactly the context an agent needs before calling it.

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?

A single efficient sentence with the core operation front-loaded and no filler. It is arguably too thin rather than too long, but there is zero waste.

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

Completeness2/5

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

An output schema exists, so return values need not be explained, but for a 5-parameter destructive mutation the description omits the side effects of moving a project across contexts. An agent would have to consult the schema and guess at consequences.

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 all five parameters including the enums and the conditional workspaceId are documented in the schema. The description adds no syntax or conditional logic beyond that, so the baseline 3 applies.

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 has a specific verb ("Move") and resource ("project") plus the axis of movement (personal <-> workspace), so the operation is unambiguous. It does not differentiate itself from siblings like update-projects or project-management, which could plausibly overlap with this change.

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?

There is no guidance on when to choose this tool versus update-projects or project-management, and no mention of the required action enum or the conditional workspaceId requirement. The agent must infer all preconditions from the schema.

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

reorder-objectsA
Idempotent

Reorder projects or sections, and optionally move personal projects to a new parent. Personal projects: order places a project among its siblings; parentId moves it ("root" for top level). Workspace projects: order places a project within its folder, in the shared default ordering every member sees; needs permission to reorder the workspace. Sections: order places a section within its project.

NameRequiredDescriptionDefault
typeYes"project": personal projects among the siblings under their parent, or workspace projects within their folder. "section": sections within their project.
itemsYesEach item needs order and/or parentId. Moves happen first, so order is a position under the new parent.

Output Schema

NameRequiredDescription
typeYesThe type of entity that was reordered/moved.
successYesWhether every entity was moved and reordered as asked.
failuresYesEntities that could not be moved or reordered, with the reason for each.
movedCountYesThe number of entities moved to a new parent.
affectedIdsYesThe IDs of the entities moved or reordered.
reorderedCountYesThe number of entities reordered.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare it non-read-only, idempotent, non-destructive, and closed-world. The description adds genuinely non-obvious context beyond that: workspace ordering is a shared default every member sees, reordering a workspace requires permission, and moves are applied before order positions so order is evaluated under the new parent.

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 lead sentence states the full scope, followed by one sentence per entity type, which is an easy-to-scan structure. It is efficient overall, though the per-type sentences restate schema wording closely, so some content is duplicated rather than additive.

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?

An output schema exists, so return values need no explanation, and the permissions and ordering semantics are covered. It does not address partial-failure or atomicity behavior across the `items` array, which would matter for a batched mutation, leaving a small completeness gap.

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, but the description adds real meaning: `order` is sibling-relative per entity type, workspace ordering is shared across members, and `parentId` accepts "root" and is personal-projects-only. It is largely a mirror of the schema text, which keeps it out of 5 territory.

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?

States a specific verb and resource ("Reorder projects or sections") and immediately disambiguates the three modes it covers: personal projects, workspace projects, and sections. It gives no differentiation from the sibling `project-move` tool, which appears to overlap with the parentId move behavior, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the reader can infer that `order` reorders within siblings and `parentId` relocates a personal project, and it notes the workspace permission prerequisite. There is no explicit when-not-to-use guidance and no routing to alternatives such as `project-move` or `update-projects`.

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

reschedule-tasksA
Destructive

Reschedule tasks to new dates while preserving recurring schedules. Unlike update-tasks (which replaces the entire due string and can wipe recurrence), this tool changes only the date, keeping recurrence patterns intact. Use this when moving recurring tasks to a different date without altering their repeat pattern.

NameRequiredDescriptionDefault
tasksYesThe tasks to reschedule with their new dates.

Output Schema

NameRequiredDescription
tasksYesThe rescheduled tasks.
totalCountYesThe total number of tasks rescheduled.
rescheduledTaskIdsYesThe IDs of the rescheduled tasks.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, so the description doesn't need to re-litigate safety. It adds real value by disclosing the preservation semantics — only the date changes, recurrence survives — which the annotations cannot express. It does not cover batch behavior (multiple tasks, partial failure on an invalid id), which keeps it below a 5.

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

Conciseness3/5

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

Front-loaded and short, but the recurrence-preservation point is made three times ('preserving recurring schedules', 'keeping recurrence patterns intact', 'without altering their repeat pattern'). Two of those sentences could be merged without losing anything.

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?

An output schema exists, so return values need no explanation, and the single parameter is fully documented. The gap is operational: nothing says what happens if one task id in the array is invalid, which matters for a destructive batch mutation.

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 nested date property already documents the YYYY-MM-DD vs datetime formats and the time-preservation rule. The description adds no parameter semantics beyond that; 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?

Specific verb+resource+scope: 'Reschedule tasks to new dates while preserving recurring schedules,' and it explicitly contrasts with update-tasks. An agent can distinguish it from the sibling without opening either schema.

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?

Gives an explicit when-to-use ('moving recurring tasks to a different date without altering their repeat pattern') and names the wrong alternative (update-tasks) plus the harm it causes (wipes recurrence). Selection is unambiguous.

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

uncomplete-tasksA

Uncomplete (reopen) one or more completed tasks by their IDs.

NameRequiredDescriptionDefault
idsYesThe IDs of the tasks to uncomplete.

Output Schema

NameRequiredDescription
failuresYesFailed task uncompletion with error details.
uncompletedYesThe IDs of successfully uncompleted tasks.
failureCountYesThe number of failed task uncompletions.
successCountYesThe number of successfully uncompleted tasks.
totalRequestedYesThe total number of tasks requested to uncomplete.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already convey the mutation safety profile (readOnlyHint=false, destructiveHint=false), and the description adds the semantic effect of reopening completed tasks. It does not disclose edge cases like behavior for already-uncompleted tasks or side effects, but it does not contradict the 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 a single, front-loaded sentence where every word adds value: 'Uncomplete (reopen)' clarifies terminology, 'one or more' maps to the array type, 'completed tasks' defines the target set, and 'by their IDs' specifies the input. There is no wasted 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 the low complexity (one required parameter, no nested objects), full schema coverage, and presence of an output schema, the description is sufficient. It clearly communicates the action, target, and input, and nothing important is missing for an agent to select and invoke this 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?

Schema coverage for the single required parameter is 100% with a clear description for 'ids'. The tool description only reiterates 'by their IDs' and adds no new format, type, or behavior details beyond what the schema already provides, so the 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 uses a specific verb 'Uncomplete (reopen)' and clearly identifies the resource ('completed tasks') and the input mechanism ('by their IDs'). This distinguishes it from sibling tools like complete-tasks and update-tasks by specifying both the action and the target state.

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

Usage Guidelines3/5

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

The description gives implied usage context: it is for completed tasks that need to be reopened, and IDs are required. However, it does not explicitly state when not to use it or mention alternatives, such as using complete-tasks for the inverse operation.

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

update-commentsC
Destructive

Update multiple existing comments with new content.

NameRequiredDescriptionDefault
commentsYesThe comments to update.

Output Schema

NameRequiredDescription
commentsYesThe updated comments.
failuresYesComments that could not be updated, with the reason for each.
totalCountYesThe total number of comments updated.
appliedOperationsYesSummary of operations performed.
updatedCommentIdsYesThe IDs of the updated comments.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the safety profile is covered. The description only adds the 'multiple/batch' nuance; it does not disclose permission requirements, whether only the caller's own comments can be edited, or failure behavior when some 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?

A single efficient sentence with the verb and scope front-loaded. Nothing is wasted, though there is little structure to speak of.

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

Completeness2/5

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

For a destructive batch mutation, the description omits the constraints an agent needs: whose comments can be edited, what happens on partial failure, and per-comment error handling. The output schema and annotations help, but the gaps around mutation semantics 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 description coverage is 100% and the nested id/content structure is fully documented there. The description's 'multiple existing comments' hints at the array shape and the requirement that comments pre-exist, but adds nothing about the id/content semantics 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?

States a specific verb and resource ('update ... comments') plus batch scope ('multiple existing comments'). It is clear what the tool does, but it does not differentiate itself from siblings like add-comments or delete-object.

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?

There is no guidance on when to use this versus add-comments (create) or find-comments (read), nor any mention of prerequisites such as needing to be the comment's author.

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

update-filtersB
Destructive

Update one or more existing personal filters with new values.

NameRequiredDescriptionDefault
filtersYesThe filters to update.

Output Schema

NameRequiredDescription
filtersYesThe updated filters, as read back after the update. Empty if they could not be read back; updatedFilterIds still lists what was updated.
failuresYesFilters that could not be updated, with the reason for each.
totalCountYesThe total number of filters updated.
updatedFilterIdsYesThe IDs of the updated filters.
appliedOperationsYesSummary of operations performed.

TDQS

B3.3/5.0
Behavior2/5

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

The description is purely functional and adds no unique behavioral traits. The primary behavioral constraints (e.g., destructive nature, mutability) are already defined by the annotations (destructiveHint: true, readOnlyHint: false).

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 tool is described in one extremely concise sentence. Every word serves to define the scope of the operation without superfluous detail.

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

Completeness3/5

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

Despite the complex input structure (nested array of objects with many attributes), the description remains high-level. While the schema handles the heavy lifting, a slightly more descriptive summary of the update operation's impact would improve completeness.

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%, meaning the description does not need to compensate for missing parameter explanations. Since it provides no additional semantic context beyond the schema, the baseline score of 3 is appropriate.

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 identifies the resource (filters) and the action (update). It is distinct from 'add-filters' and 'find-filters' in the sibling list. It uses a specific action/resource pairing.

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

Usage Guidelines3/5

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

It implies the necessity of existing filters, but provides no explicit advice on whether to first call 'find-filters' or if there are specific conditions (like minimum required fields) for success, making the guidance slightly weak.

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

update-labelsA
Destructive

Update one or more existing labels. Personal labels (identified by ID) can have their name, color, order, and favorite flag updated. Shared labels (identified by name) can only be renamed.

NameRequiredDescriptionDefault
labelsYesThe labels to update. Use labelType="personal" with an ID to update a personal label, or labelType="shared" with name+newName to rename a shared label.

Output Schema

NameRequiredDescription
failuresYesLabels that could not be updated, identified by ID (personal) or name (shared), with the reason for each.
totalCountYesThe total number of successful operations (personal + shared).
updatedLabelsYesThe updated personal labels.
appliedOperationsYesSummary of operations performed.
renamedSharedLabelsYesThe shared labels that were renamed.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=false. The description adds genuinely useful mode-level semantics (shared rename vs. personal full-field update), but it does not warn that shared-label renames propagate to all tasks, nor does it acknowledge that the operation is destructive or non-idempotent. It adds value beyond annotations without fully carrying the behavioral 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?

Two sentences, front-loaded with the core action and then the mode breakdown. Nearly every clause earns its place, though the parenthetical '(identified by ID)' / '(identified by name)' duplicates the schema's discriminators.

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?

Output schema exists and annotations cover the safety profile, so the description only needs to explain the two update modes, which it does completely and accurately. Missing is any mention of how to discover IDs or that updates apply per-label in a batch, but the essentials for a correct call are present.

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% and the nested oneOf already documents both branches in detail, including the shared-label rename note. The description restates that branch split at a higher level, which aids quick parsing but adds no syntax or constraint information the schema lacks. Baseline 3 is appropriate.

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?

Names a specific verb (update) and resource (labels), and immediately splits the operation into two distinct modes: personal labels by ID and shared labels by name. An agent can tell this apart from add-labels or find-labels from the name and description alone, though the description never names those siblings to reinforce the boundary.

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

Usage Guidelines3/5

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

Implies 'use this to modify existing labels rather than create them', but never states preconditions such as needing an existing label ID (from find-labels) or the fact that shared labels must already exist. There is no explicit when-not guidance and no reference to alternatives like add-labels for creation.

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

update-projectsC
Destructive

Update multiple existing projects with new values.

NameRequiredDescriptionDefault
projectsYesThe projects to update.

Output Schema

NameRequiredDescription
failuresYesProjects that could not be updated, with the reason for each.
projectsYesThe updated projects.
totalCountYesThe total number of projects updated.
appliedOperationsYesSummary of operations performed.
updatedProjectIdsYesThe IDs of the updated projects.

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the safety profile is known from structured data; the description adds nothing beyond that. It does not warn that updates overwrite existing field values, that passing description clears it, or that color fallback to charcoal can silently change data — all relevant given the destructive flag.

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

Conciseness3/5

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

A single front-loaded sentence with no waste, but it is under-specified rather than efficient — 'with new values' is vague filler that conveys no actionable information.

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

Completeness2/5

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

For a destructive, non-idempotent batch mutation with an output schema present, the description should at minimum note that callers must supply the project id and that unspecified fields are left untouched (or not). Return values needn't be explained given the output schema, but the mutation semantics gap is a real omission.

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 nested project fields, enum values, and the 'null/empty string clears description' behavior are already documented in the schema. The description only reinforces the batch/array nature ('multiple existing projects'), which is the baseline expectation when the schema does the heavy lifting.

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?

States a specific verb (update) plus resource (projects) and clarifies the batch semantics ('multiple existing projects'), which separates it from add-projects and find-projects. It doesn't name any sibling explicitly, but the resource name is distinctive enough within the sibling set.

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?

No when-to-use guidance, no prerequisites, and no mention of alternatives such as project-management or add-projects for creation. The agent must infer from the name alone that this mutates existing projects rather than creating or reorganizing them.

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

update-remindersB
DestructiveIdempotent

Update existing reminders. Each reminder must specify its type ("relative", "absolute", or "location") and ID. Only include fields that need to change.

NameRequiredDescriptionDefault
remindersYesArray of reminders to update (max 25). Each must include the reminder type and ID. Only include fields that need to change.

Output Schema

NameRequiredDescription
failuresYesReminders that could not be updated, with the reason for each.
remindersYesThe updated reminders.
totalCountYesTotal reminders updated.
appliedOperationsYes
updatedReminderIdsYesIDs of updated reminders.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already disclose the significant traits: destructiveHint=true, idempotentHint=true, openWorldHint=true, readOnlyHint=false, so the safety burden is largely carried. The description usefully adds patch semantics ("Only include fields that need to change"), which clarifies that omitted fields are preserved rather than cleared. It adds nothing about what happens on an invalid/unknown ID, whether the type discriminator must match the existing reminder's type, or permission 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?

Three short sentences with no filler, and the core action is front-loaded ahead of the per-item requirement. The final sentence is slightly redundant with the schema's "reminders" property description, but the whole block is compact and easy to scan.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the annotations already cover the mutation/destructive profile. What remains missing for a destructive batch mutation (max 25 items) is how to obtain valid reminder IDs, what a failed partial batch does, and whether the type field must match the stored reminder type — meaningful gaps for correct invocation.

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% and there is effectively one top-level parameter, so the schema already explains the type/id/field-level semantics in detail. The description restates the type discrimination ("relative", "absolute", "location") which is the one genuinely helpful addition, but adds no format or constraint detail beyond the schema — baseline 3 applies.

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 opens with a specific verb and resource: "Update existing reminders." It names the discriminated type field and the ID requirement, which tells an agent the unit of work is a batch array of identified reminder objects. It does not explicitly distinguish itself from the sibling update_* tools or the create counterpart (create_reminder), but the verb+noun 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 Guidelines3/5

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

"Update existing reminders" implies the mutation use case versus create/find_reminders, and "Only include fields that need to change" gives useful partial-update guidance. However, the description states no when-not conditions, no prerequisite that the reminder must already exist and its ID be known, and no pointer to find_reminders for discovering IDs — those conditions are left to inference.

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

update-sectionsB
Destructive

Update multiple existing sections with new values.

NameRequiredDescriptionDefault
sectionsYesThe sections to update.

Output Schema

NameRequiredDescription
failuresYesSections that could not be updated, with the reason for each.
sectionsYesThe updated sections.
totalCountYesThe total number of sections updated.
appliedOperationsYes
updatedSectionIdsYesThe IDs of the updated sections.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false and openWorldHint=false, so the safety profile is largely covered. The description adds only the batch scope; it does not explain why the call is flagged destructive (e.g., whether omitting a section in the payload affects it) or that a failed batch may partially apply.

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?

A single front-loaded sentence with zero filler. It is lean rather than bloated; the only issue is that its brevity leaves gaps the agent must fill from annotations and schema.

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

Completeness3/5

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

With one parameter, a full schema, an output schema and four annotations hints, most of what an agent needs is present. However, the description omits the prerequisite of resolving section IDs (find-sections) and gives no hint about the destructive/idempotency semantics that the annotations flag but do not explain.

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% and each field (id, name, description with null-to-clear) is documented inline, so the baseline of 3 applies. 'With new values' in the description adds nothing the schema does not already state more precisely.

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?

Specific verb+resource ('Update ... sections') plus the batch qualifier 'multiple existing', which tells the agent this operates on already-existing records rather than creating them. It does not explicitly differentiate from siblings like add-sections or find-sections, but the verb and 'existing' constraint make the intent unambiguous.

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?

No statement of when to use this versus add-sections/find-sections, and no guidance on obtaining section IDs before calling. The word 'existing' weakly implies a lookup prerequisite, but that is inference rather than guidance.

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

update-tasksA
Destructive

Update existing tasks including content, dates, priorities, and assignments. Send only the fields that change.

NameRequiredDescriptionDefault
tasksYesThe tasks to update (max 25).

Output Schema

NameRequiredDescription
tasksYesThe updated tasks.
failuresYesTasks that could not be updated, with the reason for each.
totalCountYesThe total number of tasks updated.
updatedTaskIdsYesThe IDs of the updated tasks.
appliedOperationsYesSummary of operations performed.

TDQS

A3.6/5.0
Behavior3/5

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

The description adds a meaningful behavioral detail: only fields being changed should be sent, which supports safe partial updates. The annotations already declare destructiveHint=true and idempotentHint=false, and the schema documents side effects like label replacement and moving tasks out of sections/parents, so the description does not need to repeat those.

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 tightly written sentences with no filler. The core purpose is front-loaded, and the partial-update rule is stated immediately after the field categories.

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 rich input schema, annotations, and an output schema, the description is largely sufficient: it states the operation, the editable categories, and the partial-update expectation. It could be stronger by noting batch size or destructive side effects in prose, but those are covered structurally and do not need repetition.

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 detailed nested field semantics are already provided in the schema, including 'remove,' 'unassign,' and side effects. The description adds only broad categories of updatable fields and the partial-update rule, which is consistent with the baseline for high schema coverage.

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 uses a clear verb-resource pair, 'Update existing tasks,' and lists broad editable areas: content, dates, priorities, and assignments. It implicitly distinguishes updates from creation via 'existing,' but does not explicitly name or contrast with overlapping siblings such as reschedule-tasks.

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

Usage Guidelines3/5

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

The instruction 'Send only the fields that change' gives useful partial-update guidance, and 'existing tasks' implies this is for modifying already-created tasks. However, it does not explicitly say when to use this instead of sibling tools like reschedule-tasks or complete-tasks, which also affect task state.

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

user-infoB
Read-onlyIdempotent

Get comprehensive user information including user ID, full name, email, timezone with current local time, week start day preferences, current week dates, daily/weekly goal progress, and user plan (Free/Pro/Business).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
planYesThe user plan.
typeYesThe type of the response.
emailYesThe email address of the user.
userIdYesThe user ID.
fullNameYesThe full name of the user.
startDayYesThe start day of the week (1 = Monday, 7 = Sunday).
timezoneYesThe timezone of the user.
dailyGoalYesThe daily goal for task completions.
weeklyGoalYesThe weekly goal for task completions.
weekEndDateYesThe end date of the current week (YYYY-MM-DD).
startDayNameYesThe name of the start day.
weekStartDateYesThe start date of the current week (YYYY-MM-DD).
completedTodayYesThe number of tasks completed today.
currentLocalTimeYesThe current local time of the user.
currentWeekNumberYesThe current week number of the year.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the breadth of data returned (e.g., current local time, plan) but doesn't disclose any additional behavioral traits like authentication requirements or data freshness. This meets the baseline given the 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 a single sentence with a clear main clause and a list of attributes. It is efficient and front-loaded with the purpose. Each listed item adds value, and there is no padding.

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 output schema is present, the description focuses on the scope of the data. It lists the key fields, which is sufficient for a simple read-only tool with no parameters. Minor gaps like any special handling for timezones are not critical for this level of 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?

The tool has zero parameters, so the baseline is 4. The description compensates by detailing what information is returned, which clarifies the output without needing parameter explanations.

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 tool fetches comprehensive user information and lists specific fields (ID, name, email, timezone, etc.). It distinguishes from siblings like get-productivity-stats by focusing on core user profile data, though it doesn't explicitly contrast with them.

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 doesn't mention scenarios, prerequisites, or exclusions. This is a gap for a tool that could overlap with others like get-overview or get-productivity-stats.

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

view-attachmentA
Read-onlyIdempotent

View a file attachment from a Todoist comment. Pass the fileUrl from a comment's fileAttachment field. Supports images (returned inline), text files (returned as text), and binary files like PDFs (returned as embedded resources).

NameRequiredDescriptionDefault
fileUrlYesThe URL of the attachment file to view. Get this from the fileUrl field in a comment's fileAttachment.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds behavioral context by explaining how different file types are returned (images inline, text as text, binary as embedded resources), which is valuable beyond the 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 concise, with two sentences that efficiently convey the purpose, usage, and behavior. No wasted words; 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?

Given the tool's simplicity (one parameter, no output schema), the description is complete enough. It covers the input source, supported file types, and return behavior. The annotations cover safety, so the description doesn't need to repeat that. Minor gap: it doesn't mention error cases (e.g., invalid URL), but this is acceptable for a simple read 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?

The schema description coverage is 100%, with the fileUrl parameter fully described in the schema. The description reinforces this by explaining the source of the fileUrl ('from a comment's fileAttachment field'), but adds minimal new meaning beyond the 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's purpose: 'View a file attachment from a Todoist comment.' It specifies the resource (file attachment) and the action (view), and distinguishes it from siblings by focusing on attachment viewing rather than comment management or other operations.

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 context on when to use this tool: 'Pass the fileUrl from a comment's fileAttachment field.' It explains the prerequisite (obtaining the fileUrl from a comment) and the supported file types, but does not explicitly mention when not to use it or alternatives, though the sibling list suggests other tools for different operations.

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.

  1. 15 tool updatesv13.8.4
    • Changedadd-filters1 field changed
      • changedInput schema / properties / filters / items / required
        Previous value: -[
        -  "name",
        -  "query",
        -  "color"
        -]New value: +[
        +  "name",
        +  "query"
        +]
    • Changedadd-labels1 field changed
      • changedInput schema / properties / labels / items / required
        Previous value: -[
        -  "name",
        -  "color"
        -]New value: +[
        +  "name"
        +]
    • Changedadd-projects1 field changed
      • changedInput schema / properties / projects / items / required
        Previous value: -[
        -  "name",
        -  "color"
        -]New value: +[
        +  "name"
        +]
    • Changedadd-tasks2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedfetch-object1 field changed
      • changedOutput schema / properties / object / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "addedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "assignedByUid": {
        -        "type": "string"
        -      },
        -      "checked": {
        -        "description": "Whether the task is completed.",
        -        "type": "boolean"
        -      },
        -      "completedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "content": {
        -        "description": "Task title.",
        -        "type": "string"
        -      },
        -      "deadlineDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "duration": {
        -        "description": "e.g. \"2h30m\", or \"3d\" for a day-based duration.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "isDeleted": {
        -        "description": "True when deleted; absent otherwise.",
        -        "type": "boolean"
        -      },
        -      "isUncompletable": {
        -        "description": "An organizational header, not a real task.",
        -        "type": "boolean"
        -      },
        -      "labels": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "priority": {
        -        "description": "p1 is highest, p4 lowest.",
        -        "enum": [
        -          "p1",
        -          "p2",
        -          "p3",
        -          "p4"
        -        ],
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "recurring": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "string"
        -          }
        -        ],
        -        "description": "False when not recurring, otherwise the recurrence string."
        -      },
        -      "responsibleUid": {
        -        "type": "string"
        -      },
        -      "sectionId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "description",
        -      "recurring",
        -      "priority",
        -      "projectId",
        -      "checked"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "Ordering index among siblings.",
        -        "type": "number"
        -      },
        -      "color": {
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "Empty string when none.",
        -        "type": "string"
        -      },
        -      "folderId": {
        -        "description": "Workspace projects only.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "inboxProject": {
        -        "type": "boolean"
        -      },
        -      "isArchived": {
        -        "type": "boolean"
        -      },
        -      "isFavorite": {
        -        "type": "boolean"
        -      },
        -      "isShared": {
        -        "type": "boolean"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "viewStyle": {
        -        "description": "list, board or calendar.",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "description": "Undefined for personal projects.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "description",
        -      "isFavorite",
        -      "isShared",
        -      "inboxProject",
        -      "viewStyle",
        -      "childOrder",
        -      "isArchived"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "type": "string"
        -      },
        -      "fileAttachment": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "fileDuration": {
        -            "description": "Milliseconds, for audio/video.",
        -            "type": "number"
        -          },
        -          "fileName": {
        -            "type": "string"
        -          },
        -          "fileSize": {
        -            "description": "Bytes.",
        -            "type": "number"
        -          },
        -          "fileType": {
        -            "description": "MIME type.",
        -            "type": "string"
        -          },
        -          "fileUrl": {
        -            "type": "string"
        -          },
        -          "image": {
        -            "description": "For image resource types.",
        -            "type": "string"
        -          },
        -          "imageHeight": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "imageWidth": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "resourceType": {
        -            "description": "file, url, image, etc.",
        -            "type": "string"
        -          },
        -          "title": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          },
        -          "uploadState": {
        -            "enum": [
        -              "pending",
        -              "completed"
        -            ],
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "resourceType"
        -        ],
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "notifiedUserIds": {
        -        "description": "Users notified about this comment. Absent when nobody was notified.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "postedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "postedUid": {
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "postedAt"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Supports Markdown.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "sectionOrder": {
        -        "description": "Ordering index within the project.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sectionOrder"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "addedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "assignedByUid": {
        +        "type": "string"
        +      },
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "completedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "deadlineDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "duration": {
        +        "description": "e.g. \"2h30m\", or \"3d\" for a day-based duration.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "isDeleted": {
        +        "description": "True when deleted; absent otherwise.",
        +        "type": "boolean"
        +      },
        +      "isUncompletable": {
        +        "description": "An organizational header, not a real task.",
        +        "type": "boolean"
        +      },
        +      "labels": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "p1 is highest, p4 lowest.",
        +        "enum": [
        +          "p1",
        +          "p2",
        +          "p3",
        +          "p4"
        +        ],
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "recurring": {
        +        "description": "False when not recurring, otherwise the recurrence string.",
        +        "type": [
        +          "boolean",
        +          "string"
        +        ]
        +      },
        +      "responsibleUid": {
        +        "type": "string"
        +      },
        +      "sectionId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "description",
        +      "recurring",
        +      "priority",
        +      "projectId",
        +      "checked"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "Ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "color": {
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "description": "Empty string when none.",
        +        "type": "string"
        +      },
        +      "folderId": {
        +        "description": "Workspace projects only.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "inboxProject": {
        +        "type": "boolean"
        +      },
        +      "isArchived": {
        +        "type": "boolean"
        +      },
        +      "isFavorite": {
        +        "type": "boolean"
        +      },
        +      "isShared": {
        +        "type": "boolean"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "viewStyle": {
        +        "description": "list, board or calendar.",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "description": "Undefined for personal projects.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "description",
        +      "isFavorite",
        +      "isShared",
        +      "inboxProject",
        +      "viewStyle",
        +      "childOrder",
        +      "isArchived"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "fileAttachment": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "fileDuration": {
        +            "description": "Milliseconds, for audio/video.",
        +            "type": "number"
        +          },
        +          "fileName": {
        +            "type": "string"
        +          },
        +          "fileSize": {
        +            "description": "Bytes.",
        +            "type": "number"
        +          },
        +          "fileType": {
        +            "description": "MIME type.",
        +            "type": "string"
        +          },
        +          "fileUrl": {
        +            "type": "string"
        +          },
        +          "image": {
        +            "description": "For image resource types.",
        +            "type": "string"
        +          },
        +          "imageHeight": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "imageWidth": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "resourceType": {
        +            "description": "file, url, image, etc.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          },
        +          "uploadState": {
        +            "enum": [
        +              "pending",
        +              "completed"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "resourceType"
        +        ],
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "notifiedUserIds": {
        +        "description": "Users notified about this comment. Absent when nobody was notified.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "postedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "postedUid": {
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "postedAt"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Supports Markdown.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "sectionOrder": {
        +        "description": "Ordering index within the project.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sectionOrder"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfind-completed-tasks2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedfind-tasks2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedfind-tasks-by-date2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedimport-project-template2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedreorder-objects8 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"The items to reorder or move. Each item must have at least order or parentId. Items with parentId will be moved first, then items with order will be reordered. All items being reordered should be siblings for predictable results."New value: +"Each item needs order and/or parentId. Moves happen first, so order is a position under the new parent."
      • changedInput schema / properties / items / items / properties / order / description
        Previous value: -"The new position/order value for the entity. Lower values appear first."New value: +"0-based position among its siblings after the reorder: 0 is first, past the end is last. Unlisted siblings keep their relative order."
      • changedInput schema / properties / items / items / properties / parentId / description
        Previous value: -"Move a project to be a sub-project of this parent project ID, or use \"root\" to move to the top level. Only valid when type is \"project\"."New value: +"Move a personal project under this parent project ID, or \"root\" for the top level. Personal projects only."
      • changedInput schema / properties / type / description
        Previous value: -"The type of entity to reorder. \"project\" reorders sibling projects within the same parent (and can move projects to a new parent). \"section\" reorders sections within the same project."New value: +"\"project\": personal projects among the siblings under their parent, or workspace projects within their folder. \"section\": sections within their project."
      • changedOutput schema / properties / affectedIds / description
        Previous value: -"The IDs of all affected entities."New value: +"The IDs of the entities moved or reordered."
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Entities that could not be moved or reordered, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / success / description
        Previous value: -"Whether the operation was successful."New value: +"Whether every entity was moved and reordered as asked."
      • changedOutput schema / required
        Previous value: -[
        -  "type",
        -  "movedCount",
        -  "reorderedCount",
        -  "affectedIds",
        -  "success"
        -]New value: +[
        +  "type",
        +  "movedCount",
        +  "reorderedCount",
        +  "affectedIds",
        +  "failures",
        +  "success"
        +]
    • Changedreschedule-tasks2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedupdate-filters1 field changed
      • changedInput schema / properties / filters / items / required
        Previous value: -[
        -  "id",
        -  "color"
        -]New value: +[
        +  "id"
        +]
    • Changedupdate-labels1 field changed
      • changedInput schema / properties / labels / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "color": {
        -        "description": "Color for the entity. Accepts a color key (e.g. \"berry_red\") or display name (e.g. \"Berry Red\"). Valid colors: berry_red, red, orange, yellow, olive_green, lime_green, green, mint_green, teal, sky_blue, light_blue, blue, grape, violet, lavender, magenta, salmon, charcoal, grey, taupe. Unrecognized colors are omitted and charcoal will be used as the default.",
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "The ID of the personal label to update.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "isFavorite": {
        -        "description": "Whether to mark the label as a favorite.",
        -        "type": "boolean"
        -      },
        -      "labelType": {
        -        "const": "personal",
        -        "description": "Update a personal label, identified by its ID.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The new name of the label.",
        -        "maxLength": 128,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "order": {
        -        "description": "The new position of the label in the label list.",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "labelType",
        -      "id",
        -      "color"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "labelType": {
        -        "const": "shared",
        -        "description": "Rename a shared label across all tasks. Shared labels are identified by name; only renaming is supported (no color, order, or favorite).",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The current name of the shared label.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "newName": {
        -        "description": "The new name for the shared label.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "labelType",
        -      "name",
        -      "newName"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "color": {
        +        "description": "Color for the entity. Accepts a color key (e.g. \"berry_red\") or display name (e.g. \"Berry Red\"). Valid colors: berry_red, red, orange, yellow, olive_green, lime_green, green, mint_green, teal, sky_blue, light_blue, blue, grape, violet, lavender, magenta, salmon, charcoal, grey, taupe. Unrecognized colors are omitted and charcoal will be used as the default.",
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The ID of the personal label to update.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "isFavorite": {
        +        "description": "Whether to mark the label as a favorite.",
        +        "type": "boolean"
        +      },
        +      "labelType": {
        +        "const": "personal",
        +        "description": "Update a personal label, identified by its ID.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "The new name of the label.",
        +        "maxLength": 128,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "order": {
        +        "description": "The new position of the label in the label list.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "labelType",
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "labelType": {
        +        "const": "shared",
        +        "description": "Rename a shared label across all tasks. Shared labels are identified by name; only renaming is supported (no color, order, or favorite).",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "The current name of the shared label.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "newName": {
        +        "description": "The new name for the shared label.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "labelType",
        +      "name",
        +      "newName"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedupdate-projects1 field changed
      • changedInput schema / properties / projects / items / required
        Previous value: -[
        -  "id",
        -  "color"
        -]New value: +[
        +  "id"
        +]
    • Changedupdate-tasks2 fields changed
      • removedOutput schema / properties / tasks / items / properties / recurring / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / tasks / items / properties / recurring / type
        Added value: +[
        +  "boolean",
        +  "string"
        +]
  2. 15 tool updatesv13.8.0
    • Changedadd-comments5 fields changed
      • addedOutput schema / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Comments that could not be added, identified by their content, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / successCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalRequested
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "comments",
        -  "totalCount",
        -  "addedCommentIds"
        -]New value: +[
        +  "comments",
        +  "totalCount",
        +  "addedCommentIds",
        +  "failures",
        +  "totalRequested",
        +  "successCount",
        +  "failureCount"
        +]
    • Changedadd-filters5 fields changed
      • addedOutput schema / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Filters that could not be created, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / successCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalRequested
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "filters",
        -  "totalCount"
        -]New value: +[
        +  "filters",
        +  "totalCount",
        +  "failures",
        +  "totalRequested",
        +  "successCount",
        +  "failureCount"
        +]
    • Changedadd-labels5 fields changed
      • addedOutput schema / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Labels that could not be created, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / successCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalRequested
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "labels",
        -  "totalCount"
        -]New value: +[
        +  "labels",
        +  "totalCount",
        +  "failures",
        +  "totalRequested",
        +  "successCount",
        +  "failureCount"
        +]
    • Changedadd-projects4 fields changed
      • removedOutput schema / properties / failureCount / description
        Removed value: -"The number of failed project creations."
      • changedOutput schema / properties / failures / description
        Previous value: -"Projects that could not be created, with the reason for each. A failure here does not affect the other projects in the batch — do not retry the whole batch; address or drop the failed items."New value: +"Projects that could not be created, with the reason for each."
      • removedOutput schema / properties / successCount / description
        Removed value: -"The number of successfully created projects."
      • removedOutput schema / properties / totalRequested / description
        Removed value: -"The total number of projects requested."
    • Changedadd-reminders5 fields changed
      • addedOutput schema / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Reminders that could not be created, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / successCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalRequested
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "reminders",
        -  "totalCount",
        -  "addedReminderIds"
        -]New value: +[
        +  "reminders",
        +  "totalCount",
        +  "addedReminderIds",
        +  "failures",
        +  "totalRequested",
        +  "successCount",
        +  "failureCount"
        +]
    • Changedadd-sections4 fields changed
      • removedOutput schema / properties / failureCount / description
        Removed value: -"The number of failed section creations."
      • changedOutput schema / properties / failures / description
        Previous value: -"Sections that could not be created, with the reason for each. A failure here does not affect the other sections in the batch — do not retry the whole batch; address or drop the failed items."New value: +"Sections that could not be created, with the reason for each."
      • removedOutput schema / properties / successCount / description
        Removed value: -"The number of successfully created sections."
      • removedOutput schema / properties / totalRequested / description
        Removed value: -"The total number of sections requested."
    • Changedadd-tasks4 fields changed
      • removedOutput schema / properties / failureCount / description
        Removed value: -"The number of failed task creations."
      • changedOutput schema / properties / failures / description
        Previous value: -"Failed task creations with error details."New value: +"Tasks that could not be created, with the reason for each."
      • removedOutput schema / properties / successCount / description
        Removed value: -"The number of successfully created tasks."
      • removedOutput schema / properties / totalRequested / description
        Removed value: -"The total number of tasks requested."
    • Changedfind-activity1 field changed
      • changedInput schema / properties / objectId / description
        Previous value: -"Filter by specific object ID (task, project, or comment)."New value: +"Filter by specific object ID (task, project, or comment). Requires objectType."
    • Changedupdate-comments4 fields changed
      • addedOutput schema / properties / appliedOperations / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / appliedOperations / required
        Previous value: -[
        -  "updateCount"
        -]New value: +[
        +  "updateCount",
        +  "failureCount"
        +]
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Comments that could not be updated, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "comments",
        -  "totalCount",
        -  "updatedCommentIds",
        -  "appliedOperations"
        -]New value: +[
        +  "comments",
        +  "totalCount",
        +  "updatedCommentIds",
        +  "failures",
        +  "appliedOperations"
        +]
    • Changedupdate-filters5 fields changed
      • addedOutput schema / properties / appliedOperations / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / appliedOperations / required
        Previous value: -[
        -  "updateCount",
        -  "skippedCount"
        -]New value: +[
        +  "updateCount",
        +  "skippedCount",
        +  "failureCount"
        +]
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Filters that could not be updated, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / filters / description
        Previous value: -"The updated filters."New value: +"The updated filters, as read back after the update. Empty if they could not be read back; updatedFilterIds still lists what was updated."
      • changedOutput schema / required
        Previous value: -[
        -  "filters",
        -  "totalCount",
        -  "updatedFilterIds",
        -  "appliedOperations"
        -]New value: +[
        +  "filters",
        +  "totalCount",
        +  "updatedFilterIds",
        +  "failures",
        +  "appliedOperations"
        +]
    • Changedupdate-labels4 fields changed
      • addedOutput schema / properties / appliedOperations / properties / failureCount
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / appliedOperations / required
        Previous value: -[
        -  "updateCount",
        -  "renameCount",
        -  "skippedCount"
        -]New value: +[
        +  "updateCount",
        +  "renameCount",
        +  "skippedCount",
        +  "failureCount"
        +]
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Labels that could not be updated, identified by ID (personal) or name (shared), with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "updatedLabels",
        -  "renamedSharedLabels",
        -  "totalCount",
        -  "appliedOperations"
        -]New value: +[
        +  "updatedLabels",
        +  "renamedSharedLabels",
        +  "totalCount",
        +  "failures",
        +  "appliedOperations"
        +]
    • Changedupdate-projects2 fields changed
      • removedOutput schema / properties / appliedOperations / properties / failureCount / description
        Removed value: -"The number of projects that failed to update."
      • changedOutput schema / properties / failures / description
        Previous value: -"Projects that could not be updated, with the reason for each. A failure here does not affect the other projects in the batch — do not retry the whole batch; address or drop the failed items."New value: +"Projects that could not be updated, with the reason for each."
    • Changedupdate-reminders3 fields changed
      • addedOutput schema / properties / appliedOperations
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "failureCount": {
        +      "type": "number"
        +    },
        +    "updateCount": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "updateCount",
        +    "failureCount"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Reminders that could not be updated, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "reminders",
        -  "totalCount",
        -  "updatedReminderIds"
        -]New value: +[
        +  "reminders",
        +  "totalCount",
        +  "updatedReminderIds",
        +  "failures",
        +  "appliedOperations"
        +]
    • Changedupdate-sections3 fields changed
      • addedOutput schema / properties / appliedOperations
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "failureCount": {
        +      "type": "number"
        +    },
        +    "updateCount": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "updateCount",
        +    "failureCount"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / failures
        Added value: +{
        +  "description": "Sections that could not be updated, with the reason for each.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "item": {
        +        "description": "Usually the ID of the item that failed.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "item",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "sections",
        -  "totalCount",
        -  "updatedSectionIds"
        -]New value: +[
        +  "sections",
        +  "totalCount",
        +  "updatedSectionIds",
        +  "failures",
        +  "appliedOperations"
        +]
    • Changedupdate-tasks2 fields changed
      • removedOutput schema / properties / appliedOperations / properties / failureCount / description
        Removed value: -"The number of tasks that failed to update."
      • changedOutput schema / properties / failures / description
        Previous value: -"Tasks that could not be updated, with the reason for each. A failure here does not affect the other tasks in the batch."New value: +"Tasks that could not be updated, with the reason for each."
  3. 3 tool updatesv13.7.0
    • Changedadd-reminders2 fields changed
      • changedInput schema / properties / reminders / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "isUrgent": {
        -        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        -        "type": "boolean"
        -      },
        -      "minuteOffset": {
        -        "description": "Minutes before the task due time to trigger the reminder. E.g., 30 for 30 minutes before, 60 for 1 hour before, 1440 for 1 day before.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "service": {
        -        "description": "Delivery method: \"email\" or \"push\" notification. Defaults to push.",
        -        "enum": [
        -          "email",
        -          "push"
        -        ],
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "description": "The ID of the task to set a reminder for.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "relative",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "taskId",
        -      "minuteOffset"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "due": {
        -        "description": "The specific date/time for the reminder.",
        -        "properties": {
        -          "date": {
        -            "description": "Due date in YYYY-MM-DD format.",
        -            "type": "string"
        -          },
        -          "lang": {
        -            "description": "Language for parsing the due string, e.g. \"en\".",
        -            "type": "string"
        -          },
        -          "string": {
        -            "description": "Natural language due string, e.g. \"tomorrow at 3pm\".",
        -            "type": "string"
        -          },
        -          "timezone": {
        -            "description": "Timezone for the reminder, e.g. \"America/New_York\".",
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "isUrgent": {
        -        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        -        "type": "boolean"
        -      },
        -      "service": {
        -        "description": "Delivery method: \"email\" or \"push\" notification. Defaults to push.",
        -        "enum": [
        -          "email",
        -          "push"
        -        ],
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "description": "The ID of the task to set a reminder for.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "absolute",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "taskId",
        -      "due"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "locLat": {
        -        "description": "Latitude of the location as a string, e.g. \"37.7749\".",
        -        "type": "string"
        -      },
        -      "locLong": {
        -        "description": "Longitude of the location as a string, e.g. \"-122.4194\".",
        -        "type": "string"
        -      },
        -      "locTrigger": {
        -        "description": "When to trigger: \"on_enter\" (arriving) or \"on_leave\" (departing).",
        -        "enum": [
        -          "on_enter",
        -          "on_leave"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Name of the location, e.g. \"Office\", \"Home\".",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "radius": {
        -        "description": "Radius in meters for the geofence. Defaults to server default.",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      },
        -      "taskId": {
        -        "description": "The ID of the task to set a reminder for.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "location",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "taskId",
        -      "name",
        -      "locLat",
        -      "locLong",
        -      "locTrigger"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "isUrgent": {
        +        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        +        "type": "boolean"
        +      },
        +      "minuteOffset": {
        +        "description": "Minutes before the task due time to trigger the reminder. E.g., 30 for 30 minutes before, 60 for 1 hour before, 1440 for 1 day before.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Defaults to the creator.",
        +        "type": "string"
        +      },
        +      "service": {
        +        "description": "Delivery method: \"email\" or \"push\" notification. Defaults to push.",
        +        "enum": [
        +          "email",
        +          "push"
        +        ],
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "description": "The ID of the task to set a reminder for.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "relative",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "taskId",
        +      "minuteOffset"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "due": {
        +        "description": "The specific date/time for the reminder.",
        +        "properties": {
        +          "date": {
        +            "description": "Due date in YYYY-MM-DD format.",
        +            "type": "string"
        +          },
        +          "lang": {
        +            "description": "Language for parsing the due string, e.g. \"en\".",
        +            "type": "string"
        +          },
        +          "string": {
        +            "description": "Natural language due string, e.g. \"tomorrow at 3pm\".",
        +            "type": "string"
        +          },
        +          "timezone": {
        +            "description": "Timezone for the reminder, e.g. \"America/New_York\".",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "isUrgent": {
        +        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        +        "type": "boolean"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Defaults to the creator.",
        +        "type": "string"
        +      },
        +      "service": {
        +        "description": "Delivery method: \"email\" or \"push\" notification. Defaults to push.",
        +        "enum": [
        +          "email",
        +          "push"
        +        ],
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "description": "The ID of the task to set a reminder for.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "absolute",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "taskId",
        +      "due"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "locLat": {
        +        "description": "Latitude of the location as a string, e.g. \"37.7749\".",
        +        "type": "string"
        +      },
        +      "locLong": {
        +        "description": "Longitude of the location as a string, e.g. \"-122.4194\".",
        +        "type": "string"
        +      },
        +      "locTrigger": {
        +        "description": "When to trigger: \"on_enter\" (arriving) or \"on_leave\" (departing).",
        +        "enum": [
        +          "on_enter",
        +          "on_leave"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "Name of the location, e.g. \"Office\", \"Home\".",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Defaults to the creator.",
        +        "type": "string"
        +      },
        +      "radius": {
        +        "description": "Radius in meters for the geofence. Defaults to server default.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "taskId": {
        +        "description": "The ID of the task to set a reminder for.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "location",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "taskId",
        +      "name",
        +      "locLat",
        +      "locLong",
        +      "locTrigger"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedOutput schema / properties / reminders / items / properties / notifyUid
        Added value: +{
        +  "description": "User ID the reminder notifies.",
        +  "type": "string"
        +}
    • Changedfind-reminders1 field changed
      • addedOutput schema / properties / reminders / items / properties / notifyUid
        Added value: +{
        +  "description": "User ID the reminder notifies.",
        +  "type": "string"
        +}
    • Changedupdate-reminders2 fields changed
      • changedInput schema / properties / reminders / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "id": {
        -        "description": "The ID of the relative reminder to update.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "isUrgent": {
        -        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        -        "type": "boolean"
        -      },
        -      "minuteOffset": {
        -        "description": "New minute offset before task due time.",
        -        "maximum": 9007199254740991,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "service": {
        -        "description": "New delivery method: \"email\" or \"push\".",
        -        "enum": [
        -          "email",
        -          "push"
        -        ],
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "relative",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "due": {
        -        "description": "New due date/time for the reminder.",
        -        "properties": {
        -          "date": {
        -            "description": "Due date in YYYY-MM-DD format.",
        -            "type": "string"
        -          },
        -          "lang": {
        -            "description": "Language for parsing the due string, e.g. \"en\".",
        -            "type": "string"
        -          },
        -          "string": {
        -            "description": "Natural language due string, e.g. \"tomorrow at 3pm\".",
        -            "type": "string"
        -          },
        -          "timezone": {
        -            "description": "Timezone for the reminder, e.g. \"America/New_York\".",
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "id": {
        -        "description": "The ID of the absolute reminder to update.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "isUrgent": {
        -        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        -        "type": "boolean"
        -      },
        -      "service": {
        -        "description": "New delivery method: \"email\" or \"push\".",
        -        "enum": [
        -          "email",
        -          "push"
        -        ],
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "absolute",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "description": "The ID of the location reminder to update.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "locLat": {
        -        "description": "New latitude.",
        -        "type": "string"
        -      },
        -      "locLong": {
        -        "description": "New longitude.",
        -        "type": "string"
        -      },
        -      "locTrigger": {
        -        "description": "New trigger condition: \"on_enter\" or \"on_leave\".",
        -        "enum": [
        -          "on_enter",
        -          "on_leave"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "New location name.",
        -        "type": "string"
        -      },
        -      "radius": {
        -        "description": "New radius in meters.",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "location",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "id"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "id": {
        +        "description": "The ID of the relative reminder to update.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "isUrgent": {
        +        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        +        "type": "boolean"
        +      },
        +      "minuteOffset": {
        +        "description": "New minute offset before task due time.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Omit to keep the current one.",
        +        "type": "string"
        +      },
        +      "service": {
        +        "description": "New delivery method: \"email\" or \"push\".",
        +        "enum": [
        +          "email",
        +          "push"
        +        ],
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "relative",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "due": {
        +        "description": "New due date/time for the reminder.",
        +        "properties": {
        +          "date": {
        +            "description": "Due date in YYYY-MM-DD format.",
        +            "type": "string"
        +          },
        +          "lang": {
        +            "description": "Language for parsing the due string, e.g. \"en\".",
        +            "type": "string"
        +          },
        +          "string": {
        +            "description": "Natural language due string, e.g. \"tomorrow at 3pm\".",
        +            "type": "string"
        +          },
        +          "timezone": {
        +            "description": "Timezone for the reminder, e.g. \"America/New_York\".",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "id": {
        +        "description": "The ID of the absolute reminder to update.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "isUrgent": {
        +        "description": "Whether this is an urgent reminder. Applies to relative and absolute reminders.",
        +        "type": "boolean"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Omit to keep the current one.",
        +        "type": "string"
        +      },
        +      "service": {
        +        "description": "New delivery method: \"email\" or \"push\".",
        +        "enum": [
        +          "email",
        +          "push"
        +        ],
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "absolute",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "id": {
        +        "description": "The ID of the location reminder to update.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "locLat": {
        +        "description": "New latitude.",
        +        "type": "string"
        +      },
        +      "locLong": {
        +        "description": "New longitude.",
        +        "type": "string"
        +      },
        +      "locTrigger": {
        +        "description": "New trigger condition: \"on_enter\" or \"on_leave\".",
        +        "enum": [
        +          "on_enter",
        +          "on_leave"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "New location name.",
        +        "type": "string"
        +      },
        +      "notifyUser": {
        +        "description": "Who to remind: user ID, email, name, or \"me\". Must collaborate on the task's project. Omit to keep the current one.",
        +        "type": "string"
        +      },
        +      "radius": {
        +        "description": "New radius in meters.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "location",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "id"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedOutput schema / properties / reminders / items / properties / notifyUid
        Added value: +{
        +  "description": "User ID the reminder notifies.",
        +  "type": "string"
        +}
  4. 1 tool updatev13.6.1
    • Changedfind-activity2 fields changed
      • changedInput schema / properties / eventType / enum
        Previous value: -[
        -  "added",
        -  "updated",
        -  "deleted",
        -  "completed",
        -  "uncompleted",
        -  "archived",
        -  "unarchived",
        -  "shared",
        -  "left"
        -]New value: +[
        +  "added",
        +  "updated",
        +  "deleted",
        +  "completed",
        +  "uncompleted",
        +  "archived",
        +  "unarchived",
        +  "shared",
        +  "left",
        +  "moved"
        +]
      • changedInput schema / properties / objectType / enum
        Previous value: -[
        -  "task",
        -  "project",
        -  "comment"
        -]New value: +[
        +  "task",
        +  "comment",
        +  "project"
        +]
  5. 8 tool updatesv13.3.0
    • Changedadd-tasks2 fields changed
      • changedInput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task. Use format: \"2h\" (hours), \"90m\" (minutes), \"2h30m\" (combined), or \"1.5h\" (decimal hours). Max 24h."New value: +"The duration of the task. Use format: \"2h\" (hours), \"90m\" (minutes), \"2h30m\" (combined), \"1.5h\" (decimal hours), or \"3d\" (whole days; days cannot be combined with hours or minutes). Todoist apps only display durations under 24 hours: a longer or day-based duration is stored and reported by this server, but the apps show the task as having no duration."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedfetch-object1 field changed
      • changedOutput schema / properties / object / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "addedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "assignedByUid": {
        -        "type": "string"
        -      },
        -      "checked": {
        -        "description": "Whether the task is completed.",
        -        "type": "boolean"
        -      },
        -      "completedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "content": {
        -        "description": "Task title.",
        -        "type": "string"
        -      },
        -      "deadlineDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "duration": {
        -        "description": "e.g. \"2h30m\".",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "isDeleted": {
        -        "description": "True when deleted; absent otherwise.",
        -        "type": "boolean"
        -      },
        -      "isUncompletable": {
        -        "description": "An organizational header, not a real task.",
        -        "type": "boolean"
        -      },
        -      "labels": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "priority": {
        -        "description": "p1 is highest, p4 lowest.",
        -        "enum": [
        -          "p1",
        -          "p2",
        -          "p3",
        -          "p4"
        -        ],
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "recurring": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "string"
        -          }
        -        ],
        -        "description": "False when not recurring, otherwise the recurrence string."
        -      },
        -      "responsibleUid": {
        -        "type": "string"
        -      },
        -      "sectionId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "description",
        -      "recurring",
        -      "priority",
        -      "projectId",
        -      "checked"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "Ordering index among siblings.",
        -        "type": "number"
        -      },
        -      "color": {
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "Empty string when none.",
        -        "type": "string"
        -      },
        -      "folderId": {
        -        "description": "Workspace projects only.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "inboxProject": {
        -        "type": "boolean"
        -      },
        -      "isArchived": {
        -        "type": "boolean"
        -      },
        -      "isFavorite": {
        -        "type": "boolean"
        -      },
        -      "isShared": {
        -        "type": "boolean"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "viewStyle": {
        -        "description": "list, board or calendar.",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "description": "Undefined for personal projects.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "description",
        -      "isFavorite",
        -      "isShared",
        -      "inboxProject",
        -      "viewStyle",
        -      "childOrder",
        -      "isArchived"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "type": "string"
        -      },
        -      "fileAttachment": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "fileDuration": {
        -            "description": "Milliseconds, for audio/video.",
        -            "type": "number"
        -          },
        -          "fileName": {
        -            "type": "string"
        -          },
        -          "fileSize": {
        -            "description": "Bytes.",
        -            "type": "number"
        -          },
        -          "fileType": {
        -            "description": "MIME type.",
        -            "type": "string"
        -          },
        -          "fileUrl": {
        -            "type": "string"
        -          },
        -          "image": {
        -            "description": "For image resource types.",
        -            "type": "string"
        -          },
        -          "imageHeight": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "imageWidth": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "resourceType": {
        -            "description": "file, url, image, etc.",
        -            "type": "string"
        -          },
        -          "title": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          },
        -          "uploadState": {
        -            "enum": [
        -              "pending",
        -              "completed"
        -            ],
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "resourceType"
        -        ],
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "notifiedUserIds": {
        -        "description": "Users notified about this comment. Absent when nobody was notified.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "postedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "postedUid": {
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "postedAt"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Supports Markdown.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "sectionOrder": {
        -        "description": "Ordering index within the project.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sectionOrder"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "addedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "assignedByUid": {
        +        "type": "string"
        +      },
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "completedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "deadlineDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "duration": {
        +        "description": "e.g. \"2h30m\", or \"3d\" for a day-based duration.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "isDeleted": {
        +        "description": "True when deleted; absent otherwise.",
        +        "type": "boolean"
        +      },
        +      "isUncompletable": {
        +        "description": "An organizational header, not a real task.",
        +        "type": "boolean"
        +      },
        +      "labels": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "p1 is highest, p4 lowest.",
        +        "enum": [
        +          "p1",
        +          "p2",
        +          "p3",
        +          "p4"
        +        ],
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "recurring": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "string"
        +          }
        +        ],
        +        "description": "False when not recurring, otherwise the recurrence string."
        +      },
        +      "responsibleUid": {
        +        "type": "string"
        +      },
        +      "sectionId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "description",
        +      "recurring",
        +      "priority",
        +      "projectId",
        +      "checked"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "Ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "color": {
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "description": "Empty string when none.",
        +        "type": "string"
        +      },
        +      "folderId": {
        +        "description": "Workspace projects only.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "inboxProject": {
        +        "type": "boolean"
        +      },
        +      "isArchived": {
        +        "type": "boolean"
        +      },
        +      "isFavorite": {
        +        "type": "boolean"
        +      },
        +      "isShared": {
        +        "type": "boolean"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "viewStyle": {
        +        "description": "list, board or calendar.",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "description": "Undefined for personal projects.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "description",
        +      "isFavorite",
        +      "isShared",
        +      "inboxProject",
        +      "viewStyle",
        +      "childOrder",
        +      "isArchived"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "fileAttachment": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "fileDuration": {
        +            "description": "Milliseconds, for audio/video.",
        +            "type": "number"
        +          },
        +          "fileName": {
        +            "type": "string"
        +          },
        +          "fileSize": {
        +            "description": "Bytes.",
        +            "type": "number"
        +          },
        +          "fileType": {
        +            "description": "MIME type.",
        +            "type": "string"
        +          },
        +          "fileUrl": {
        +            "type": "string"
        +          },
        +          "image": {
        +            "description": "For image resource types.",
        +            "type": "string"
        +          },
        +          "imageHeight": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "imageWidth": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "resourceType": {
        +            "description": "file, url, image, etc.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          },
        +          "uploadState": {
        +            "enum": [
        +              "pending",
        +              "completed"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "resourceType"
        +        ],
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "notifiedUserIds": {
        +        "description": "Users notified about this comment. Absent when nobody was notified.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "postedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "postedUid": {
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "postedAt"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Supports Markdown.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "sectionOrder": {
        +        "description": "Ordering index within the project.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sectionOrder"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfind-completed-tasks1 field changed
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedfind-tasks1 field changed
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedfind-tasks-by-date1 field changed
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedimport-project-template1 field changed
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedreschedule-tasks1 field changed
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
    • Changedupdate-tasks2 fields changed
      • changedInput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task. Use format: \"2h\" (hours), \"90m\" (minutes), \"2h30m\" (combined), or \"1.5h\" (decimal hours). Max 24h."New value: +"The duration of the task. Use format: \"2h\" (hours), \"90m\" (minutes), \"2h30m\" (combined), \"1.5h\" (decimal hours), or \"3d\" (whole days; days cannot be combined with hours or minutes). Todoist apps only display durations under 24 hours: a longer or day-based duration is stored and reported by this server, but the apps show the task as having no duration."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"e.g. \"2h30m\"."New value: +"e.g. \"2h30m\", or \"3d\" for a day-based duration."
  6. 8 tool updatesv13.2.7
    • Changedadd-tasks1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedfetch-object1 field changed
      • changedOutput schema / properties / object / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "addedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "assignedByUid": {
        -        "type": "string"
        -      },
        -      "checked": {
        -        "description": "Whether the task is completed.",
        -        "type": "boolean"
        -      },
        -      "completedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "content": {
        -        "description": "Task title.",
        -        "type": "string"
        -      },
        -      "deadlineDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "duration": {
        -        "description": "e.g. \"2h30m\".",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "isUncompletable": {
        -        "description": "An organizational header, not a real task.",
        -        "type": "boolean"
        -      },
        -      "labels": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "priority": {
        -        "description": "p1 is highest, p4 lowest.",
        -        "enum": [
        -          "p1",
        -          "p2",
        -          "p3",
        -          "p4"
        -        ],
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "recurring": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "string"
        -          }
        -        ],
        -        "description": "False when not recurring, otherwise the recurrence string."
        -      },
        -      "responsibleUid": {
        -        "type": "string"
        -      },
        -      "sectionId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "description",
        -      "recurring",
        -      "priority",
        -      "projectId",
        -      "checked"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "Ordering index among siblings.",
        -        "type": "number"
        -      },
        -      "color": {
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "Empty string when none.",
        -        "type": "string"
        -      },
        -      "folderId": {
        -        "description": "Workspace projects only.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "inboxProject": {
        -        "type": "boolean"
        -      },
        -      "isArchived": {
        -        "type": "boolean"
        -      },
        -      "isFavorite": {
        -        "type": "boolean"
        -      },
        -      "isShared": {
        -        "type": "boolean"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "viewStyle": {
        -        "description": "list, board or calendar.",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "description": "Undefined for personal projects.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "description",
        -      "isFavorite",
        -      "isShared",
        -      "inboxProject",
        -      "viewStyle",
        -      "childOrder",
        -      "isArchived"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "type": "string"
        -      },
        -      "fileAttachment": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "fileDuration": {
        -            "description": "Milliseconds, for audio/video.",
        -            "type": "number"
        -          },
        -          "fileName": {
        -            "type": "string"
        -          },
        -          "fileSize": {
        -            "description": "Bytes.",
        -            "type": "number"
        -          },
        -          "fileType": {
        -            "description": "MIME type.",
        -            "type": "string"
        -          },
        -          "fileUrl": {
        -            "type": "string"
        -          },
        -          "image": {
        -            "description": "For image resource types.",
        -            "type": "string"
        -          },
        -          "imageHeight": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "imageWidth": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "resourceType": {
        -            "description": "file, url, image, etc.",
        -            "type": "string"
        -          },
        -          "title": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          },
        -          "uploadState": {
        -            "enum": [
        -              "pending",
        -              "completed"
        -            ],
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "resourceType"
        -        ],
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "notifiedUserIds": {
        -        "description": "Users notified about this comment. Absent when nobody was notified.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "postedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "postedUid": {
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "postedAt"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Supports Markdown.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "sectionOrder": {
        -        "description": "Ordering index within the project.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sectionOrder"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "addedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "assignedByUid": {
        +        "type": "string"
        +      },
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "completedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "deadlineDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "duration": {
        +        "description": "e.g. \"2h30m\".",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "isDeleted": {
        +        "description": "True when deleted; absent otherwise.",
        +        "type": "boolean"
        +      },
        +      "isUncompletable": {
        +        "description": "An organizational header, not a real task.",
        +        "type": "boolean"
        +      },
        +      "labels": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "p1 is highest, p4 lowest.",
        +        "enum": [
        +          "p1",
        +          "p2",
        +          "p3",
        +          "p4"
        +        ],
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "recurring": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "string"
        +          }
        +        ],
        +        "description": "False when not recurring, otherwise the recurrence string."
        +      },
        +      "responsibleUid": {
        +        "type": "string"
        +      },
        +      "sectionId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "description",
        +      "recurring",
        +      "priority",
        +      "projectId",
        +      "checked"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "Ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "color": {
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "description": "Empty string when none.",
        +        "type": "string"
        +      },
        +      "folderId": {
        +        "description": "Workspace projects only.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "inboxProject": {
        +        "type": "boolean"
        +      },
        +      "isArchived": {
        +        "type": "boolean"
        +      },
        +      "isFavorite": {
        +        "type": "boolean"
        +      },
        +      "isShared": {
        +        "type": "boolean"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "viewStyle": {
        +        "description": "list, board or calendar.",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "description": "Undefined for personal projects.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "description",
        +      "isFavorite",
        +      "isShared",
        +      "inboxProject",
        +      "viewStyle",
        +      "childOrder",
        +      "isArchived"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "fileAttachment": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "fileDuration": {
        +            "description": "Milliseconds, for audio/video.",
        +            "type": "number"
        +          },
        +          "fileName": {
        +            "type": "string"
        +          },
        +          "fileSize": {
        +            "description": "Bytes.",
        +            "type": "number"
        +          },
        +          "fileType": {
        +            "description": "MIME type.",
        +            "type": "string"
        +          },
        +          "fileUrl": {
        +            "type": "string"
        +          },
        +          "image": {
        +            "description": "For image resource types.",
        +            "type": "string"
        +          },
        +          "imageHeight": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "imageWidth": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "resourceType": {
        +            "description": "file, url, image, etc.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          },
        +          "uploadState": {
        +            "enum": [
        +              "pending",
        +              "completed"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "resourceType"
        +        ],
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "notifiedUserIds": {
        +        "description": "Users notified about this comment. Absent when nobody was notified.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "postedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "postedUid": {
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "postedAt"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Supports Markdown.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "sectionOrder": {
        +        "description": "Ordering index within the project.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sectionOrder"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfind-completed-tasks1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedfind-tasks1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedfind-tasks-by-date1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedimport-project-template1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedreschedule-tasks1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedupdate-tasks1 field changed
      • addedOutput schema / properties / tasks / items / properties / isDeleted
        Added value: +{
        +  "description": "True when deleted; absent otherwise.",
        +  "type": "boolean"
        +}
  7. 1 tool updatev13.2.6
    • Changedget-overview1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Optional project ID. Use \"inbox\" for the Inbox. If provided, shows detailed overview of that project. If omitted, shows overview of all projects."New value: +"Optional project ID. Use \"inbox\" for the Inbox. If provided, returns that project's tasks grouped by section. If omitted, returns the project and section structure for the whole account with no tasks."
  8. 1 tool updatev13.2.4
    • Changedget-overview1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Optional project ID. If provided, shows detailed overview of that project. If omitted, shows overview of all projects."New value: +"Optional project ID. Use \"inbox\" for the Inbox. If provided, shows detailed overview of that project. If omitted, shows overview of all projects."
  9. 3 tool updatesv13.2.1
    • Changedadd-filters2 fields changed
      • addedInput schema / properties / filters / items / properties / description
        Added value: +{
        +  "description": "A markdown description explaining what the filter is for.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / filters / items / properties / description
        Added value: +{
        +  "description": "A markdown description explaining what the filter is for. Omitted when the filter has none.",
        +  "type": "string"
        +}
    • Changedfind-filters1 field changed
      • addedOutput schema / properties / filters / items / properties / description
        Added value: +{
        +  "description": "A markdown description explaining what the filter is for. Omitted when the filter has none.",
        +  "type": "string"
        +}
    • Changedupdate-filters2 fields changed
      • addedInput schema / properties / filters / items / properties / description
        Added value: +{
        +  "description": "A markdown description explaining what the filter is for. Use \"remove\" to clear the description; omit the field to leave it unchanged.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / filters / items / properties / description
        Added value: +{
        +  "description": "A markdown description explaining what the filter is for. Omitted when the filter has none.",
        +  "type": "string"
        +}
  10. 3 tool updatesv13.1.3
    • Changedfind-tasks1 field changed
      • changedInput schema / properties / responsibleUser / description
        Previous value: -"Find tasks assigned to this user. Can be a user ID, name, or email address."New value: +"Find tasks assigned to this user. Can be a user ID, name, or email address. The current user also includes unassigned tasks."
    • Changedfind-tasks-by-date1 field changed
      • changedInput schema / properties / responsibleUser / description
        Previous value: -"Filter tasks assigned to this user. User ID, name, or email. For personal queries (summaries, plans, reports), set to current user from user-info to exclude collaborators."New value: +"Filter tasks assigned to this user. User ID, name, or email. The current user also includes unassigned tasks."
    • Changedget-overview3 fields changed
      • addedOutput schema / $defs / __schema0 / properties / sections / items / properties / description
        Added value: +{
        +  "description": "Supports Markdown.",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / __schema0 / properties / sections / items / properties / sectionOrder
        Added value: +{
        +  "description": "Ordering index within the project.",
        +  "type": "number"
        +}
      • changedOutput schema / $defs / __schema0 / properties / sections / items / required
        Previous value: -[
        -  "id",
        -  "name"
        -]New value: +[
        +  "id",
        +  "name",
        +  "sectionOrder"
        +]
  11. 47 tool updatesv13.0.0
    • Changedadd-comments2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-filters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-labels2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-projects2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-reminders2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-sections2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedanalyze-project-health2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcomplete-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddelete-object2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedexport-project-template2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfetch2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfetch-object2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-activity2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-comments2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-completed-tasks4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / since / allOf
        Previous value: -[
        -  {
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        +  },
        +  {
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        +  }
        +]
      • changedInput schema / properties / until / allOf
        Previous value: -[
        -  {
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        +  },
        +  {
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        +  }
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-filters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-labels2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-project-collaborators2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-projects2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-reminders2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-sections2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind-tasks-by-date2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-overview6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / $defs
        Added value: +{
        +  "__schema0": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "The ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "children": {
        +        "description": "Nested child projects.",
        +        "items": {
        +          "$ref": "#/$defs/__schema0"
        +        },
        +        "type": "array"
        +      },
        +      "folderId": {
        +        "description": "The folder ID this project belongs to (workspace projects only).",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The project ID.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "The project name.",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "description": "The parent project ID (for sub-projects, personal projects only).",
        +        "type": "string"
        +      },
        +      "sections": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "childOrder",
        +      "sections",
        +      "children"
        +    ],
        +    "type": "object"
        +  }
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / definitions
        Removed value: -{
        -  "__schema0": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "The ordering index among siblings.",
        -        "type": "number"
        -      },
        -      "children": {
        -        "description": "Nested child projects.",
        -        "items": {
        -          "$ref": "#/definitions/__schema0"
        -        },
        -        "type": "array"
        -      },
        -      "folderId": {
        -        "description": "The folder ID this project belongs to (workspace projects only).",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "The project ID.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The project name.",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "description": "The parent project ID (for sub-projects, personal projects only).",
        -        "type": "string"
        -      },
        -      "sections": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "id": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "name"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "childOrder",
        -      "sections",
        -      "children"
        -    ],
        -    "type": "object"
        -  }
        -}
      • addedOutput schema / properties / projects / items / $ref
        Added value: +"#/$defs/__schema0"
      • removedOutput schema / properties / projects / items / allOf
        Removed value: -[
        -  {
        -    "$ref": "#/definitions/__schema0"
        -  }
        -]
    • Changedget-productivity-stats2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-project-activity-stats2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-project-health2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-workspace-insights2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedimport-project-template2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist-workspaces2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmanage-assignments2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedproject-management2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedproject-move2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreorder-objects2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreschedule-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeduncomplete-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-comments2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-filters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-labels2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-projects2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-reminders2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-sections2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-tasks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeduser-info2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedview-attachment1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  12. 6 tool updatesv12.6.0
    • Changedadd-comments2 fields changed
      • addedInput schema / properties / comments / items / properties / notifyUsers
        Added value: +{
        +  "description": "Who to notify about this comment — a user ID, email, full name, or \"me\" for each person. Set this whenever the comment mentions someone; the text of an @mention notifies nobody on its own. Omit to notify whoever the Todoist apps would (the task's assignee, assigner and creator on a first comment, or the previous comment's participants on a reply). Pass [\"none\"] to notify nobody.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 25,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedOutput schema / properties / comments / items / properties / notifiedUserIds
        Added value: +{
        +  "description": "Users notified about this comment. Absent when nobody was notified.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedfetch-object1 field changed
      • changedOutput schema / properties / object / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "addedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "assignedByUid": {
        -        "type": "string"
        -      },
        -      "checked": {
        -        "description": "Whether the task is completed.",
        -        "type": "boolean"
        -      },
        -      "completedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "content": {
        -        "description": "Task title.",
        -        "type": "string"
        -      },
        -      "deadlineDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "duration": {
        -        "description": "e.g. \"2h30m\".",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "isUncompletable": {
        -        "description": "An organizational header, not a real task.",
        -        "type": "boolean"
        -      },
        -      "labels": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "priority": {
        -        "description": "p1 is highest, p4 lowest.",
        -        "enum": [
        -          "p1",
        -          "p2",
        -          "p3",
        -          "p4"
        -        ],
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "recurring": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "string"
        -          }
        -        ],
        -        "description": "False when not recurring, otherwise the recurrence string."
        -      },
        -      "responsibleUid": {
        -        "type": "string"
        -      },
        -      "sectionId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "description",
        -      "recurring",
        -      "priority",
        -      "projectId",
        -      "checked"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "Ordering index among siblings.",
        -        "type": "number"
        -      },
        -      "color": {
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "Empty string when none.",
        -        "type": "string"
        -      },
        -      "folderId": {
        -        "description": "Workspace projects only.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "inboxProject": {
        -        "type": "boolean"
        -      },
        -      "isArchived": {
        -        "type": "boolean"
        -      },
        -      "isFavorite": {
        -        "type": "boolean"
        -      },
        -      "isShared": {
        -        "type": "boolean"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "type": "string"
        -      },
        -      "viewStyle": {
        -        "description": "list, board or calendar.",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "description": "Undefined for personal projects.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "description",
        -      "isFavorite",
        -      "isShared",
        -      "inboxProject",
        -      "viewStyle",
        -      "childOrder",
        -      "isArchived"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "type": "string"
        -      },
        -      "fileAttachment": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "fileDuration": {
        -            "description": "Milliseconds, for audio/video.",
        -            "type": "number"
        -          },
        -          "fileName": {
        -            "type": "string"
        -          },
        -          "fileSize": {
        -            "description": "Bytes.",
        -            "type": "number"
        -          },
        -          "fileType": {
        -            "description": "MIME type.",
        -            "type": "string"
        -          },
        -          "fileUrl": {
        -            "type": "string"
        -          },
        -          "image": {
        -            "description": "For image resource types.",
        -            "type": "string"
        -          },
        -          "imageHeight": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "imageWidth": {
        -            "description": "Pixels.",
        -            "type": "number"
        -          },
        -          "resourceType": {
        -            "description": "file, url, image, etc.",
        -            "type": "string"
        -          },
        -          "title": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          },
        -          "uploadState": {
        -            "enum": [
        -              "pending",
        -              "completed"
        -            ],
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "For link/url resource types.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "resourceType"
        -        ],
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "postedAt": {
        -        "description": "ISO 8601.",
        -        "type": "string"
        -      },
        -      "postedUid": {
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "postedAt"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Supports Markdown.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "sectionOrder": {
        -        "description": "Ordering index within the project.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sectionOrder"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "addedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "assignedByUid": {
        +        "type": "string"
        +      },
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "completedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "deadlineDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "duration": {
        +        "description": "e.g. \"2h30m\".",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "isUncompletable": {
        +        "description": "An organizational header, not a real task.",
        +        "type": "boolean"
        +      },
        +      "labels": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "p1 is highest, p4 lowest.",
        +        "enum": [
        +          "p1",
        +          "p2",
        +          "p3",
        +          "p4"
        +        ],
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "recurring": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "string"
        +          }
        +        ],
        +        "description": "False when not recurring, otherwise the recurrence string."
        +      },
        +      "responsibleUid": {
        +        "type": "string"
        +      },
        +      "sectionId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "description",
        +      "recurring",
        +      "priority",
        +      "projectId",
        +      "checked"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "Ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "color": {
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "description": "Empty string when none.",
        +        "type": "string"
        +      },
        +      "folderId": {
        +        "description": "Workspace projects only.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "inboxProject": {
        +        "type": "boolean"
        +      },
        +      "isArchived": {
        +        "type": "boolean"
        +      },
        +      "isFavorite": {
        +        "type": "boolean"
        +      },
        +      "isShared": {
        +        "type": "boolean"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "viewStyle": {
        +        "description": "list, board or calendar.",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "description": "Undefined for personal projects.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "description",
        +      "isFavorite",
        +      "isShared",
        +      "inboxProject",
        +      "viewStyle",
        +      "childOrder",
        +      "isArchived"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "fileAttachment": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "fileDuration": {
        +            "description": "Milliseconds, for audio/video.",
        +            "type": "number"
        +          },
        +          "fileName": {
        +            "type": "string"
        +          },
        +          "fileSize": {
        +            "description": "Bytes.",
        +            "type": "number"
        +          },
        +          "fileType": {
        +            "description": "MIME type.",
        +            "type": "string"
        +          },
        +          "fileUrl": {
        +            "type": "string"
        +          },
        +          "image": {
        +            "description": "For image resource types.",
        +            "type": "string"
        +          },
        +          "imageHeight": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "imageWidth": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "resourceType": {
        +            "description": "file, url, image, etc.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          },
        +          "uploadState": {
        +            "enum": [
        +              "pending",
        +              "completed"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "resourceType"
        +        ],
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "notifiedUserIds": {
        +        "description": "Users notified about this comment. Absent when nobody was notified.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "postedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "postedUid": {
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "postedAt"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Supports Markdown.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "sectionOrder": {
        +        "description": "Ordering index within the project.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sectionOrder"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfind-comments1 field changed
      • addedOutput schema / properties / comments / items / properties / notifiedUserIds
        Added value: +{
        +  "description": "Users notified about this comment. Absent when nobody was notified.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedget-project-health1 field changed
      • removedOutput schema / properties / health / properties / taskRecommendations
        Removed value: -{
        -  "description": "Specific recommendations for individual tasks.",
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "recommendation": {
        -        "description": "The recommendation for this task.",
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "description": "The ID of the task this recommendation is for.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "taskId",
        -      "recommendation"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
    • Changedimport-project-template1 field changed
      • addedOutput schema / properties / comments / items / properties / notifiedUserIds
        Added value: +{
        +  "description": "Users notified about this comment. Absent when nobody was notified.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedupdate-comments1 field changed
      • addedOutput schema / properties / comments / items / properties / notifiedUserIds
        Added value: +{
        +  "description": "Users notified about this comment. Absent when nobody was notified.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  13. 5 tool updatesv12.5.6
    • Changedfind-activity1 field changed
      • changedInput schema / properties / initiatorId / description
        Previous value: -"Filter by the user ID who initiated the event."New value: +"Filter by the user ID who initiated the event. A first-person question (\"what did I complete\") needs this: without it the results cover every collaborator. Get the ID from user-info when you do not already have it."
    • Changedget-overview5 fields changed
      • addedOutput schema / properties / inbox / additionalProperties
        Added value: +false
      • removedOutput schema / properties / inbox / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "id": {
        -        "description": "The inbox project ID.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The inbox project name.",
        -        "type": "string"
        -      },
        -      "sections": {
        -        "description": "Sections in the inbox project.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "description": {
        -              "description": "Supports Markdown.",
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "sectionOrder": {
        -              "description": "Ordering index within the project.",
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "name",
        -            "sectionOrder"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sections"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / inbox / properties
        Added value: +{
        +  "id": {
        +    "description": "The inbox project ID.",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "The inbox project name.",
        +    "type": "string"
        +  },
        +  "sections": {
        +    "description": "Sections in the inbox project.",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "description": {
        +          "description": "Supports Markdown.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "sectionOrder": {
        +          "description": "Ordering index within the project.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "sectionOrder"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / inbox / required
        Added value: +[
        +  "id",
        +  "name",
        +  "sections"
        +]
      • addedOutput schema / properties / inbox / type
        Added value: +"object"
    • Changedget-project-activity-stats4 fields changed
      • removedOutput schema / properties / weekItems / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "fromDate": {
        -          "description": "Start date of the week.",
        -          "type": "string"
        -        },
        -        "toDate": {
        -          "description": "End date of the week.",
        -          "type": "string"
        -        },
        -        "totalCount": {
        -          "description": "Number of tasks completed in this week.",
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "fromDate",
        -        "toDate",
        -        "totalCount"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / weekItems / items
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "fromDate": {
        +      "description": "Start date of the week.",
        +      "type": "string"
        +    },
        +    "toDate": {
        +      "description": "End date of the week.",
        +      "type": "string"
        +    },
        +    "totalCount": {
        +      "description": "Number of tasks completed in this week.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "fromDate",
        +    "toDate",
        +    "totalCount"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / weekItems / type
        Added value: +"array"
      • changedOutput schema / required
        Previous value: -[
        -  "projectId",
        -  "dayItems",
        -  "weekItems"
        -]New value: +[
        +  "projectId",
        +  "dayItems"
        +]
    • Changedget-project-health19 fields changed
      • removedOutput schema / properties / context / properties / projectDescription / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / context / properties / projectDescription / type
        Added value: +"string"
      • removedOutput schema / properties / context / properties / projectMetrics / properties / averageCompletionTime / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / context / properties / projectMetrics / properties / averageCompletionTime / type
        Added value: +"number"
      • changedOutput schema / properties / context / properties / projectMetrics / required
        Previous value: -[
        -  "totalTasks",
        -  "completedTasks",
        -  "overdueTasks",
        -  "tasksCreatedThisWeek",
        -  "tasksCompletedThisWeek",
        -  "averageCompletionTime"
        -]New value: +[
        +  "totalTasks",
        +  "completedTasks",
        +  "overdueTasks",
        +  "tasksCreatedThisWeek",
        +  "tasksCompletedThisWeek"
        +]
      • removedOutput schema / properties / context / properties / tasks / items / properties / deadline / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / context / properties / tasks / items / properties / deadline / type
        Added value: +"string"
      • removedOutput schema / properties / context / properties / tasks / items / properties / due / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / context / properties / tasks / items / properties / due / type
        Added value: +"string"
      • changedOutput schema / properties / context / required
        Previous value: -[
        -  "projectDescription",
        -  "projectMetrics",
        -  "tasks"
        -]New value: +[
        +  "projectMetrics",
        +  "tasks"
        +]
      • removedOutput schema / properties / health / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / health / properties / description / type
        Added value: +"string"
      • removedOutput schema / properties / health / properties / descriptionSummary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / health / properties / descriptionSummary / type
        Added value: +"string"
      • removedOutput schema / properties / health / properties / taskRecommendations / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "recommendation": {
        -          "description": "The recommendation for this task.",
        -          "type": "string"
        -        },
        -        "taskId": {
        -          "description": "The ID of the task this recommendation is for.",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "taskId",
        -        "recommendation"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / health / properties / taskRecommendations / items
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "recommendation": {
        +      "description": "The recommendation for this task.",
        +      "type": "string"
        +    },
        +    "taskId": {
        +      "description": "The ID of the task this recommendation is for.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "taskId",
        +    "recommendation"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / health / properties / taskRecommendations / type
        Added value: +"array"
      • removedOutput schema / properties / health / properties / updatedAt / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / health / properties / updatedAt / type
        Added value: +"string"
    • Changedget-workspace-insights15 fields changed
      • removedOutput schema / properties / folderId
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "The folder ID, if applicable."
        -}
      • addedOutput schema / properties / projectInsights / items / properties / health / additionalProperties
        Added value: +false
      • removedOutput schema / properties / projectInsights / items / properties / health / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "isStale": {
        -        "description": "Whether the health data is stale.",
        -        "type": "boolean"
        -      },
        -      "status": {
        -        "description": "The health status of the project.",
        -        "enum": [
        -          "UNKNOWN",
        -          "ON_TRACK",
        -          "AT_RISK",
        -          "CRITICAL",
        -          "EXCELLENT",
        -          "ERROR"
        -        ],
        -        "type": "string"
        -      },
        -      "updateInProgress": {
        -        "description": "Whether a health analysis update is in progress.",
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "status",
        -      "isStale",
        -      "updateInProgress"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedOutput schema / properties / projectInsights / items / properties / health / description
        Previous value: -"Health data for this project, if available."New value: +"Health data for this project. Omitted when the project has none."
      • addedOutput schema / properties / projectInsights / items / properties / health / properties
        Added value: +{
        +  "isStale": {
        +    "description": "Whether the health data is stale.",
        +    "type": "boolean"
        +  },
        +  "status": {
        +    "description": "The health status of the project.",
        +    "enum": [
        +      "UNKNOWN",
        +      "ON_TRACK",
        +      "AT_RISK",
        +      "CRITICAL",
        +      "EXCELLENT",
        +      "ERROR"
        +    ],
        +    "type": "string"
        +  },
        +  "updateInProgress": {
        +    "description": "Whether a health analysis update is in progress.",
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / properties / projectInsights / items / properties / health / required
        Added value: +[
        +  "status",
        +  "isStale",
        +  "updateInProgress"
        +]
      • addedOutput schema / properties / projectInsights / items / properties / health / type
        Added value: +"object"
      • addedOutput schema / properties / projectInsights / items / properties / progress / additionalProperties
        Added value: +false
      • removedOutput schema / properties / projectInsights / items / properties / progress / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "activeCount": {
        -        "description": "Number of active tasks.",
        -        "type": "number"
        -      },
        -      "completedCount": {
        -        "description": "Number of completed tasks.",
        -        "type": "number"
        -      },
        -      "progressPercent": {
        -        "description": "Completion percentage (0-100).",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "completedCount",
        -      "activeCount",
        -      "progressPercent"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedOutput schema / properties / projectInsights / items / properties / progress / description
        Previous value: -"Progress data for this project, if available."New value: +"Progress data for this project. Omitted when the project has none."
      • addedOutput schema / properties / projectInsights / items / properties / progress / properties
        Added value: +{
        +  "activeCount": {
        +    "description": "Number of active tasks.",
        +    "type": "number"
        +  },
        +  "completedCount": {
        +    "description": "Number of completed tasks.",
        +    "type": "number"
        +  },
        +  "progressPercent": {
        +    "description": "Completion percentage (0-100).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / projectInsights / items / properties / progress / required
        Added value: +[
        +  "completedCount",
        +  "activeCount",
        +  "progressPercent"
        +]
      • addedOutput schema / properties / projectInsights / items / properties / progress / type
        Added value: +"object"
      • changedOutput schema / properties / projectInsights / items / required
        Previous value: -[
        -  "projectId",
        -  "health",
        -  "progress"
        -]New value: +[
        +  "projectId"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "workspaceId",
        -  "workspaceName",
        -  "folderId",
        -  "projectInsights"
        -]New value: +[
        +  "workspaceId",
        +  "workspaceName",
        +  "projectInsights"
        +]
  14. 33 tool updatesv12.5.3
    • Changedadd-comments19 fields changed
      • removedOutput schema / properties / comments / items / properties / content / description
        Removed value: -"The content of the comment."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / description
        Removed value: -"File attachment information, if any."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileDuration / description
        Previous value: -"The duration in milliseconds (for audio/video files)."New value: +"Milliseconds, for audio/video."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileName / description
        Removed value: -"The name of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileSize / description
        Previous value: -"The size of the file in bytes."New value: +"Bytes."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileType / description
        Previous value: -"The MIME type of the file."New value: +"MIME type."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileUrl / description
        Removed value: -"The URL to access the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / image / description
        Previous value: -"The image URL for image resource types."New value: +"For image resource types."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageHeight / description
        Previous value: -"The height of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageWidth / description
        Previous value: -"The width of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / resourceType / description
        Previous value: -"The type of resource (file, url, image, etc)."New value: +"file, url, image, etc."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / title / description
        Previous value: -"The title for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / uploadState / description
        Removed value: -"The upload state of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / url / description
        Previous value: -"The URL for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / id / description
        Removed value: -"The unique ID of the comment."
      • changedOutput schema / properties / comments / items / properties / postedAt / description
        Previous value: -"When the comment was posted (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / comments / items / properties / postedUid / description
        Removed value: -"The UID of the user who posted this comment."
      • removedOutput schema / properties / comments / items / properties / projectId / description
        Removed value: -"The ID of the project this comment belongs to."
      • removedOutput schema / properties / comments / items / properties / taskId / description
        Removed value: -"The ID of the task this comment belongs to."
    • Changedadd-filters1 field changed
      • removedOutput schema / properties / filters / items / properties / color / description
        Removed value: -"The color key of the entity."
    • Changedadd-labels5 fields changed
      • removedOutput schema / properties / labels / items / properties / color / description
        Removed value: -"The color key of the entity."
      • removedOutput schema / properties / labels / items / properties / id / description
        Removed value: -"The unique ID of the label."
      • removedOutput schema / properties / labels / items / properties / isFavorite / description
        Removed value: -"Whether the label is marked as favorite."
      • removedOutput schema / properties / labels / items / properties / name / description
        Removed value: -"The name of the label."
      • changedOutput schema / properties / labels / items / properties / order / description
        Previous value: -"The display order of the label."New value: +"Display order."
    • Changedadd-projects16 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
      • changedOutput schema / properties / projects / items / properties / childOrder / description
        Previous value: -"The ordering index of the project among its siblings."New value: +"Ordering index among siblings."
      • removedOutput schema / properties / projects / items / properties / color / description
        Removed value: -"The color key of the entity."
      • changedOutput schema / properties / projects / items / properties / description / description
        Previous value: -"The description of the project (empty string if none)."New value: +"Empty string when none."
      • changedOutput schema / properties / projects / items / properties / folderId / description
        Previous value: -"The ID of the folder this project belongs to (workspace projects only)."New value: +"Workspace projects only."
      • removedOutput schema / properties / projects / items / properties / id / description
        Removed value: -"The unique ID of the project."
      • removedOutput schema / properties / projects / items / properties / inboxProject / description
        Removed value: -"Whether this is the inbox project."
      • removedOutput schema / properties / projects / items / properties / isArchived / description
        Removed value: -"Whether the project is archived."
      • removedOutput schema / properties / projects / items / properties / isFavorite / description
        Removed value: -"Whether the project is marked as favorite."
      • removedOutput schema / properties / projects / items / properties / isShared / description
        Removed value: -"Whether the project is shared."
      • removedOutput schema / properties / projects / items / properties / name / description
        Removed value: -"The name of the project."
      • removedOutput schema / properties / projects / items / properties / parentId / description
        Removed value: -"The ID of the parent project (for sub-projects)."
      • changedOutput schema / properties / projects / items / properties / viewStyle / description
        Previous value: -"The view style of the project (list, board, calendar)."New value: +"list, board or calendar."
      • changedOutput schema / properties / projects / items / properties / workspaceId / description
        Previous value: -"The ID of the workspace this project belongs to (undefined for personal projects)."New value: +"Undefined for personal projects."
    • Changedadd-reminders15 fields changed
      • changedOutput schema / properties / reminders / items / properties / due / description
        Previous value: -"Due date info (absolute and sometimes relative reminders)."New value: +"Absolute, and sometimes relative, reminders."
      • changedOutput schema / properties / reminders / items / properties / due / properties / date / description
        Previous value: -"Due date in ISO format."New value: +"ISO 8601."
      • changedOutput schema / properties / reminders / items / properties / due / properties / datetime / description
        Previous value: -"Due datetime in ISO format."New value: +"ISO 8601."
      • removedOutput schema / properties / reminders / items / properties / due / properties / isRecurring / description
        Removed value: -"Whether this is a recurring reminder."
      • removedOutput schema / properties / reminders / items / properties / due / properties / timezone / description
        Removed value: -"Timezone of the reminder."
      • removedOutput schema / properties / reminders / items / properties / id / description
        Removed value: -"The unique ID of the reminder."
      • changedOutput schema / properties / reminders / items / properties / isUrgent / description
        Previous value: -"Whether this is an urgent reminder (relative and absolute reminders only)."New value: +"Relative and absolute reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLat / description
        Previous value: -"Latitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLong / description
        Previous value: -"Longitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locTrigger / description
        Previous value: -"Trigger type: on_enter or on_leave (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / minuteOffset / description
        Previous value: -"Minutes before due time to trigger (relative reminders only)."New value: +"Minutes before due. Relative reminders only."
      • changedOutput schema / properties / reminders / items / properties / name / description
        Previous value: -"Location name (location reminders only)."New value: +"Location name. Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / radius / description
        Previous value: -"Geofence radius in meters (location reminders only)."New value: +"Geofence radius in metres. Location reminders only."
      • removedOutput schema / properties / reminders / items / properties / taskId / description
        Removed value: -"The task ID this reminder belongs to."
      • removedOutput schema / properties / reminders / items / properties / type / description
        Removed value: -"The type of reminder: relative, absolute, or location."
    • Changedadd-sections7 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
      • changedOutput schema / properties / sections / items / properties / description / description
        Previous value: -"The description of the section. Supports Markdown."New value: +"Supports Markdown."
      • removedOutput schema / properties / sections / items / properties / id / description
        Removed value: -"The unique ID of the section."
      • removedOutput schema / properties / sections / items / properties / name / description
        Removed value: -"The name of the section."
      • changedOutput schema / properties / sections / items / properties / sectionOrder / description
        Previous value: -"The ordering index of the section within its project."New value: +"Ordering index within the project."
    • Changedadd-tasks21 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changedcomplete-tasks3 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
    • Changedfetch-object2 fields changed
      • changedOutput schema / properties / children / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "checked": {
        -        "description": "Whether the task is checked/completed.",
        -        "type": "boolean"
        -      },
        -      "content": {
        -        "description": "The task title/content.",
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "The due date of the task (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "hasChildren": {
        -        "description": "Whether this subtask has subtasks of its own. Fetch it with includeChildren to expand.",
        -        "type": "boolean"
        -      },
        -      "id": {
        -        "description": "The unique ID of the task.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "checked",
        -      "hasChildren"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "hasChildren": {
        -        "description": "Whether this sub-project has sub-projects of its own. Fetch it with includeChildren to expand.",
        -        "type": "boolean"
        -      },
        -      "id": {
        -        "description": "The unique ID of the project.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The name of the project.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "hasChildren"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "hasChildren": {
        +        "description": "Whether this subtask has subtasks of its own. Fetch it with includeChildren to expand.",
        +        "type": "boolean"
        +      },
        +      "id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "checked",
        +      "hasChildren"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "hasChildren": {
        +        "description": "Whether this sub-project has sub-projects of its own. Fetch it with includeChildren to expand.",
        +        "type": "boolean"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "hasChildren"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / properties / object / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "addedAt": {
        -        "description": "When the task was created (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "assignedByUid": {
        -        "description": "The UID of the user who assigned this task.",
        -        "type": "string"
        -      },
        -      "checked": {
        -        "description": "Whether the task is checked/completed.",
        -        "type": "boolean"
        -      },
        -      "completedAt": {
        -        "description": "When the task was completed (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "content": {
        -        "description": "The task title/content.",
        -        "type": "string"
        -      },
        -      "deadlineDate": {
        -        "description": "The deadline date of the task (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "The task description.",
        -        "type": "string"
        -      },
        -      "dueDate": {
        -        "description": "The due date of the task (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "duration": {
        -        "description": "The duration of the task (e.g., \"2h30m\").",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "The unique ID of the task.",
        -        "type": "string"
        -      },
        -      "isUncompletable": {
        -        "description": "Whether the task is uncompletable (organizational header).",
        -        "type": "boolean"
        -      },
        -      "labels": {
        -        "description": "The labels attached to this task.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "parentId": {
        -        "description": "The ID of the parent task (for subtasks).",
        -        "type": "string"
        -      },
        -      "priority": {
        -        "description": "The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest).",
        -        "enum": [
        -          "p1",
        -          "p2",
        -          "p3",
        -          "p4"
        -        ],
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "description": "The ID of the project this task belongs to.",
        -        "type": "string"
        -      },
        -      "recurring": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "string"
        -          }
        -        ],
        -        "description": "Whether the task is recurring, or the recurrence string."
        -      },
        -      "responsibleUid": {
        -        "description": "The UID of the user responsible for this task.",
        -        "type": "string"
        -      },
        -      "sectionId": {
        -        "description": "The ID of the section this task belongs to.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "description",
        -      "recurring",
        -      "priority",
        -      "projectId",
        -      "checked"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "childOrder": {
        -        "description": "The ordering index of the project among its siblings.",
        -        "type": "number"
        -      },
        -      "color": {
        -        "description": "The color key of the entity.",
        -        "enum": [
        -          "berry_red",
        -          "red",
        -          "orange",
        -          "yellow",
        -          "olive_green",
        -          "lime_green",
        -          "green",
        -          "mint_green",
        -          "teal",
        -          "sky_blue",
        -          "light_blue",
        -          "blue",
        -          "grape",
        -          "violet",
        -          "lavender",
        -          "magenta",
        -          "salmon",
        -          "charcoal",
        -          "grey",
        -          "taupe"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "description": "The description of the project (empty string if none).",
        -        "type": "string"
        -      },
        -      "folderId": {
        -        "description": "The ID of the folder this project belongs to (workspace projects only).",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "The unique ID of the project.",
        -        "type": "string"
        -      },
        -      "inboxProject": {
        -        "description": "Whether this is the inbox project.",
        -        "type": "boolean"
        -      },
        -      "isArchived": {
        -        "description": "Whether the project is archived.",
        -        "type": "boolean"
        -      },
        -      "isFavorite": {
        -        "description": "Whether the project is marked as favorite.",
        -        "type": "boolean"
        -      },
        -      "isShared": {
        -        "description": "Whether the project is shared.",
        -        "type": "boolean"
        -      },
        -      "name": {
        -        "description": "The name of the project.",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "description": "The ID of the parent project (for sub-projects).",
        -        "type": "string"
        -      },
        -      "viewStyle": {
        -        "description": "The view style of the project (list, board, calendar).",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "description": "The ID of the workspace this project belongs to (undefined for personal projects).",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "description",
        -      "isFavorite",
        -      "isShared",
        -      "inboxProject",
        -      "viewStyle",
        -      "childOrder",
        -      "isArchived"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "description": "The content of the comment.",
        -        "type": "string"
        -      },
        -      "fileAttachment": {
        -        "additionalProperties": false,
        -        "description": "File attachment information, if any.",
        -        "properties": {
        -          "fileDuration": {
        -            "description": "The duration in milliseconds (for audio/video files).",
        -            "type": "number"
        -          },
        -          "fileName": {
        -            "description": "The name of the file.",
        -            "type": "string"
        -          },
        -          "fileSize": {
        -            "description": "The size of the file in bytes.",
        -            "type": "number"
        -          },
        -          "fileType": {
        -            "description": "The MIME type of the file.",
        -            "type": "string"
        -          },
        -          "fileUrl": {
        -            "description": "The URL to access the file.",
        -            "type": "string"
        -          },
        -          "image": {
        -            "description": "The image URL for image resource types.",
        -            "type": "string"
        -          },
        -          "imageHeight": {
        -            "description": "The height of the image in pixels.",
        -            "type": "number"
        -          },
        -          "imageWidth": {
        -            "description": "The width of the image in pixels.",
        -            "type": "number"
        -          },
        -          "resourceType": {
        -            "description": "The type of resource (file, url, image, etc).",
        -            "type": "string"
        -          },
        -          "title": {
        -            "description": "The title for link/url resource types.",
        -            "type": "string"
        -          },
        -          "uploadState": {
        -            "description": "The upload state of the file.",
        -            "enum": [
        -              "pending",
        -              "completed"
        -            ],
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The URL for link/url resource types.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "resourceType"
        -        ],
        -        "type": "object"
        -      },
        -      "id": {
        -        "description": "The unique ID of the comment.",
        -        "type": "string"
        -      },
        -      "postedAt": {
        -        "description": "When the comment was posted (ISO 8601 format).",
        -        "type": "string"
        -      },
        -      "postedUid": {
        -        "description": "The UID of the user who posted this comment.",
        -        "type": "string"
        -      },
        -      "projectId": {
        -        "description": "The ID of the project this comment belongs to.",
        -        "type": "string"
        -      },
        -      "taskId": {
        -        "description": "The ID of the task this comment belongs to.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "content",
        -      "postedAt"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "The description of the section. Supports Markdown.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "The unique ID of the section.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The name of the section.",
        -        "type": "string"
        -      },
        -      "sectionOrder": {
        -        "description": "The ordering index of the section within its project.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sectionOrder"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "addedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "assignedByUid": {
        +        "type": "string"
        +      },
        +      "checked": {
        +        "description": "Whether the task is completed.",
        +        "type": "boolean"
        +      },
        +      "completedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "content": {
        +        "description": "Task title.",
        +        "type": "string"
        +      },
        +      "deadlineDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "duration": {
        +        "description": "e.g. \"2h30m\".",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "isUncompletable": {
        +        "description": "An organizational header, not a real task.",
        +        "type": "boolean"
        +      },
        +      "labels": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "priority": {
        +        "description": "p1 is highest, p4 lowest.",
        +        "enum": [
        +          "p1",
        +          "p2",
        +          "p3",
        +          "p4"
        +        ],
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "recurring": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "string"
        +          }
        +        ],
        +        "description": "False when not recurring, otherwise the recurrence string."
        +      },
        +      "responsibleUid": {
        +        "type": "string"
        +      },
        +      "sectionId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "description",
        +      "recurring",
        +      "priority",
        +      "projectId",
        +      "checked"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "childOrder": {
        +        "description": "Ordering index among siblings.",
        +        "type": "number"
        +      },
        +      "color": {
        +        "enum": [
        +          "berry_red",
        +          "red",
        +          "orange",
        +          "yellow",
        +          "olive_green",
        +          "lime_green",
        +          "green",
        +          "mint_green",
        +          "teal",
        +          "sky_blue",
        +          "light_blue",
        +          "blue",
        +          "grape",
        +          "violet",
        +          "lavender",
        +          "magenta",
        +          "salmon",
        +          "charcoal",
        +          "grey",
        +          "taupe"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "description": "Empty string when none.",
        +        "type": "string"
        +      },
        +      "folderId": {
        +        "description": "Workspace projects only.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "inboxProject": {
        +        "type": "boolean"
        +      },
        +      "isArchived": {
        +        "type": "boolean"
        +      },
        +      "isFavorite": {
        +        "type": "boolean"
        +      },
        +      "isShared": {
        +        "type": "boolean"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "type": "string"
        +      },
        +      "viewStyle": {
        +        "description": "list, board or calendar.",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "description": "Undefined for personal projects.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "description",
        +      "isFavorite",
        +      "isShared",
        +      "inboxProject",
        +      "viewStyle",
        +      "childOrder",
        +      "isArchived"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "fileAttachment": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "fileDuration": {
        +            "description": "Milliseconds, for audio/video.",
        +            "type": "number"
        +          },
        +          "fileName": {
        +            "type": "string"
        +          },
        +          "fileSize": {
        +            "description": "Bytes.",
        +            "type": "number"
        +          },
        +          "fileType": {
        +            "description": "MIME type.",
        +            "type": "string"
        +          },
        +          "fileUrl": {
        +            "type": "string"
        +          },
        +          "image": {
        +            "description": "For image resource types.",
        +            "type": "string"
        +          },
        +          "imageHeight": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "imageWidth": {
        +            "description": "Pixels.",
        +            "type": "number"
        +          },
        +          "resourceType": {
        +            "description": "file, url, image, etc.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          },
        +          "uploadState": {
        +            "enum": [
        +              "pending",
        +              "completed"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "For link/url resource types.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "resourceType"
        +        ],
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "postedAt": {
        +        "description": "ISO 8601.",
        +        "type": "string"
        +      },
        +      "postedUid": {
        +        "type": "string"
        +      },
        +      "projectId": {
        +        "type": "string"
        +      },
        +      "taskId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "content",
        +      "postedAt"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Supports Markdown.",
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "sectionOrder": {
        +        "description": "Ordering index within the project.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sectionOrder"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfind-activity12 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • changedOutput schema / properties / events / items / properties / eventDate / description
        Previous value: -"When the event occurred (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / events / items / properties / eventType / description
        Previous value: -"The type of event (added, updated, deleted, completed, etc)."New value: +"added, updated, deleted, completed, etc."
      • removedOutput schema / properties / events / items / properties / extraData / description
        Removed value: -"Additional event data."
      • removedOutput schema / properties / events / items / properties / id / description
        Removed value: -"The unique ID of the activity event."
      • changedOutput schema / properties / events / items / properties / initiatorId / description
        Previous value: -"The ID of the user who initiated this event."New value: +"User who initiated the event."
      • removedOutput schema / properties / events / items / properties / objectId / description
        Removed value: -"The ID of the object this event relates to."
      • changedOutput schema / properties / events / items / properties / objectType / description
        Previous value: -"The type of object this event relates to (task, project, etc)."New value: +"task, project, etc."
      • removedOutput schema / properties / events / items / properties / parentItemId / description
        Removed value: -"The ID of the parent item."
      • removedOutput schema / properties / events / items / properties / parentProjectId / description
        Removed value: -"The ID of the parent project."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
    • Changedfind-comments21 fields changed
      • removedOutput schema / properties / comments / items / properties / content / description
        Removed value: -"The content of the comment."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / description
        Removed value: -"File attachment information, if any."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileDuration / description
        Previous value: -"The duration in milliseconds (for audio/video files)."New value: +"Milliseconds, for audio/video."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileName / description
        Removed value: -"The name of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileSize / description
        Previous value: -"The size of the file in bytes."New value: +"Bytes."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileType / description
        Previous value: -"The MIME type of the file."New value: +"MIME type."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileUrl / description
        Removed value: -"The URL to access the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / image / description
        Previous value: -"The image URL for image resource types."New value: +"For image resource types."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageHeight / description
        Previous value: -"The height of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageWidth / description
        Previous value: -"The width of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / resourceType / description
        Previous value: -"The type of resource (file, url, image, etc)."New value: +"file, url, image, etc."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / title / description
        Previous value: -"The title for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / uploadState / description
        Removed value: -"The upload state of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / url / description
        Previous value: -"The URL for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / id / description
        Removed value: -"The unique ID of the comment."
      • changedOutput schema / properties / comments / items / properties / postedAt / description
        Previous value: -"When the comment was posted (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / comments / items / properties / postedUid / description
        Removed value: -"The UID of the user who posted this comment."
      • removedOutput schema / properties / comments / items / properties / projectId / description
        Removed value: -"The ID of the project this comment belongs to."
      • removedOutput schema / properties / comments / items / properties / taskId / description
        Removed value: -"The ID of the task this comment belongs to."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
    • Changedfind-completed-tasks21 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changedfind-filters1 field changed
      • removedOutput schema / properties / filters / items / properties / color / description
        Removed value: -"The color key of the entity."
    • Changedfind-labels8 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / labels / items / properties / color / description
        Removed value: -"The color key of the entity."
      • removedOutput schema / properties / labels / items / properties / id / description
        Removed value: -"The unique ID of the label."
      • removedOutput schema / properties / labels / items / properties / isFavorite / description
        Removed value: -"Whether the label is marked as favorite."
      • removedOutput schema / properties / labels / items / properties / name / description
        Removed value: -"The name of the label."
      • changedOutput schema / properties / labels / items / properties / order / description
        Previous value: -"The display order of the label."New value: +"Display order."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
    • Changedfind-project-collaborators4 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / collaborators / items / properties / email / description
        Removed value: -"The email address of the user."
      • removedOutput schema / properties / collaborators / items / properties / id / description
        Removed value: -"The unique ID of the user."
      • removedOutput schema / properties / collaborators / items / properties / name / description
        Removed value: -"The full name of the user."
    • Changedfind-projects16 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
      • changedOutput schema / properties / projects / items / properties / childOrder / description
        Previous value: -"The ordering index of the project among its siblings."New value: +"Ordering index among siblings."
      • removedOutput schema / properties / projects / items / properties / color / description
        Removed value: -"The color key of the entity."
      • changedOutput schema / properties / projects / items / properties / description / description
        Previous value: -"The description of the project (empty string if none)."New value: +"Empty string when none."
      • changedOutput schema / properties / projects / items / properties / folderId / description
        Previous value: -"The ID of the folder this project belongs to (workspace projects only)."New value: +"Workspace projects only."
      • removedOutput schema / properties / projects / items / properties / id / description
        Removed value: -"The unique ID of the project."
      • removedOutput schema / properties / projects / items / properties / inboxProject / description
        Removed value: -"Whether this is the inbox project."
      • removedOutput schema / properties / projects / items / properties / isArchived / description
        Removed value: -"Whether the project is archived."
      • removedOutput schema / properties / projects / items / properties / isFavorite / description
        Removed value: -"Whether the project is marked as favorite."
      • removedOutput schema / properties / projects / items / properties / isShared / description
        Removed value: -"Whether the project is shared."
      • removedOutput schema / properties / projects / items / properties / name / description
        Removed value: -"The name of the project."
      • removedOutput schema / properties / projects / items / properties / parentId / description
        Removed value: -"The ID of the parent project (for sub-projects)."
      • changedOutput schema / properties / projects / items / properties / viewStyle / description
        Previous value: -"The view style of the project (list, board, calendar)."New value: +"list, board or calendar."
      • changedOutput schema / properties / projects / items / properties / workspaceId / description
        Previous value: -"The ID of the workspace this project belongs to (undefined for personal projects)."New value: +"Undefined for personal projects."
    • Changedfind-reminders15 fields changed
      • changedOutput schema / properties / reminders / items / properties / due / description
        Previous value: -"Due date info (absolute and sometimes relative reminders)."New value: +"Absolute, and sometimes relative, reminders."
      • changedOutput schema / properties / reminders / items / properties / due / properties / date / description
        Previous value: -"Due date in ISO format."New value: +"ISO 8601."
      • changedOutput schema / properties / reminders / items / properties / due / properties / datetime / description
        Previous value: -"Due datetime in ISO format."New value: +"ISO 8601."
      • removedOutput schema / properties / reminders / items / properties / due / properties / isRecurring / description
        Removed value: -"Whether this is a recurring reminder."
      • removedOutput schema / properties / reminders / items / properties / due / properties / timezone / description
        Removed value: -"Timezone of the reminder."
      • removedOutput schema / properties / reminders / items / properties / id / description
        Removed value: -"The unique ID of the reminder."
      • changedOutput schema / properties / reminders / items / properties / isUrgent / description
        Previous value: -"Whether this is an urgent reminder (relative and absolute reminders only)."New value: +"Relative and absolute reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLat / description
        Previous value: -"Latitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLong / description
        Previous value: -"Longitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locTrigger / description
        Previous value: -"Trigger type: on_enter or on_leave (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / minuteOffset / description
        Previous value: -"Minutes before due time to trigger (relative reminders only)."New value: +"Minutes before due. Relative reminders only."
      • changedOutput schema / properties / reminders / items / properties / name / description
        Previous value: -"Location name (location reminders only)."New value: +"Location name. Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / radius / description
        Previous value: -"Geofence radius in meters (location reminders only)."New value: +"Geofence radius in metres. Location reminders only."
      • removedOutput schema / properties / reminders / items / properties / taskId / description
        Removed value: -"The task ID this reminder belongs to."
      • removedOutput schema / properties / reminders / items / properties / type / description
        Removed value: -"The type of reminder: relative, absolute, or location."
    • Changedfind-sections5 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • changedOutput schema / properties / sections / items / properties / description / description
        Previous value: -"The description of the section. Supports Markdown."New value: +"Supports Markdown."
      • removedOutput schema / properties / sections / items / properties / id / description
        Removed value: -"The unique ID of the section."
      • removedOutput schema / properties / sections / items / properties / name / description
        Removed value: -"The name of the section."
      • changedOutput schema / properties / sections / items / properties / sectionOrder / description
        Previous value: -"The ordering index of the section within its project."New value: +"Ordering index within the project."
    • Changedfind-tasks21 fields changed
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changedfind-tasks-by-date22 fields changed
      • changedInput schema / properties / startDate / description
        Previous value: -"The start date to get the tasks for. Format: YYYY-MM-DD or 'today'."New value: +"The start date to get the tasks for. Format: YYYY-MM-DD, or 'today', which by default also includes overdue tasks."
      • removedOutput schema / properties / appliedFilters / description
        Removed value: -"The filters that were applied to the search."
      • removedOutput schema / properties / hasMore / description
        Removed value: -"Whether there are more results available."
      • removedOutput schema / properties / nextCursor / description
        Removed value: -"Cursor for the next page of results."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changedget-overview5 fields changed
      • changedOutput schema / properties / inbox / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "id": {
        -        "description": "The inbox project ID.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "The inbox project name.",
        -        "type": "string"
        -      },
        -      "sections": {
        -        "description": "Sections in the inbox project.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "description": {
        -              "description": "The description of the section. Supports Markdown.",
        -              "type": "string"
        -            },
        -            "id": {
        -              "description": "The unique ID of the section.",
        -              "type": "string"
        -            },
        -            "name": {
        -              "description": "The name of the section.",
        -              "type": "string"
        -            },
        -            "sectionOrder": {
        -              "description": "The ordering index of the section within its project.",
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "name",
        -            "sectionOrder"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "sections"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "description": "The inbox project ID.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "The inbox project name.",
        +        "type": "string"
        +      },
        +      "sections": {
        +        "description": "Sections in the inbox project.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "description": {
        +              "description": "Supports Markdown.",
        +              "type": "string"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "sectionOrder": {
        +              "description": "Ordering index within the project.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "sectionOrder"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sections"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / sections / items / properties / description / description
        Previous value: -"The description of the section. Supports Markdown."New value: +"Supports Markdown."
      • removedOutput schema / properties / sections / items / properties / id / description
        Removed value: -"The unique ID of the section."
      • removedOutput schema / properties / sections / items / properties / name / description
        Removed value: -"The name of the section."
      • changedOutput schema / properties / sections / items / properties / sectionOrder / description
        Previous value: -"The ordering index of the section within its project."New value: +"Ordering index within the project."
    • Changedimport-project-template41 fields changed
      • removedOutput schema / properties / comments / items / properties / content / description
        Removed value: -"The content of the comment."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / description
        Removed value: -"File attachment information, if any."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileDuration / description
        Previous value: -"The duration in milliseconds (for audio/video files)."New value: +"Milliseconds, for audio/video."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileName / description
        Removed value: -"The name of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileSize / description
        Previous value: -"The size of the file in bytes."New value: +"Bytes."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileType / description
        Previous value: -"The MIME type of the file."New value: +"MIME type."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileUrl / description
        Removed value: -"The URL to access the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / image / description
        Previous value: -"The image URL for image resource types."New value: +"For image resource types."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageHeight / description
        Previous value: -"The height of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageWidth / description
        Previous value: -"The width of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / resourceType / description
        Previous value: -"The type of resource (file, url, image, etc)."New value: +"file, url, image, etc."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / title / description
        Previous value: -"The title for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / uploadState / description
        Removed value: -"The upload state of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / url / description
        Previous value: -"The URL for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / id / description
        Removed value: -"The unique ID of the comment."
      • changedOutput schema / properties / comments / items / properties / postedAt / description
        Previous value: -"When the comment was posted (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / comments / items / properties / postedUid / description
        Removed value: -"The UID of the user who posted this comment."
      • removedOutput schema / properties / comments / items / properties / projectId / description
        Removed value: -"The ID of the project this comment belongs to."
      • removedOutput schema / properties / comments / items / properties / taskId / description
        Removed value: -"The ID of the task this comment belongs to."
      • changedOutput schema / properties / sections / items / properties / description / description
        Previous value: -"The description of the section. Supports Markdown."New value: +"Supports Markdown."
      • removedOutput schema / properties / sections / items / properties / id / description
        Removed value: -"The unique ID of the section."
      • removedOutput schema / properties / sections / items / properties / name / description
        Removed value: -"The name of the section."
      • changedOutput schema / properties / sections / items / properties / sectionOrder / description
        Previous value: -"The ordering index of the section within its project."New value: +"Ordering index within the project."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changedproject-management13 fields changed
      • changedOutput schema / properties / project / properties / childOrder / description
        Previous value: -"The ordering index of the project among its siblings."New value: +"Ordering index among siblings."
      • removedOutput schema / properties / project / properties / color / description
        Removed value: -"The color key of the entity."
      • changedOutput schema / properties / project / properties / description / description
        Previous value: -"The description of the project (empty string if none)."New value: +"Empty string when none."
      • changedOutput schema / properties / project / properties / folderId / description
        Previous value: -"The ID of the folder this project belongs to (workspace projects only)."New value: +"Workspace projects only."
      • removedOutput schema / properties / project / properties / id / description
        Removed value: -"The unique ID of the project."
      • removedOutput schema / properties / project / properties / inboxProject / description
        Removed value: -"Whether this is the inbox project."
      • removedOutput schema / properties / project / properties / isArchived / description
        Removed value: -"Whether the project is archived."
      • removedOutput schema / properties / project / properties / isFavorite / description
        Removed value: -"Whether the project is marked as favorite."
      • removedOutput schema / properties / project / properties / isShared / description
        Removed value: -"Whether the project is shared."
      • removedOutput schema / properties / project / properties / name / description
        Removed value: -"The name of the project."
      • removedOutput schema / properties / project / properties / parentId / description
        Removed value: -"The ID of the parent project (for sub-projects)."
      • changedOutput schema / properties / project / properties / viewStyle / description
        Previous value: -"The view style of the project (list, board, calendar)."New value: +"list, board or calendar."
      • changedOutput schema / properties / project / properties / workspaceId / description
        Previous value: -"The ID of the workspace this project belongs to (undefined for personal projects)."New value: +"Undefined for personal projects."
    • Changedproject-move13 fields changed
      • changedOutput schema / properties / project / properties / childOrder / description
        Previous value: -"The ordering index of the project among its siblings."New value: +"Ordering index among siblings."
      • removedOutput schema / properties / project / properties / color / description
        Removed value: -"The color key of the entity."
      • changedOutput schema / properties / project / properties / description / description
        Previous value: -"The description of the project (empty string if none)."New value: +"Empty string when none."
      • changedOutput schema / properties / project / properties / folderId / description
        Previous value: -"The ID of the folder this project belongs to (workspace projects only)."New value: +"Workspace projects only."
      • removedOutput schema / properties / project / properties / id / description
        Removed value: -"The unique ID of the project."
      • removedOutput schema / properties / project / properties / inboxProject / description
        Removed value: -"Whether this is the inbox project."
      • removedOutput schema / properties / project / properties / isArchived / description
        Removed value: -"Whether the project is archived."
      • removedOutput schema / properties / project / properties / isFavorite / description
        Removed value: -"Whether the project is marked as favorite."
      • removedOutput schema / properties / project / properties / isShared / description
        Removed value: -"Whether the project is shared."
      • removedOutput schema / properties / project / properties / name / description
        Removed value: -"The name of the project."
      • removedOutput schema / properties / project / properties / parentId / description
        Removed value: -"The ID of the parent project (for sub-projects)."
      • changedOutput schema / properties / project / properties / viewStyle / description
        Previous value: -"The view style of the project (list, board, calendar)."New value: +"list, board or calendar."
      • changedOutput schema / properties / project / properties / workspaceId / description
        Previous value: -"The ID of the workspace this project belongs to (undefined for personal projects)."New value: +"Undefined for personal projects."
    • Changedreschedule-tasks18 fields changed
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
    • Changeduncomplete-tasks3 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
    • Changedupdate-comments19 fields changed
      • removedOutput schema / properties / comments / items / properties / content / description
        Removed value: -"The content of the comment."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / description
        Removed value: -"File attachment information, if any."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileDuration / description
        Previous value: -"The duration in milliseconds (for audio/video files)."New value: +"Milliseconds, for audio/video."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileName / description
        Removed value: -"The name of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileSize / description
        Previous value: -"The size of the file in bytes."New value: +"Bytes."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileType / description
        Previous value: -"The MIME type of the file."New value: +"MIME type."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / fileUrl / description
        Removed value: -"The URL to access the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / image / description
        Previous value: -"The image URL for image resource types."New value: +"For image resource types."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageHeight / description
        Previous value: -"The height of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / imageWidth / description
        Previous value: -"The width of the image in pixels."New value: +"Pixels."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / resourceType / description
        Previous value: -"The type of resource (file, url, image, etc)."New value: +"file, url, image, etc."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / title / description
        Previous value: -"The title for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / fileAttachment / properties / uploadState / description
        Removed value: -"The upload state of the file."
      • changedOutput schema / properties / comments / items / properties / fileAttachment / properties / url / description
        Previous value: -"The URL for link/url resource types."New value: +"For link/url resource types."
      • removedOutput schema / properties / comments / items / properties / id / description
        Removed value: -"The unique ID of the comment."
      • changedOutput schema / properties / comments / items / properties / postedAt / description
        Previous value: -"When the comment was posted (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / comments / items / properties / postedUid / description
        Removed value: -"The UID of the user who posted this comment."
      • removedOutput schema / properties / comments / items / properties / projectId / description
        Removed value: -"The ID of the project this comment belongs to."
      • removedOutput schema / properties / comments / items / properties / taskId / description
        Removed value: -"The ID of the task this comment belongs to."
    • Changedupdate-filters1 field changed
      • removedOutput schema / properties / filters / items / properties / color / description
        Removed value: -"The color key of the entity."
    • Changedupdate-labels5 fields changed
      • removedOutput schema / properties / updatedLabels / items / properties / color / description
        Removed value: -"The color key of the entity."
      • removedOutput schema / properties / updatedLabels / items / properties / id / description
        Removed value: -"The unique ID of the label."
      • removedOutput schema / properties / updatedLabels / items / properties / isFavorite / description
        Removed value: -"Whether the label is marked as favorite."
      • removedOutput schema / properties / updatedLabels / items / properties / name / description
        Removed value: -"The name of the label."
      • changedOutput schema / properties / updatedLabels / items / properties / order / description
        Previous value: -"The display order of the label."New value: +"Display order."
    • Changedupdate-projects16 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
      • changedOutput schema / properties / projects / items / properties / childOrder / description
        Previous value: -"The ordering index of the project among its siblings."New value: +"Ordering index among siblings."
      • removedOutput schema / properties / projects / items / properties / color / description
        Removed value: -"The color key of the entity."
      • changedOutput schema / properties / projects / items / properties / description / description
        Previous value: -"The description of the project (empty string if none)."New value: +"Empty string when none."
      • changedOutput schema / properties / projects / items / properties / folderId / description
        Previous value: -"The ID of the folder this project belongs to (workspace projects only)."New value: +"Workspace projects only."
      • removedOutput schema / properties / projects / items / properties / id / description
        Removed value: -"The unique ID of the project."
      • removedOutput schema / properties / projects / items / properties / inboxProject / description
        Removed value: -"Whether this is the inbox project."
      • removedOutput schema / properties / projects / items / properties / isArchived / description
        Removed value: -"Whether the project is archived."
      • removedOutput schema / properties / projects / items / properties / isFavorite / description
        Removed value: -"Whether the project is marked as favorite."
      • removedOutput schema / properties / projects / items / properties / isShared / description
        Removed value: -"Whether the project is shared."
      • removedOutput schema / properties / projects / items / properties / name / description
        Removed value: -"The name of the project."
      • removedOutput schema / properties / projects / items / properties / parentId / description
        Removed value: -"The ID of the parent project (for sub-projects)."
      • changedOutput schema / properties / projects / items / properties / viewStyle / description
        Previous value: -"The view style of the project (list, board, calendar)."New value: +"list, board or calendar."
      • changedOutput schema / properties / projects / items / properties / workspaceId / description
        Previous value: -"The ID of the workspace this project belongs to (undefined for personal projects)."New value: +"Undefined for personal projects."
    • Changedupdate-reminders15 fields changed
      • changedOutput schema / properties / reminders / items / properties / due / description
        Previous value: -"Due date info (absolute and sometimes relative reminders)."New value: +"Absolute, and sometimes relative, reminders."
      • changedOutput schema / properties / reminders / items / properties / due / properties / date / description
        Previous value: -"Due date in ISO format."New value: +"ISO 8601."
      • changedOutput schema / properties / reminders / items / properties / due / properties / datetime / description
        Previous value: -"Due datetime in ISO format."New value: +"ISO 8601."
      • removedOutput schema / properties / reminders / items / properties / due / properties / isRecurring / description
        Removed value: -"Whether this is a recurring reminder."
      • removedOutput schema / properties / reminders / items / properties / due / properties / timezone / description
        Removed value: -"Timezone of the reminder."
      • removedOutput schema / properties / reminders / items / properties / id / description
        Removed value: -"The unique ID of the reminder."
      • changedOutput schema / properties / reminders / items / properties / isUrgent / description
        Previous value: -"Whether this is an urgent reminder (relative and absolute reminders only)."New value: +"Relative and absolute reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLat / description
        Previous value: -"Latitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locLong / description
        Previous value: -"Longitude (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / locTrigger / description
        Previous value: -"Trigger type: on_enter or on_leave (location reminders only)."New value: +"Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / minuteOffset / description
        Previous value: -"Minutes before due time to trigger (relative reminders only)."New value: +"Minutes before due. Relative reminders only."
      • changedOutput schema / properties / reminders / items / properties / name / description
        Previous value: -"Location name (location reminders only)."New value: +"Location name. Location reminders only."
      • changedOutput schema / properties / reminders / items / properties / radius / description
        Previous value: -"Geofence radius in meters (location reminders only)."New value: +"Geofence radius in metres. Location reminders only."
      • removedOutput schema / properties / reminders / items / properties / taskId / description
        Removed value: -"The task ID this reminder belongs to."
      • removedOutput schema / properties / reminders / items / properties / type / description
        Removed value: -"The type of reminder: relative, absolute, or location."
    • Changedupdate-sections4 fields changed
      • changedOutput schema / properties / sections / items / properties / description / description
        Previous value: -"The description of the section. Supports Markdown."New value: +"Supports Markdown."
      • removedOutput schema / properties / sections / items / properties / id / description
        Removed value: -"The unique ID of the section."
      • removedOutput schema / properties / sections / items / properties / name / description
        Removed value: -"The name of the section."
      • changedOutput schema / properties / sections / items / properties / sectionOrder / description
        Previous value: -"The ordering index of the section within its project."New value: +"Ordering index within the project."
    • Changedupdate-tasks21 fields changed
      • removedOutput schema / properties / failures / items / properties / code / description
        Removed value: -"The error code, if available."
      • removedOutput schema / properties / failures / items / properties / error / description
        Removed value: -"The error message."
      • changedOutput schema / properties / failures / items / properties / item / description
        Previous value: -"The item that failed (usually an ID or identifier)."New value: +"Usually the ID of the item that failed."
      • changedOutput schema / properties / tasks / items / properties / addedAt / description
        Previous value: -"When the task was created (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / assignedByUid / description
        Removed value: -"The UID of the user who assigned this task."
      • changedOutput schema / properties / tasks / items / properties / checked / description
        Previous value: -"Whether the task is checked/completed."New value: +"Whether the task is completed."
      • changedOutput schema / properties / tasks / items / properties / completedAt / description
        Previous value: -"When the task was completed (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / content / description
        Previous value: -"The task title/content."New value: +"Task title."
      • changedOutput schema / properties / tasks / items / properties / deadlineDate / description
        Previous value: -"The deadline date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • removedOutput schema / properties / tasks / items / properties / description / description
        Removed value: -"The task description."
      • changedOutput schema / properties / tasks / items / properties / dueDate / description
        Previous value: -"The due date of the task (ISO 8601 format)."New value: +"ISO 8601."
      • changedOutput schema / properties / tasks / items / properties / duration / description
        Previous value: -"The duration of the task (e.g., \"2h30m\")."New value: +"e.g. \"2h30m\"."
      • removedOutput schema / properties / tasks / items / properties / id / description
        Removed value: -"The unique ID of the task."
      • changedOutput schema / properties / tasks / items / properties / isUncompletable / description
        Previous value: -"Whether the task is uncompletable (organizational header)."New value: +"An organizational header, not a real task."
      • removedOutput schema / properties / tasks / items / properties / labels / description
        Removed value: -"The labels attached to this task."
      • removedOutput schema / properties / tasks / items / properties / parentId / description
        Removed value: -"The ID of the parent task (for subtasks)."
      • changedOutput schema / properties / tasks / items / properties / priority / description
        Previous value: -"The priority level: p1 (highest), p2 (high), p3 (medium), p4 (lowest)."New value: +"p1 is highest, p4 lowest."
      • removedOutput schema / properties / tasks / items / properties / projectId / description
        Removed value: -"The ID of the project this task belongs to."
      • changedOutput schema / properties / tasks / items / properties / recurring / description
        Previous value: -"Whether the task is recurring, or the recurrence string."New value: +"False when not recurring, otherwise the recurrence string."
      • removedOutput schema / properties / tasks / items / properties / responsibleUid / description
        Removed value: -"The UID of the user responsible for this task."
      • removedOutput schema / properties / tasks / items / properties / sectionId / description
        Removed value: -"The ID of the section this task belongs to."
  15. 3 tool updatesv12.5.0
    • Addedexport-project-template
    • Changedfind-tasks-by-date1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"The maximum number of tasks to return."New value: +"The maximum number of tasks to return. Default is 10."
    • Addedimport-project-template
  16. 2 tool updatesv12.4.0
    • Changedadd-tasks1 field changed
      • changedInput schema / properties / tasks / items / properties / dueString / description
        Previous value: -"The due date for the task, in natural language."New value: +"The due date for the task, in natural language. Also use natural language for recurrences; do not prefix it with \"recurring\"."
    • Changedfind-activity2 fields changed
      • addedInput schema / properties / dateFrom
        Added value: +{
        +  "description": "Inclusive start of the activity range, as an ISO 8601 date or date-time. For all events on one local calendar day, use that day's start, for example \"2026-08-02T00:00:00-04:00\". Natural-language dates such as \"tomorrow\" are not supported.",
        +  "type": "string"
        +}
      • addedInput schema / properties / dateTo
        Added value: +{
        +  "description": "Exclusive end of the activity range, as an ISO 8601 date or date-time. For all events on 2026-08-02, use \"2026-08-03T00:00:00-04:00\". Natural-language dates such as \"tomorrow\" are not supported.",
        +  "type": "string"
        +}
  17. 1 tool updatev12.3.1
    • Changedupdate-tasks5 fields changed
      • changedInput schema / properties / tasks / items / properties / parentId / description
        Previous value: -"The new parent task ID (for subtasks)."New value: +"Make the task a subtask of this task ID. Omit unless the parent should change."
      • changedInput schema / properties / tasks / items / properties / projectId / description
        Previous value: -"The new project ID for the task. Project ID should be an ID string, or the text \"inbox\", for inbox tasks."New value: +"Move the task to this project ID, or the text \"inbox\" for the inbox. Omit unless the project should change: moving a task to a project also lifts it out of its section and out from under its parent."
      • changedInput schema / properties / tasks / items / properties / sectionId / description
        Previous value: -"The new section ID for the task."New value: +"Move the task to this section ID. Omit unless the section should change: moving a task to a section also lifts it out from under its parent."
      • addedOutput schema / properties / appliedOperations / properties / redundantMovesSkipped
        Added value: +{
        +  "description": "Moves not performed because the task was already in the requested destination. A non-zero count means container fields were sent that did not need to be.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / appliedOperations / required
        Previous value: -[
        -  "updateCount",
        -  "skippedCount",
        -  "failureCount"
        -]New value: +[
        +  "updateCount",
        +  "skippedCount",
        +  "failureCount",
        +  "redundantMovesSkipped"
        +]

TDQS

B3.3/5.0

Scored across 47 tools

Disambiguation3/5

Most tools map to a clear entity+action, and descriptions carefully differentiate tricky pairs (reschedule-tasks vs update-tasks, find-completed-tasks vs find-activity, get-project-health vs analyze-project-health). However, there are real overlaps: fetch-object vs fetch both retrieve a task/project by ID, and find-tasks vs find-tasks-by-date vs search vs get-overview all surface tasks with only subtle distinctions an agent could easily misselect.

Naming Consistency3/5

The bulk follows a kebab-case verb-noun pattern (add-tasks, find-projects, update-comments), which is good, but several tools break it with noun-only or differently-verbed names: user-info, project-management, project-move, fetch, search, get-overview. Verb synonyms are also mixed (add/create, find/list/fetch/get), and singular/plural noun forms vary across otherwise parallel tools.

Tool Count2/5

47 tools is well above a comfortable set size, and several are mergeable (fetch/fetch-object, search/find-tasks, get-project-activity-stats inside get-project-health). The Todoist domain is genuinely broad (tasks, projects, sections, labels, filters, comments, reminders, workspaces, templates, analytics), which softens the blow, but the surface still feels bloated rather than tightly scoped.

Completeness4/5

Coverage is strong: create/read/update for tasks, projects, sections, labels, filters, comments, and reminders, plus completion, assignment, reordering, templates, activity, and analytics, with deletion centralized in delete-object. Minor gaps remain (no granular per-entity deletes, no comment search, attachment viewing without upload), but core workflows have no dead ends.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers