Skip to main content
Glama
aliasunder

Vault Cortex Obsidian MCP Server

Create Task

vault_create_task

Create a correctly-formatted task in one call — description, target heading, dates, priority, block_id, and optional checklist sub-items.

Instructions

Create a correctly-formatted task in one call — description, target heading, dates, priority, block_id, and optional checklist sub-items. The task is always created as todo (the Tasks plugin's todo symbol, [ ] by default), with its created date (➕) set to today; set in_progress later with vault_update_task. Metadata uses the format the vault's Tasks plugin is configured for (emoji unless its config says Dataview); override it only at the user's request, since the plugin reads just one format.

Example: vault_create_task({ path: "TASKS.md", description: "Fix login bug", block_id: "fix-login", heading: "Active", priority: "high", due: "2026-09-15" }) — a card in a Kanban board's Active lane Example: vault_create_task({ path: "TASKS.md", description: "Sub-bug", parent_block_id: "fix-login", due: "2026-09-01" }) — full sub-task under fix-login; no block_id on a Kanban sub-task Example: vault_create_task({ path: "Projects/plan.md", description: "Quick fix", block_id: "quick-fix", parent_line: 42 }) — sub-task in a regular note under a parent identified by line number Example: vault_create_task({ path: "TASKS.md", description: "Write release notes", block_id: "release-notes", heading: "Active", position: 3 }) — insert as the 3rd card in the lane

When to use: Creating a new task card on a board or in a note. Guarantees correct field ordering (description → priority → 🔁 recurrence → 🏁 on_completion → ➕ created → 🛫 start → ⏳ scheduled → 📅 due → 🆔 task_id → ⛔ depends_on → ^block_id) so the card round-trips through vault_list_tasks with all fields intact. For lightweight checklist items under an existing card (no metadata), use vault_update_task's add_subtasks param instead.

Parameters:

  • heading is required on Kanban boards (notes with a kanban-plugin property) unless a parent is given.

  • parent_block_id / parent_line: the same pair vault_update_task uses (block_id / line). Pass at most one. Either is mutually exclusive with heading — a sub-task lives wherever its parent lives.

  • block_id / subtasks: block_id is required, except on a Kanban sub-task, where it is refused, as is a subtasks item ending in a ^block-id on a board. When the Kanban plugin saves the board, it copies an indented line's block ID onto its card, replacing the card's own ID.

  • position: ignored without a heading, and under a parent, where the sub-task goes after the parent's last sub-item.

  • priority: the plugin ranks "no signifier" (normal priority) between medium and low.

  • recurrence: a rule ending "when done" bases the next occurrence on the completion day; a task with no dates recurs as a dateless copy.

  • due / scheduled / start: omit a date rather than guessing — an absent 📅 means "no deadline".

Errors: (messages use camelCase names, e.g. blockId for 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" — use a vault-relative path with no hidden (dot-prefixed) file or folder in it

  • "heading required for Kanban boards" — kanban-plugin note without heading; pass heading with the target lane

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

  • "cannot place at position P under "X" — the heading appears N times" — integer position on a note with duplicate heading names; use "top" or "bottom" (they place under the first match), or rename one section to make it unique

  • "parent task not found" — parent_block_id or parent_line doesn't resolve to a task (message names the blockId or line tried), or the line is inside a fenced code block or %% %% comment; re-read the parent's block_id or line with vault_list_tasks

  • "parent task ambiguous" — more than one task line ends in that ^id (the message lists their line numbers); pass parent_line instead

  • "checkbox "[c]" is a NON_TASK status" — the parent's checkbox character (c) is typed NON_TASK in the Tasks plugin's status settings, so it is not a task; the user must change its type there, then restart the server

  • "no checkbox symbol for status ..." — the Tasks plugin's status settings have no symbol for todo, and the default [ ] character has another type; the user must add a todo symbol there, then restart the server

  • "parentBlockId and parentLine are mutually exclusive" — both parent_block_id and parent_line were passed; drop one

  • "parent and heading are mutually exclusive" — a parent (parent_block_id or parent_line) and heading were both passed; drop one

  • "blockId ... already exists in this note" — pick a block_id not yet used in the note

  • "blockId ... contains invalid characters" — block_id must match [a-zA-Z0-9-]+

  • "blockId is required" — pass block_id

  • "blockId is not allowed on a sub-task on a Kanban board" / "subtask ... ends in a block ID" — drop the block_id, or the trailing ^id from the checklist item

  • "description is empty" / "subtasks cannot contain an empty item" — whitespace-only description or checklist item; pass visible text

  • "description must be a single line" / "subtasks items must be a single line" — a task is one file line; a line break in the text would split its metadata onto a line the parser never reads; remove the line breaks

  • "taskId ... contains invalid characters" / "dependsOn entry ... contains invalid characters" — task_id and every depends_on entry must match [a-zA-Z0-9_-]+ (the Tasks plugin's id grammar)

  • "unrecognized recurrence rule ..." — the rule text is not Tasks-plugin natural language; written as-is it would silently never recur; use a rule such as "every week" or "every 2 weeks when done"

  • "invalid date" — a date param fails calendar validation; pass a real YYYY-MM-DD date

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

  • "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 …" — the edit would leave --- lines at the top of a note with no properties, around text that can't be kept as properties; the error says how to avoid it

Obsidian syntax: The Tasks plugin reads metadata off the END of a task line. When description or subtasks text ends in a signifier the plugin's parser recognizes as a field (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, not text. Whether it is captured depends on the field's value grammar: 🔁 reads any trailing words as its recurrence rule, while 📅 followed by non-date words stays description text. Captured text can also change the value read back for the field beside it, or add a field the call never set. The write still succeeds either way; when the stored line would read back differently than submitted, the result carries an advisories array naming each divergence; reword the text to avoid one.

Returns: JSON { path, line, description, block_id, heading, subtasks, changes, advisories } — line is the new task's 1-based line number in the file; description is the text as submitted; block_id is omitted when the task has none (line is then its handle); heading is the nearest heading above the new task (omitted when the note has none); subtasks lists each checklist item written as { line, description } (omitted when none) — checklist items are written without a block_id, so line is the handle for a follow-up update; changes lists every field written as "field: (none) → value", and checklist items as "subtasks: 0 → N"; advisories (omitted when the line round-trips clean) lists one sentence per place the stored line parses back differently than submitted — see Obsidian syntax above.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dueNoDeadline (📅), YYYY-MM-DD, calendar-validated. Omit when there is no deadline.
pathYesVault-relative path to the note (must end in ".md"). The note must already exist. Use the exact letter case.
startNoEarliest day work can begin (🛫), YYYY-MM-DD, calendar-validated.
formatNoField format. Default: auto-detected from .obsidian/ config, falling back to emoji.
headingNoTarget heading's text, without the # marks, matched exactly. On a regular note, omit to append at end of body.
task_idNoTasks plugin 🆔 identifier other tasks can name in depends_on — letters, digits, hyphens, and underscores; separate from block_id.
block_idNoThe ^block-id (without the ^) for stable identification — letters, digits, and hyphens only ([a-zA-Z0-9-]+), unique within the note.
positionNoWhere within the heading section the task is placed: "top" first in the section, "bottom" at the end of the section, or a 1-based integer for an exact slot among the section's top-level tasks (a Kanban lane's cards; nested tasks are not counted). A position past the count lands directly below the last top-level task (unlike "bottom", which appends after any non-task text at the end of the section). Defaults to "bottom" ("top" on Kanban boards set to new-card-insertion-method: "prepend").
priorityNoPriority signifier: highest 🔺, high ⏫, medium 🔼, low 🔽, lowest ⏬. Omit for normal priority — no signifier is written.
subtasksNoChecklist sub-items: text-only todo lines indented under the card, with no metadata (not even ➕). For a sub-task with dates or priority, make a separate call with parent_block_id.
scheduledNoDay the work is planned for (⏳), YYYY-MM-DD, calendar-validated.
depends_onNoTasks plugin ⛔ dependency IDs (🆔 values of other tasks), not checked against existing tasks. Non-empty; omit when there are no dependencies.
recurrenceNoTasks plugin 🔁 rule in natural language (e.g. "every week", "every month on the 15th", "every 2 weeks when done"). Completing the task spawns its next occurrence.
descriptionYesThe task text (before metadata fields).
parent_lineNo1-based line number of an existing task to nest under as a sub-task. Fragile if the file changed since the line was read.
on_completionNoTasks plugin 🏁 onCompletion action. "delete" removes the task line and its children on completion; "keep" leaves it in place, as omitting the field does.
parent_block_idNo^block-id (without the ^) of an existing task to nest under as a sub-task.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.54.13
    • changedInput schema / properties / block_id / description
      Previous value: -"The ^block-id for stable identification — letters, digits, and hyphens only ([a-zA-Z0-9-]+). Must be unique within the note."New value: +"The ^block-id (without the ^) for stable identification — letters, digits, and hyphens only ([a-zA-Z0-9-]+), unique within the note."
    • changedInput schema / properties / depends_on / description
      Previous value: -"Tasks plugin ⛔ dependency IDs (🆔 values of other tasks). Non-empty; omit when there are no dependencies."New value: +"Tasks plugin ⛔ dependency IDs (🆔 values of other tasks), not checked against existing tasks. Non-empty; omit when there are no dependencies."
    • changedInput schema / properties / heading / description
      Previous value: -"Target heading. On a regular note, omit to append at end of body."New value: +"Target heading's text, without the # marks, matched exactly. On a regular note, omit to append at end of body."
    • changedInput schema / properties / on_completion / description
      Previous value: -"Tasks plugin 🏁 onCompletion action. \"delete\" removes the task line on completion; \"keep\" leaves it in place."New value: +"Tasks plugin 🏁 onCompletion action. \"delete\" removes the task line and its children on completion; \"keep\" leaves it in place, as omitting the field does."
    • changedInput schema / properties / position / description
      Previous value: -"Where within the heading section the task is placed. \"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 bottom."New value: +"Where within the heading section the task is placed: \"top\" first in the section, \"bottom\" at the end of the section, or a 1-based integer for an exact slot among the section's top-level tasks (a Kanban lane's cards; nested tasks are not counted). A position past the count lands directly below the last top-level task (unlike \"bottom\", which appends after any non-task text at the end of the section). Defaults to \"bottom\" (\"top\" on Kanban boards set to new-card-insertion-method: \"prepend\")."
    • changedInput schema / properties / priority / description
      Previous value: -"Priority signifier (🔺⏫🔼🔽⏬). Omit for normal priority — no signifier is written."New value: +"Priority signifier: highest 🔺, high ⏫, medium 🔼, low 🔽, lowest ⏬. Omit for normal priority — no signifier is written."
    • changedInput schema / properties / subtasks / description
      Previous value: -"Checklist item descriptions — created as indented todo lines under the card (no metadata). For full sub-tasks with dates, priority, and block_id, make a separate call with parent_block_id."New value: +"Checklist sub-items: text-only todo lines indented under the card, with no metadata (not even ➕). For a sub-task with dates or priority, make a separate call with parent_block_id."
    • changedInput schema / properties / task_id / description
      Previous value: -"Tasks plugin 🆔 identifier other tasks can name in depends_on."New value: +"Tasks plugin 🆔 identifier other tasks can name in depends_on — letters, digits, hyphens, and underscores; separate from block_id."
    • changedInput schema / required
      Previous value: -[
      -  "path",
      -  "description",
      -  "block_id"
      -]New value: +[
      +  "path",
      +  "description"
      +]
  2. Changed5 schema fields changedv0.54.9
    • changedInput schema / properties / heading / description
      Previous value: -"Target heading. Required on Kanban boards; optional on regular notes (omit to append at end of body)."New value: +"Target heading. On a regular note, omit to append at end of body."
    • changedInput schema / properties / parent_block_id / description
      Previous value: -"^block-id (without the ^) of an existing task to nest under as a sub-task. Mutually exclusive with parent_line and heading."New value: +"^block-id (without the ^) of an existing task to nest under as a sub-task."
    • changedInput schema / properties / parent_line / description
      Previous value: -"1-based line number of an existing task to nest under as a sub-task. Mutually exclusive with parent_block_id and heading. Fragile if the file changed since the line was read."New value: +"1-based line number of an existing task to nest under as a sub-task. Fragile if the file changed since the line was read."
    • changedInput schema / properties / position / description
      Previous value: -"Where within the heading section the task is placed. \"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 bottom. Kanban boards with new-card-insertion-method set to prepend default to top instead. Ignored when no heading or when placing under a parent."New value: +"Where within the heading section the task is placed. \"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 bottom."
    • changedInput schema / properties / recurrence / description
      Previous value: -"Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every 2 weeks when done\"). 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\"). Completing the task spawns its next occurrence."
  3. Changed1 schema field changedv0.54.7
    • changedInput schema / properties / path / description
      Previous value: -"Vault-relative path to the note (must end in \".md\"). The note must already exist."New value: +"Vault-relative path to the note (must end in \".md\"). The note must already exist. Use the exact letter case."
  4. Changed1 schema field changedv0.54.0
    • changedInput schema / properties / subtasks / description
      Previous value: -"Checklist item descriptions — created as indented [ ] lines under the card (no metadata). For full sub-tasks with dates, priority, and block_id, make a separate call with parent_block_id."New value: +"Checklist item descriptions — created as indented todo lines under the card (no metadata). For full sub-tasks with dates, priority, and block_id, make a separate call with parent_block_id."
  5. Changed4 schema fields changedv0.53.0
    • addedInput schema / properties / position / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "top",
      +      "bottom"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  }
      +]
    • changedInput schema / properties / position / description
      Previous value: -"Where within the heading section the task is placed. Defaults to bottom. Kanban boards with new-card-insertion-method set to prepend default to top instead. Ignored when no heading or when placing under a parent."New value: +"Where within the heading section the task is placed. \"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 bottom. Kanban boards with new-card-insertion-method set to prepend default to top instead. Ignored when no heading or when placing under a parent."
    • removedInput schema / properties / position / enum
      Removed value: -[
      -  "top",
      -  "bottom"
      -]
    • removedInput schema / properties / position / type
      Removed value: -"string"
  6. Changed1 schema field changedv0.51.1
    • addedInput schema / properties / on_completion
      Added value: +{
      +  "description": "Tasks plugin 🏁 onCompletion action. \"delete\" removes the task line on completion; \"keep\" leaves it in place.",
      +  "enum": [
      +    "delete",
      +    "keep"
      +  ],
      +  "type": "string"
      +}
  7. Changed1 schema field changedv0.51.0
    • addedInput schema / properties / recurrence
      Added value: +{
      +  "description": "Tasks plugin 🔁 rule in natural language (e.g. \"every week\", \"every 2 weeks when done\"). Completing the task spawns its next occurrence.",
      +  "minLength": 1,
      +  "type": "string"
      +}
  8. Addedv0.41.2

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (write, non-destructive, non-idempotent), and the description adds genuinely non-obvious behavior: guaranteed field ordering for round-tripping, the Kanban plugin overwriting an indented line's block ID onto its card, the advisories array when stored text parses back differently, and the one-format plugin config constraint. It also documents mutation-relevant side effects such as on_completion=delete removing the line and its children.

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

