Skip to main content
Glama
Vault Cortex Obsidian MCP Server

Vault Cortex Obsidian MCP Server

Update Task

vault_update_task
Destructive

Update an existing Obsidian task's status, priority, dates, recurrence, dependencies, checklist items, heading, or lane position in a single edit, identified by block ID or line.

Instructions

Update a task's status, priority, description, dates, recurrence, completion action, dependencies, block_id, checklist items, heading, or position within a lane, in any combination; every field passed is written in a single edit. A repeated call with add_subtasks adds the items again, and a repeated "done" or "cancelled" moves its date stamp to the retry day, so after a timeout or lost response, re-read the task before retrying.

Example: vault_update_task({ path: "TASKS.md", block_id: "my-task", status: "done" }) — complete a task; on a Kanban board, auto-moves to the done lane Example: vault_update_task({ path: "TASKS.md", block_id: "my-task", recurrence: "every week" }) — make a task recurring Example: vault_update_task({ path: "TASKS.md", block_id: "my-task", heading: "Done" }) — move a task to a different heading (the checkbox is unchanged) Example: vault_update_task({ path: "TASKS.md", block_id: "my-task", description: "Updated task name", due: "2026-10-01", scheduled: null }) — change the description, set one date, and clear another Example: vault_update_task({ path: "TASKS.md", block_id: "my-task", status: "in_progress", add_subtasks: ["Design", "Implement", "Test"] }) — start working and add checklist stages Example: vault_update_task({ path: "TASKS.md", line: 42, assign_block_id: "my-task" }) — add a block_id to a task that lacks one

When to use: Any change to an existing task. Use vault_list_tasks first to get identification fields (path + block_id or line). For creating a new task, use vault_create_task instead.

Parameters:

  • Exactly one of block_id or line is required to identify the task. A Kanban sub-task this server created has no block_id, so re-read its line with vault_list_tasks just before an update by line. After a write, wait a few seconds for the listing to catch up.

  • At least one change is required. Clearing is always explicit null — omitting a field leaves it untouched.

  • status side effects: Kanban: "done" moves the card and everything nested under it to the done lane (the lane whose first line is Complete, else the heading "Done", exact case), leaving nested checkboxes as they are; a sub-task stays under its parent. Recurring (🔁), on "done" only: spawns the next occurrence, dates advanced per the rule, directly above the completed task, which keeps its nested lines. When the Tasks plugin's settings put the next recurrence on the line below, the spawn goes on the line directly below the task instead, so the task's nested lines then sit under the spawn. The spawn stays in the source lane with no block_id, 🆔, or ⛔ — follow up with assign_block_id on next_occurrence.line, except on an indented line of a Kanban board. Completing by line is NOT idempotent for recurring tasks (the spawn occupies the old line); prefer block_id. Delete (🏁 delete / [onCompletion:: delete]), on "done": removes the task line and its children instead of moving to done. With 🔁 + 🏁, the next occurrence is still created, and the completed task is removed.

  • recurrence: a rule ending "when done" bases the next occurrence on the completion day. When set together with status "done", the new rule governs the next occurrence. Setting recurrence to null while completing removes the rule and completes without spawning.

  • on_completion: passed together with status, the submitted value governs the delete decision — "keep" while completing a "delete" task prevents the deletion.

  • position: applies to a heading move or an auto-done-lane move; otherwise it reorders the task within its current lane. Ignored when the task is deleted on completion.

