Skip to main content
Glama

Search tasks

search_tasks
Read-onlyIdempotent

Find tasks in Casefile using a query string or separate conditions; filter by project, status, assignee, priority, or text, combine with and/or, and page results.

Instructions

Searches tasks by a query language string, by separate conditions, or by both.

Conditions from both sources combine with and and give the same result as one string of the same meaning; no condition at all selects every task of the projects that are not archived. A task of an archived project is found only when the search names it with = or in: its project in project, the task itself in key, its parent in parent or a root of its subtree in under. Rows are ordered by sort, by key when it is left out. A long text is cut at the installation limit and marked by <field>_truncated and <field>_length; one task in full, with its case and links, is returned by get_task.

An unknown field, operator or value is refused with search_field_unknown, search_operator_not_supported or search_value_invalid, the allowed values listed in details.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keyNoTask keys: several named tasks in one call. An unknown key is refused with `search_value_invalid`, `reason: task_not_found`, rather than left out
sortNoSort order, most significant key first; a leading `-` sorts descending. Allowed: `key`, `last_entry_at`, `priority`, `updated_at`
textNoSubstring of the title or description, case-insensitive
limitNoPage size. Without a value, the installation's default page size
queryNoQuery language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values. Without an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`. Fields: `assignee`, `blocked`, `decision`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `open_warnings`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`, `under`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`. Examples: - `project: TRK and status: open and blocked: false` - `status: in open, in_progress` - `priority: >= high and text: ~ login` - `assignee: empty() or open_questions: > 0` A string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it
underNoRoot task keys: all their descendants at any depth, without the roots. `parent` is the direct children only. An unknown key is refused
cursorNo`next_cursor` of the previous page; without it, the first page
fieldsNoFields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `open_warnings`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`
parentNoParent task keys: their **direct** children, one level down. `empty()` matches tasks without a parent, the top level of a project. An unknown key is refused rather than read as «no children»
statusNoTask statuses
blockedNoWhether the task has `blocked_by` on a task that is neither `done` nor `cancelled`
projectNoProject keys
assigneeNoAssignee names, exact match; `empty()` matches tasks without an assignee. A name covers every session signed with it: no value selects the tasks of one session
decisionNoProject decisions `PROJECT#N`: the tasks whose `decisions` field names one of them, in any status, also after the decision is superseded. `empty()` matches tasks that name no decision. An address that is not a `decision` entry of a project's case is refused rather than read as «no tasks»
priorityNoPriorities
open_remarksNoExact number of unresolved remarks; ranges go in `query`
open_warningsNo1 for tasks with an open `warning`, 0 for the rest
open_questionsNoExact number of unanswered questions; ranges go in `query`
remarks_in_workNoNumber of remarks resolved as `accepted` whose continuation task is not closed yet
open_blocking_questionsNoExact number of unanswered `blocking` questions; `0` means none blocks

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.10.1
    • addedInput schema / properties / decision
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Project decisions `PROJECT#N`: the tasks whose `decisions` field names one of them, in any status, also after the decision is superseded. `empty()` matches tasks that name no decision. An address that is not a `decision` entry of a project's case is refused rather than read as «no tasks»",
      +  "examples": [
      +    [
      +      "TRK#15"
      +    ]
      +  ],
      +  "title": "Decision"
      +}
    • changedInput schema / properties / fields / description
      Previous value: -"Fields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`"New value: +"Fields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `open_warnings`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`"
    • addedInput schema / properties / open_warnings
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "1 for tasks with an open `warning`, 0 for the rest",
      +  "title": "Open Warnings"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Query language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values.\n\nWithout an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`.\n\nFields: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`.\n\nExamples:\n- `project: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ login`\n- `assignee: empty() or open_questions: > 0`\n\nA string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it"New value: +"Query language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values.\n\nWithout an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`.\n\nFields: `assignee`, `blocked`, `decision`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `open_warnings`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`, `under`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`.\n\nExamples:\n- `project: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ login`\n- `assignee: empty() or open_questions: > 0`\n\nA string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it"
    • changedInput schema / properties / status / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "description": "Task status",
      -      "enum": [
      -        "backlog",
      -        "open",
      -        "in_progress",
      -        "waiting",
      -        "done",
      -        "cancelled"
      -      ],
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "description": "Task status",
      +      "enum": [
      +        "backlog",
      +        "open",
      +        "in_progress",
      +        "done",
      +        "cancelled"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / under
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Root task keys: all their descendants at any depth, without the roots. `parent` is the direct children only. An unknown key is refused",
      +  "examples": [
      +    [
      +      "TRK-7"
      +    ]
      +  ],
      +  "title": "Under"
      +}
    • addedOutput schema / $defs / FeaturesView / properties / open_warnings
      Added value: +{
      +  "title": "Open Warnings",
      +  "type": "integer"
      +}
    • changedOutput schema / $defs / FeaturesView / required
      Previous value: -[
      -  "blocked",
      -  "open_questions",
      -  "open_blocking_questions",
      -  "open_remarks",
      -  "last_summary_at",
      -  "last_entry_at"
      -]New value: +[
      +  "blocked",
      +  "open_questions",
      +  "open_blocking_questions",
      +  "open_remarks",
      +  "open_warnings",
      +  "last_summary_at",
      +  "last_entry_at"
      +]
    • changedOutput schema / $defs / FoundTaskView / properties / status / anyOf
      Previous value: -[
      -  {
      -    "description": "Task status",
      -    "enum": [
      -      "backlog",
      -      "open",
      -      "in_progress",
      -      "waiting",
      -      "done",
      -      "cancelled"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Task status",
      +    "enum": [
      +      "backlog",
      +      "open",
      +      "in_progress",
      +      "done",
      +      "cancelled"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed49 schema fields changedv0.5.2
    • removedInput schema / $defs
      Removed value: -{
      -  "TaskPriority": {
      -    "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
      -    "enum": [
      -      "low",
      -      "normal",
      -      "high",
      -      "critical"
      -    ],
      -    "title": "TaskPriority",
      -    "type": "string"
      -  },
      -  "TaskStatus": {
      -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
      -    "enum": [
      -      "backlog",
      -      "open",
      -      "in_progress",
      -      "waiting",
      -      "done",
      -      "cancelled"
      -    ],
      -    "title": "TaskStatus",
      -    "type": "string"
      -  }
      -}
    • changedInput schema / properties / assignee / description
      Previous value: -"Исполнители, точным совпадением; `empty()` находит задачи без исполнителя"New value: +"Assignee names, exact match; `empty()` matches tasks without an assignee. A name covers every session signed with it: no value selects the tasks of one session"
    • removedInput schema / properties / assignee / examples
      Removed value: -[
      -  [
      -    "release_bot"
      -  ]
      -]
    • changedInput schema / properties / blocked / description
      Previous value: -"Есть ли у задачи `blocked_by` на задачу не в `done` и не в `cancelled`. Вход в `in_progress` при `true` отклоняется"New value: +"Whether the task has `blocked_by` on a task that is neither `done` nor `cancelled`"
    • changedInput schema / properties / cursor / description
      Previous value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page"
    • changedInput schema / properties / fields / default
      Previous value: -[
      -  "key",
      -  "title",
      -  "status",
      -  "assignee",
      -  "priority",
      -  "features",
      -  "parents"
      -]New value: +[
      +  "key",
      +  "title",
      +  "status",
      +  "assignee",
      +  "priority",
      +  "features",
      +  "parent"
      +]
    • changedInput schema / properties / fields / description
      Previous value: -"Какие поля вернуть: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parents`, `priority`, `queue`, `status`, `title`, `updated_at`, `version`. Ключ приходит всегда, пустой список означает «задачу целиком»: разделы длинные. `features` приносит вычисляемые признаки строки: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parents` — прямые родители: ключ и название"New value: +"Fields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`"
    • changedInput schema / properties / key / description
      Previous value: -"Ключи задач: спросить про несколько названных разом, а не по вызову на каждую. Несуществующий ключ отвечает отказом, а не пустой выдачей"New value: +"Task keys: several named tasks in one call. An unknown key is refused with `search_value_invalid`, `reason: task_not_found`, rather than left out"
    • changedInput schema / properties / limit / description
      Previous value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size"
    • removedInput schema / properties / limit / examples
      Removed value: -[
      -  25
      -]
    • changedInput schema / properties / open_blocking_questions / description
      Previous value: -"Из них помеченных `blocking`; `0` означает «ничто не мешает»"New value: +"Exact number of unanswered `blocking` questions; `0` means none blocks"
    • changedInput schema / properties / open_questions / description
      Previous value: -"Ровно столько вопросов без ответа. Для диапазонов есть язык запросов"New value: +"Exact number of unanswered questions; ranges go in `query`"
    • changedInput schema / properties / open_remarks / description
      Previous value: -"Ровно столько замечаний без резолюции. Для диапазонов есть язык запросов"New value: +"Exact number of unresolved remarks; ranges go in `query`"
    • changedInput schema / properties / parent / description
      Previous value: -"Ключи родительских задач: в выдаче их **прямые** дети, на одно колено. `empty()` находит задачи без родителя — верхний уровень очереди. Несуществующий ключ отвечает отказом, а не пустой выдачей: пустота здесь читается как «детей нет», и опечатка спряталась бы за ответом"New value: +"Parent task keys: their **direct** children, one level down. `empty()` matches tasks without a parent, the top level of a project. An unknown key is refused rather than read as «no children»"
    • changedInput schema / properties / priority / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "$ref": "#/$defs/TaskPriority"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "description": "Task priority, from lowest to highest",
      +      "enum": [
      +        "low",
      +        "normal",
      +        "high",
      +        "critical"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / priority / description
      Previous value: -"Приоритеты"New value: +"Priorities"
    • removedInput schema / properties / priority / examples
      Removed value: -[
      -  [
      -    "high"
      -  ]
      -]
    • addedInput schema / properties / project
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Project keys",
      +  "examples": [
      +    [
      +      "TRK"
      +    ]
      +  ],
      +  "title": "Project"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Строка языка запросов. Условие пишется `имя: [оператор] значения` — оператор стоит **после** двоеточия, и это главное, чем язык отличается от SQL: `status: in open, in_progress`, а не `status in (open, in_progress)`. Скобки в языке есть, но группируют они условия, а не значения.\n\nБез оператора условие означает равенство, а несколько значений через запятую — вхождение в набор: `status: open, in_progress` то же самое, что `status: in open, in_progress`.\n\nПоля: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `queue`, `remarks_in_work`, `status`, `text`. Операторы: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (вхождение подстроки), `!~`, `in`, `not in`; `empty()` находит задачи без значения. Условия связываются `and` и `or`.\n\nПримеры:\n- `queue: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ ключ`\n- `assignee: empty() or open_questions: > 0`\n\nОшибка разбора приходит с позицией символа, а там, где верная форма выводима из места ошибки, — и с ней самой в `details.hint`"New value: +"Query language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values.\n\nWithout an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`.\n\nFields: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`.\n\nExamples:\n- `project: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ login`\n- `assignee: empty() or open_questions: > 0`\n\nA string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it"
    • changedInput schema / properties / query / examples
      Previous value: -[
      -  "queue: TRK and status: open and blocked: false",
      -  "status: in open, in_progress",
      -  "priority: >= high and text: ~ ключ",
      -  "assignee: empty() or open_questions: > 0"
      -]New value: +[
      +  "project: TRK and status: open and blocked: false",
      +  "status: in open, in_progress",
      +  "priority: >= high and text: ~ login",
      +  "assignee: empty() or open_questions: > 0"
      +]
    • removedInput schema / properties / queue
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "Ключи очередей",
      -  "examples": [
      -    [
      -      "TRK"
      -    ]
      -  ],
      -  "title": "Queue"
      -}
    • changedInput schema / properties / remarks_in_work / description
      Previous value: -"Замечаний, принятых в работу, чья задача-продолжение ещё не закрыта: «разобрано, но работа не доделана»"New value: +"Number of remarks resolved as `accepted` whose continuation task is not closed yet"
    • changedInput schema / properties / sort / description
      Previous value: -"Порядок, старший ключ первым; `-` в начале — по убыванию. Допустимы: `key`, `last_entry_at`, `priority`, `updated_at`"New value: +"Sort order, most significant key first; a leading `-` sorts descending. Allowed: `key`, `last_entry_at`, `priority`, `updated_at`"
    • changedInput schema / properties / status / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "$ref": "#/$defs/TaskStatus"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "description": "Task status",
      +      "enum": [
      +        "backlog",
      +        "open",
      +        "in_progress",
      +        "waiting",
      +        "done",
      +        "cancelled"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / status / description
      Previous value: -"Статусы задач"New value: +"Task statuses"
    • removedInput schema / properties / status / examples
      Removed value: -[
      -  [
      -    "open"
      -  ]
      -]
    • changedInput schema / properties / text / description
      Previous value: -"Подстрока в названии или описании, без учёта регистра"New value: +"Substring of the title or description, case-insensitive"
    • removedInput schema / properties / text / examples
      Removed value: -[
      -  "выдача ключей"
      -]
    • removedOutput schema / $defs / AuthorKind
      Removed value: -{
      -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
      -  "enum": [
      -    "agent",
      -    "human",
      -    "tracker"
      -  ],
      -  "title": "AuthorKind",
      -  "type": "string"
      -}
    • changedOutput schema / $defs / AuthorView / description
      Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
    • removedOutput schema / $defs / AuthorView / properties / kind / $ref
      Removed value: -"#/$defs/AuthorKind"
    • addedOutput schema / $defs / AuthorView / properties / kind / description
      Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
    • addedOutput schema / $defs / AuthorView / properties / kind / enum
      Added value: +[
      +  "agent",
      +  "human",
      +  "tracker"
      +]
    • addedOutput schema / $defs / AuthorView / properties / kind / type
      Added value: +"string"
    • changedOutput schema / $defs / FeaturesView / description
      Previous value: -"Вычисляемые признаки задачи (`CONCEPT.md`, 4.3)."New value: +"Computed task features."
    • changedOutput schema / $defs / FoundTaskView / description
      Previous value: -"Строка выдачи поиска: карточка задачи, у которой любое поле может отсутствовать.\n\nЕдинственная модель слоя с необязательными полями, и это не послабление типизации, а\nеё предмет. Список умеет отдавать подмножество полей (`fields`), и схема обязана\nчестно это показывать — ровно так же, как `TaskSearchRead` в REST.\n\nОтсюда же сериализатор ниже. SDK сворачивает результат вызовом\n`model_dump(mode=\"json\")` — **без** `exclude_unset`, — и незапрошенное поле приезжало\nбы агенту как `null`. Это не то же самое, что «поля нет»: пакет обязан совпадать с\nответом REST поле в поле, а тот отдаётся с `response_model_exclude_unset`.\n\nСхему сериализатор не портит, и это проверено: SDK строит `outputSchema` через\n`TypeAdapter(...).json_schema()`, у которого режим по умолчанию — **валидация**, а\nобёрточный сериализатор действует только на схему сериализации. У FastAPI режим\nпротивоположный, поэтому предупреждение заметки `docs/notes/api.md` («Отбросить\nпустые поля в ответе — значит потерять схему у клиента») сюда не переносится."New value: +"Search result row: the requested fields of one task."
    • addedOutput schema / $defs / FoundTaskView / properties / parent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/ParentView"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • removedOutput schema / $defs / FoundTaskView / properties / parents
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "$ref": "#/$defs/ParentView"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Parents"
      -}
    • addedOutput schema / $defs / FoundTaskView / properties / previous_keys
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Previous Keys"
      +}
    • changedOutput schema / $defs / FoundTaskView / properties / priority / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/$defs/TaskPriority"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Task priority, from lowest to highest",
      +    "enum": [
      +      "low",
      +      "normal",
      +      "high",
      +      "critical"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / $defs / FoundTaskView / properties / project
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/ProjectRefView"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • removedOutput schema / $defs / FoundTaskView / properties / queue
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "$ref": "#/$defs/QueueRefView"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null
      -}
    • changedOutput schema / $defs / FoundTaskView / properties / status / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/$defs/TaskStatus"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Task status",
      +    "enum": [
      +      "backlog",
      +      "open",
      +      "in_progress",
      +      "waiting",
      +      "done",
      +      "cancelled"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / $defs / ParentView / description
      Previous value: -"Прямой родитель задачи в строке выдачи: ключ и название (`CONCEPT.md`, 4.4)."New value: +"Parent task: key and title."
    • addedOutput schema / $defs / ProjectRefView
      Added value: +{
      +  "description": "Project in one line: key and title.",
      +  "properties": {
      +    "key": {
      +      "title": "Key",
      +      "type": "string"
      +    },
      +    "title": {
      +      "title": "Title",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "key",
      +    "title"
      +  ],
      +  "title": "ProjectRefView",
      +  "type": "object"
      +}
    • removedOutput schema / $defs / QueueRefView
      Removed value: -{
      -  "description": "Очередь одной строкой: ключ и название.",
      -  "properties": {
      -    "key": {
      -      "title": "Key",
      -      "type": "string"
      -    },
      -    "title": {
      -      "title": "Title",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "key",
      -    "title"
      -  ],
      -  "title": "QueueRefView",
      -  "type": "object"
      -}
    • removedOutput schema / $defs / TaskPriority
      Removed value: -{
      -  "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
      -  "enum": [
      -    "low",
      -    "normal",
      -    "high",
      -    "critical"
      -  ],
      -  "title": "TaskPriority",
      -  "type": "string"
      -}
    • removedOutput schema / $defs / TaskStatus
      Removed value: -{
      -  "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
      -  "enum": [
      -    "backlog",
      -    "open",
      -    "in_progress",
      -    "waiting",
      -    "done",
      -    "cancelled"
      -  ],
      -  "title": "TaskStatus",
      -  "type": "string"
      -}
    • addedOutput schema / properties / next_cursor / description
      Added value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
  3. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavior beyond them: archived-project visibility rules, default ordering by key when sort is omitted, truncation of long text with `<field>_truncated`/`<field>_length` markers, and the exact error taxonomy with codes. This is real operational context an agent needs.

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 layered detail; every paragraph carries information. Some query examples and operator lists are restated from the query parameter description, and the mid-sentence line breaks make it slightly harder to scan, but there is little pure 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?

For a 20-parameter tool with an output schema and full annotations, the description covers the tricky cross-cutting concerns: condition combination, archived scope, ordering defaults, truncation, and error codes. Pagination via cursor is implied by the schema field, and return shape is left to the output schema, so it is complete enough without reaching 5.

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 contributes cross-parameter semantics the schema does not: query and separate conditions combine with `and` and behave as one equivalent string. The query-language operator placement note (operator after the colon, unlike SQL) also reinforces schema content at the call level.

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 opening sentence names a specific verb (Searches) and resource (tasks) and enumerates the three input modes (query string, separate conditions, or both). It also distinguishes itself from the sibling get_task by noting that a single task in full, with case and links, comes from get_task. An agent can route correctly 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 Guidelines4/5

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

It explains the semantics that drive selection: combined query+condition inputs are ANDed, and no condition at all selects every task of non-archived projects. The archived-project rule and the get_task pointer give contextual routing. It stops short of stating explicit when-not-to-use cases or naming other siblings (e.g. list_projects) as alternatives, so it is clear but not exhaustive.

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