Conciseness4/5

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

Front-loaded correctly: purpose first, then examples, then 'When to use', then parameters, then a long error catalog, then syntax/return notes. Structure is excellent, but the ~25-entry error catalog is very long for a description and duplicates ground that could live in structured error metadata; it earns its place for self-correction yet inflates the block noticeably.

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

Completeness5/5

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

No output schema exists, so the description must carry the return contract — and it does, naming every key (path, line, description, block_id, heading, subtasks, changes, advisories) and explaining which are omitted and why. Combined with the error mapping and the Obsidian signifier-capture caveat, an agent has everything needed to call this correctly and interpret the result.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning the schema does not: heading is required on kanban-plugin notes unless a parent is given, position is ignored without a heading, 'no signifier' ranks between medium and low, recurrence 'when done' bases the next occurrence on completion day, and block_id is refused on Kanban sub-tasks. These are interaction rules across parameters that the JSON schema cannot express.

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+scope: 'Create a correctly-formatted task in one call' and enumerates exactly which fields it writes (description, heading, dates, priority, block_id, checklist sub-items). It names the sibling it is not (vault_update_task) and explicitly routes a related use case (lightweight checklist items) there, so an agent can separate it from vault_list_tasks/update_task without opening a 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?

Has an explicit 'When to use' clause plus four worked call examples covering board cards, sub-tasks, and line-anchored sub-tasks. It states when not to use it for checklist items ('use vault_update_task's add_subtasks param instead') and lays out mutual-exclusivity rules (parent vs heading, block_id vs Kanban sub-task) that determine correct invocation.

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