Errors: (messages use camelCase names, e.g. assignBlockId for assign_block_id)

  • "note not found" — path does not exist; check the path with vault_list_notes

  • "path must end in …" — add the .md extension

  • "absolute path blocked" / "path traversal blocked" / "hidden path blocked" — pass a vault-relative path with no dot-prefixed part

  • "exactly one of blockId or line is required" / "blockId and line are mutually exclusive" — the message states the rule

  • "blockId ... not found" / "blockId ... is inside a fenced code block or comment" — no task line outside a fenced code block or %% %% comment ends with that ^id; check the id with vault_list_tasks, or target by line

  • "blockId ... matches N task lines" — the message lists the lines; target the intended task by line, then repair: on a regular note, give all but one line a new id with assign_block_id; on a Kanban board, where the plugin copies a sub-task's id onto its card, clear the sub-task's id (assign_block_id: null, by line) and give the card the id its links use, or a new one

  • "no task at line N" / "line N is inside a fenced code block or comment" — the line holds no task checkbox, or sits inside a fenced code block or %% %% comment; re-read line numbers with vault_list_tasks, or target by block_id

  • "checkbox "[c]" is a NON_TASK status" / "no checkbox symbol for status ..." — in the Tasks plugin's status settings, the task's checkbox character (c) is typed NON_TASK, or the named status has no symbol and its default character has another type; the user changes that character's type or adds the symbol there, then restarts the server

  • "at least one mutation" — the message lists the fields that count

  • "cannot move a sub-task to a heading" / "cannot reposition a sub-task" — a heading or position on a task nested under another task (depth > 0 in vault_list_tasks); sub-tasks move with their parent, so move or reposition the parent instead

  • "cannot reorder a task that sits above the first heading" — position without a heading on a task before the first section heading; the message names the fix

  • "cannot reorder within "X" — the heading appears N times" / "cannot place at position P under "X" — the heading appears N times" — the heading name is duplicated in the note: the task's own heading for a reorder in place, the one in heading for a move; for a cross-lane move use "top" or "bottom" (they place under the first match), or rename one section to make it unique

  • "heading "X" not found; available: ..." — the message lists the note's headings

  • "multiple done lanes detected" / "no done lane detected" — status "done" on a Kanban board with more than one lane whose first line is Complete, or with none and no "Done" heading; pass heading to pick the lane

  • "blockId ... already exists" / "blockId ... contains invalid characters" — assign_block_id must be unique in the note and match [a-zA-Z0-9-]+

  • "assignBlockId is not allowed" / "description ends in a block ID" / "subtask ... ends in a block ID" — a new ^id on an indented line of a Kanban board; leave the line without an id and target it by line, and drop any trailing ^id from the text

  • "invalid date: …" — the message names the expected format

  • "description cannot be empty" / "addSubtasks cannot contain an empty item" / "description must be a single line" / "addSubtasks items must be a single line" — pass visible text on a single line

  • "taskId ... contains invalid characters" / "dependsOn entry ... contains invalid characters" — the message names the allowed characters

  • "unrecognized recurrence rule ..." — the message gives example rules

  • "concurrent write in progress" — another write to this note is in flight; retry

  • "ENAMETOOLONG: …" or another filesystem error — the message says what to do

  • "properties block …" — the note's properties block can't be read, or a rewrite would lose it; the error says how to repair it

  • "the note would open with a properties block …" — a note without properties would start with --- lines around text that can't be properties; the error says how to avoid it

Obsidian syntax: When description or add_subtasks text ends in a field the plugin's parser recognizes (an emoji field like "🔁 every week", or a Dataview [key:: value] field), with only other recognized fields after it, that text is read back as metadata. The write still succeeds; reword the text to clear the advisories the result carries. The ✅/❌ dates a status change adds or removes produce no advisories.

Returns: JSON { path, line, description, block_id, heading, subtasks, next_occurrence, changes, advisories, on_completion_applied }.

  • line is the task's final 1-based line number in the file; after an on_completion delete, the line the task occupied before removal.

  • description is the current text, and block_id and heading reflect the task after the update; block_id is omitted when the task has none, heading when the task sits above the first heading.

  • subtasks lists each checklist item add_subtasks wrote as { line, description } (omitted when none were added); checklist items are written without a block_id, so line is the handle for a follow-up update.

  • next_occurrence is present only when a completion spawned a recurring task's next occurrence: { line, description, due?, scheduled?, start? } with only the dates the occurrence has.

  • changes lists every field applied as "field: before → after", with "(none)" for an absent value; an add_subtasks change is listed under "subtasks", a spawn under "next_occurrence", and a 🏁 delete under "on_completion".

  • advisories (omitted when there are none) lists one sentence for each: a stored line that parses back differently than submitted (see Obsidian syntax above), a duplicate tag removed from the line, or a completed recurring task whose rule yields no next occurrence (unreadable rule text, or a finite rule with no occurrences left).

  • on_completion_applied is "delete", present only when the effective on_completion was delete (already on the task or set in the same call) and the task was transitioned to done.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "path": "<path>"
    },
    "name": "vault_update_task"
  }
}

