Skip to main content
Glama
Vault Cortex Obsidian MCP Server

Vault Cortex Obsidian MCP Server

Create Task

vault_create_task

Create a correctly formatted task in an Obsidian note or Kanban board in one call, with heading, dates, priority, block ID, and optional checklist 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, with its created date (➕) set to today; set in_progress later with vault_update_task. Override format only at the user's request. A retried call with no block_id (a Kanban sub-task) creates it again, so after a timeout or lost response, re-read the note before retrying.

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 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. 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: 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.

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

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

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" — pass a vault-relative path with no dot-prefixed part

  • "heading required for Kanban boards" — pass heading with the target lane

  • "heading "X" not found; available: ..." — the message 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 outside 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" / "no checkbox symbol for status ..." — in the Tasks plugin's status settings, the parent's checkbox character (c) is typed NON_TASK, or todo has no symbol and the default [ ] character has another type; the user changes that character's type or adds a todo symbol there, then restarts the server

  • "parentBlockId and parentLine are mutually exclusive" / "parent and heading are mutually exclusive" — drop one

  • "blockId ... already exists in this note" / "blockId ... contains invalid characters" — pick a block_id no other line in the note ends in; the invalid-characters message names the allowed characters

  • "blockId is required" — pass block_id

  • "blockId is not allowed on a sub-task on a Kanban board" / "subtask ... ends in a block ID" — the message names what to drop

  • "description is empty" / "subtasks cannot contain an empty item" / "description must be a single line" / "subtasks 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

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

  • "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 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.

Returns: JSON { path, line, description, block_id, heading, subtasks, changes, advisories } — line is the new task's 1-based line number in the file; 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); 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.

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>",
      "description": "<description>"
    },
    "name": "vault_create_task"
  }
}

Input 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. 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. Changed1 schema field changedv0.55.4
    • changedInput schema / properties / depends_on / description
      Previous value: -"Tasks plugin ⛔ dependency IDs (🆔 values of other tasks), not checked against existing tasks. Non-empty; omit when there are no dependencies."New value: +"Tasks plugin ⛔ dependency IDs (🆔 values of other tasks), not checked against existing tasks. Omit when there are no dependencies."
  2. Changed1 schema field changedv0.54.16
    • addedInput schema / additionalProperties
      Added value: +false
  3. 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"
      +]
  4. 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."
  5. 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."
  6. 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."
  7. 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"
  8. 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"
      +}
  9. 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"
      +}
  10. Addedv0.41.2

TDQS

A4.7/5.0
Behavior4/5

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

Goes well beyond the annotations: it discloses that every task is forced to todo status with the created date set to today, and it explains the non-idempotent retry hazard ("A retried call with no block_id ... creates it again, so ... re-read the note before retrying"), which directly explains the idempotentHint: false. It also enumerates error conditions, though it does not cover permission/concurrency guarantees beyond the single "concurrent write in progress" message.

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 action and four targeted examples that each demonstrate a distinct placement mode, then ordered into usage, params, errors, syntax, returns. It is longer than most definitions because of the exhaustive error catalogue, which is useful but dense and pushes the total length past what the caller needs at invocation time.

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 17-parameter mutation tool with no output schema, it covers everything an agent needs: placement modes, mutual exclusions, the forced todo/created-date behavior, retry safety, error recovery paths naming the corrective sibling tool, and a full prose description of the JSON return shape including line, block_id, changes, and advisories.

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%, yet the description still adds cross-parameter rules the schema cannot express: heading required on Kanban boards unless a parent is given, parent_block_id/parent_line mutually exclusive with each other and with heading, block_id required except on a Kanban sub-task where it is refused, and position being ignored without a heading. The recurrence "when done" semantics and the dateless-copy behavior are also clarified.

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 and resource ("Create a correctly-formatted task") and immediately enumerates the supported payload (description, heading, dates, priority, block_id, sub-items). It also distinguishes itself from vault_update_task both for state transitions ("set in_progress later with vault_update_task") and for the lightweight checklist case.

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

Usage Guidelines5/5

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

A dedicated "When to use" block names the create-a-card scenario and routes the alternative case to a sibling ("For lightweight checklist items under an existing card (no metadata), use vault_update_task's add_subtasks param instead"). It also states when to override the default format ("Override format only at the user's request") and gives a when-not-to-retry rule.

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