Input Schema

NameRequiredDescriptionDefault
dueNoDue date (YYYY-MM-DD) to set, or null to clear.
lineNo1-based line number from vault_list_tasks. Fragile if the file changed since the query.
pathYesVault-relative path to the note containing the task (must end in ".md"). Use the exact letter case.
startNoStart date (YYYY-MM-DD) to set, or null to clear.
formatNoField format for metadata this call writes; fields it leaves alone keep theirs. Default: auto-detected from .obsidian/ config, falling back to emoji.
statusNoTarget status. "done" adds the ✅ date and "cancelled" the ❌ date, when the Tasks plugin's settings stamp them; moving a task out of either status removes its date.
createdNoCreated date (YYYY-MM-DD) to set or clear, for corrections.
headingNoTarget heading to move the task to. On Kanban boards this is a lane move; works on any note with headings. Not valid on sub-tasks.
task_idNoTasks plugin 🆔 identifier to set, or null to clear — letters, digits, hyphens, and underscores; separate from block_id.
block_idNoStable task identifier — the ^block-id at the end of the task line, without the ^. Preferred over line.
positionNoWhere within the target heading the task lands. "top" or "bottom" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). A position past the card count lands directly below the last card (unlike "bottom", which appends after any non-task text at the end of the section). Defaults to "top" on heading and done-lane moves.
priorityNoPriority signifier to set, or null to remove it.
scheduledNoScheduled date (YYYY-MM-DD) to set, or null to clear.
depends_onNoTasks plugin ⛔ dependency IDs to set (non-empty), or null to clear.
recurrenceNoTasks plugin 🔁 rule in natural language (e.g. "every week", "every month on the 15th", "every 2 weeks when done") to set, or null to remove it.
descriptionNoNew task description text; metadata fields and block_id are preserved.
add_subtasksNoChecklist items to append, one indented todo line each, under the task's existing items. Not appended, and not reported, when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id.
on_completionNoTasks plugin 🏁 onCompletion action to set, or null to remove it. "keep" leaves the task in place on completion, as having no 🏁 field does.
assign_block_idNoAdd or replace the ^block-id on the task line, or null to remove it. Letters, digits, and hyphens only; must be unique within the note.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.56.3
    • changedInput schema / properties / created / description
      Previous value: -"Created date (YYYY-MM-DD) to set or clear, for corrections. vault_create_task stamps it on every new task."New value: +"Created date (YYYY-MM-DD) to set or clear, for corrections."
    • changedInput schema / properties / format / description
      Previous value: -"Field format for metadata this call writes; fields it leaves alone keep theirs, so a line can mix formats. Default: auto-detected from .obsidian/ config, falling back to emoji."New value: +"Field format for metadata this call writes; fields it leaves alone keep theirs. Default: auto-detected from .obsidian/ config, falling back to emoji."
  2. Changed3 schema fields changedv0.55.4
    • changedInput schema / properties / add_subtasks / description
      Previous value: -"Checklist items to append, one indented todo line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended, and not reported, when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."New value: +"Checklist items to append, one indented todo line each, under the task's existing items. Not appended, and not reported, when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."
    • changedInput schema / properties / description / description
      Previous value: -"New task description text. Replaces the existing description; metadata fields and block_id are preserved."New value: +"New task description text; metadata fields and block_id are preserved."
    • changedInput schema / properties / position / description
      Previous value: -"Where within the target heading the task lands. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"top\" on heading and done-lane moves."New value: +"Where within the target heading the task lands. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"top\" on heading and done-lane moves."
  3. Changed1 schema field changedv0.55.1
    • changedInput schema / properties / status / description
      Previous value: -"Target status. \"done\" adds the ✅ date and \"cancelled\" the ❌ date, when the Tasks plugin's settings stamp them; leaving either status removes its date."New value: +"Target status. \"done\" adds the ✅ date and \"cancelled\" the ❌ date, when the Tasks plugin's settings stamp them; moving a task out of either status removes its date."
  4. Changed3 schema fields changedv0.54.16
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / on_completion / description
      Previous value: -"Tasks plugin 🏁 onCompletion action to set, or null to remove it. \"delete\" removes the task line on completion; \"keep\" leaves it in place (which is also the behavior when no 🏁 field exists on the task). Omitting this parameter leaves the field unchanged."New value: +"Tasks plugin 🏁 onCompletion action to set, or null to remove it. \"keep\" leaves the task in place on completion, as having no 🏁 field does."
    • changedInput schema / properties / recurrence / description
      Previous value: -"Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every month on the 15th\", \"every 2 weeks when done\") to set, or null to remove it. Completing the task spawns its next occurrence."New value: +"Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every month on the 15th\", \"every 2 weeks when done\") to set, or null to remove it."
  5. Changed10 schema fields changedv0.54.13
    • changedInput schema / properties / add_subtasks / description
      Previous value: -"Checklist items to append, one indented todo line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."New value: +"Checklist items to append, one indented todo line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended, and not reported, when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."
    • addedInput schema / properties / assign_block_id / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / assign_block_id / description
      Previous value: -"Add or replace the ^block-id on the task line. Letters, digits, and hyphens only; must be unique within the note."New value: +"Add or replace the ^block-id on the task line, or null to remove it. Letters, digits, and hyphens only; must be unique within the note."
    • removedInput schema / properties / assign_block_id / minLength
      Removed value: -1
    • removedInput schema / properties / assign_block_id / type
      Removed value: -"string"
    • changedInput schema / properties / created / description
      Previous value: -"Created date (YYYY-MM-DD) to set or clear. Typically auto-stamped; use for corrections."New value: +"Created date (YYYY-MM-DD) to set or clear, for corrections. vault_create_task stamps it on every new task."
    • changedInput schema / properties / format / description
      Previous value: -"Field format for new metadata. Default: auto-detected from .obsidian/ config, falling back to emoji."New value: +"Field format for metadata this call writes; fields it leaves alone keep theirs, so a line can mix formats. Default: auto-detected from .obsidian/ config, falling back to emoji."
    • changedInput schema / properties / position / description
      Previous value: -"Where within the target heading the task lands. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"top\" on heading moves."New value: +"Where within the target heading the task lands. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"top\" on heading and done-lane moves."
    • changedInput schema / properties / status / description
      Previous value: -"Target status. \"done\" appends the ✅ date; \"cancelled\" appends the ❌ date."New value: +"Target status. \"done\" adds the ✅ date and \"cancelled\" the ❌ date, when the Tasks plugin's settings stamp them; leaving either status removes its date."
    • changedInput schema / properties / task_id / description
      Previous value: -"Tasks plugin 🆔 identifier to set, or null to clear."New value: +"Tasks plugin 🆔 identifier to set, or null to clear — letters, digits, hyphens, and underscores; separate from block_id."
  6. Changed3 schema fields changedv0.54.9
    • changedInput schema / properties / position / description
      Previous value: -"Where within the target heading the task lands after a heading move or auto-done-lane move. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any trailing section content). Defaults to \"top\" on heading moves. Without a heading, triggers a same-lane reorder to the given position; omitting position entirely performs no reorder. Ignored when the task is deleted on completion. Not valid on sub-tasks."New value: +"Where within the target heading the task lands. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"top\" on heading moves."
    • changedInput schema / properties / recurrence / description
      Previous value: -"Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every 2 weeks when done\") to set, or null to remove it. Completing the task spawns its next occurrence."New value: +"Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every month on the 15th\", \"every 2 weeks when done\") to set, or null to remove it. Completing the task spawns its next occurrence."
    • changedInput schema / properties / status / description
      Previous value: -"Target status. \"done\" appends the ✅ date and, on a Kanban board, moves the card and its checklist sub-items to the done lane (sub-item checkboxes are left as they are); a task with 🏁 delete / [onCompletion:: delete] is removed from the file instead. \"cancelled\" appends the ❌ date."New value: +"Target status. \"done\" appends the ✅ date; \"cancelled\" appends the ❌ date."
  7. Changed1 schema field changedv0.54.7
    • changedInput schema / properties / path / description
      Previous value: -"Vault-relative path to the note containing the task (must end in \".md\")"New value: +"Vault-relative path to the note containing the task (must end in \".md\"). Use the exact letter case."
  8. Changed1 schema field changedv0.54.0
    • changedInput schema / properties / add_subtasks / description
      Previous value: -"Checklist items to append, one indented [ ] line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."New value: +"Checklist items to append, one indented todo line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."
  9. Changed5 schema fields changedv0.53.0
    • addedInput schema / properties / position / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "top",
      +      "bottom"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  }
      +]
    • removedInput schema / properties / position / default
      Removed value: -"top"
    • changedInput schema / properties / position / description
      Previous value: -"Where within the target heading the task lands after a heading move or auto-done-lane move. Defaults to \"top\". Ignored when no heading move occurs."New value: +"Where within the target heading the task lands after a heading move or auto-done-lane move. \"top\" or \"bottom\" for the extremes; an integer (1-based) for an exact position among the lane's top-level cards (sub-tasks move with their parent and are not counted). Position 1 is the first card. A position past the card count lands directly below the last card (unlike \"bottom\", which appends after any trailing section content). Defaults to \"top\" on heading moves. Without a heading, triggers a same-lane reorder to the given position; omitting position entirely performs no reorder. Ignored when the task is deleted on completion. Not valid on sub-tasks."
    • removedInput schema / properties / position / enum
      Removed value: -[
      -  "top",
      -  "bottom"
      -]
    • removedInput schema / properties / position / type
      Removed value: -"string"
  10. Changed3 schema fields changedv0.51.1
    • changedInput schema / properties / add_subtasks / description
      Previous value: -"Checklist items to append, one indented [ ] line each, under the task's existing items — never replaces them. Can be combined with any other change. For full sub-tasks with metadata, use vault_create_task with parent_block_id."New value: +"Checklist items to append, one indented [ ] line each, under the task's existing items — never replaces them. Can be combined with any other change; not appended when the same call removes the task (on_completion delete). For full sub-tasks with metadata, use vault_create_task with parent_block_id."
    • addedInput schema / properties / on_completion
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "delete",
      +        "keep"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Tasks plugin 🏁 onCompletion action to set, or null to remove it. \"delete\" removes the task line on completion; \"keep\" leaves it in place (which is also the behavior when no 🏁 field exists on the task). Omitting this parameter leaves the field unchanged."
      +}
    • changedInput schema / properties / status / description
      Previous value: -"Target status. \"done\" appends the ✅ date and, on a Kanban board, moves the card and its checklist sub-items to the done lane (sub-item checkboxes are left as they are). \"cancelled\" appends the ❌ date."New value: +"Target status. \"done\" appends the ✅ date and, on a Kanban board, moves the card and its checklist sub-items to the done lane (sub-item checkboxes are left as they are); a task with 🏁 delete / [onCompletion:: delete] is removed from the file instead. \"cancelled\" appends the ❌ date."
  11. Changed1 schema field changedv0.51.0
    • addedInput schema / properties / recurrence
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every 2 weeks when done\") to set, or null to remove it. Completing the task spawns its next occurrence."
      +}
  12. Changed1 schema field changedv0.50.0
    • addedInput schema / properties / position / default
      Added value: +"top"
  13. Changed18 schema fields changedv0.41.2
    • addedInput schema / properties / add_subtasks
      Added value: +{
      +  "description": "Checklist items to append, one indented [ ] line each, under the task's existing items — never replaces them. Can be combined with any other change. For full sub-tasks with metadata, use vault_create_task with parent_block_id.",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / assign_block_id
      Added value: +{
      +  "description": "Add or replace the ^block-id on the task line. Letters, digits, and hyphens only; must be unique within the note.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / created
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Created date (YYYY-MM-DD) to set or clear. Typically auto-stamped; use for corrections."
      +}
    • addedInput schema / properties / depends_on
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Tasks plugin ⛔ dependency IDs to set (non-empty), or null to clear."
      +}
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "New task description text. Replaces the existing description; metadata fields and block_id are preserved.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / due
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Due date (YYYY-MM-DD) to set, or null to clear."
      +}
    • changedInput schema / properties / format / description
      Previous value: -"Field format for new metadata (done dates, priority). Overrides the auto-detected Tasks plugin config. Default: auto-detected from .obsidian/ config, falling back to emoji."New value: +"Field format for new metadata. Default: auto-detected from .obsidian/ config, falling back to emoji."
    • addedInput schema / properties / heading
      Added value: +{
      +  "description": "Target heading to move the task to. On Kanban boards this is a lane move; works on any note with headings. Not valid on sub-tasks.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • removedInput schema / properties / lane
      Removed value: -{
      -  "description": "Target Kanban lane heading for a lane move. Only valid on Kanban boards.",
      -  "minLength": 1,
      -  "type": "string"
      -}
    • addedInput schema / properties / position
      Added value: +{
      +  "description": "Where within the target heading the task lands after a heading move or auto-done-lane move. Defaults to \"top\". Ignored when no heading move occurs.",
      +  "enum": [
      +    "top",
      +    "bottom"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / priority / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "highest",
      +      "high",
      +      "medium",
      +      "low",
      +      "lowest"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / priority / description
      Previous value: -"Target priority. \"none\" removes the priority emoji."New value: +"Priority signifier to set, or null to remove it."
    • removedInput schema / properties / priority / enum
      Removed value: -[
      -  "highest",
      -  "high",
      -  "medium",
      -  "low",
      -  "lowest",
      -  "none"
      -]
    • removedInput schema / properties / priority / type
      Removed value: -"string"
    • addedInput schema / properties / scheduled
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Scheduled date (YYYY-MM-DD) to set, or null to clear."
      +}
    • addedInput schema / properties / start
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Start date (YYYY-MM-DD) to set, or null to clear."
      +}
    • changedInput schema / properties / status / description
      Previous value: -"Target status. \"done\" appends ✅ date and auto-moves to done lane on Kanban boards. \"cancelled\" appends ❌ date."New value: +"Target status. \"done\" appends the ✅ date and, on a Kanban board, moves the card and its checklist sub-items to the done lane (sub-item checkboxes are left as they are). \"cancelled\" appends the ❌ date."
    • addedInput schema / properties / task_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Tasks plugin 🆔 identifier to set, or null to clear."
      +}
  14. Addedv0.32.1
  15. Removedv0.32.0
  16. Addedv0.27.2

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well past them: it explains why retries are unsafe (add_subtasks duplicates, repeated done/cancelled restamps the date), documents Kanban done-lane and 🏁 delete side effects, recurrence spawn placement, and the concurrency error. The only deduction is that the huge error catalogue sometimes displaces a compact statement of preconditions, so the safety narrative is scattered rather than consolidated.

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

Conciseness4/5

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

Well front-loaded and clearly sectioned (purpose → examples → when-to-use → parameters → errors → syntax → returns), and each example demonstrates a distinct capability. However, the error catalogue runs to roughly thirty entries including low-frequency filesystem and properties-block cases, which inflates the definition well beyond what most calls need.

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 19-parameter destructive mutation tool with no output schema, the description still documents the full return shape (path, line, description, block_id, heading, subtasks, next_occurrence, changes, advisories, on_completion_applied) field by field. Failure modes, recovery steps, and advisory semantics are all covered, leaving nothing an agent needs before calling it.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline would be 3 — yet the description adds real semantics the schema cannot: mutual exclusivity of block_id/line, the at-least-one-change requirement, that clearing is explicit null while omission leaves a field untouched, how on_completion overrides an existing 🏁 delete when passed with status, and how position behaves on heading vs. in-lane moves. This is meaningfully more than the per-property schema text.

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 and enumerates exactly what can be changed (status, priority, dates, recurrence, dependencies, checklist items, heading, position) plus the single-edit atomicity guarantee. An agent can distinguish this from vault_create_task or vault_write_note from the first sentence alone.

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?

"When to use: Any change to an existing task" is followed by an explicit prerequisite (vault_list_tasks first to obtain path + block_id or line) and an explicit exclusion routing new-task creation to vault_create_task. Identification rules (exactly one of block_id or line, prefer block_id for recurring tasks) are stated rather than inferred.

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