Vikunja MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Vikunja MCP Servercreate a task 'Review PR' in my Work project and label it urgent"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@fswap/mcp-vikunja
An MCP server for Vikunja that lets Claude Desktop, Claude Code, Cursor and other MCP clients list, create, update and complete your tasks.
Runs locally over stdio. No install step — clients launch it with npx.
Quick start
Create an API token in Vikunja under Settings → API Tokens (scope it to projects, tasks and labels).
Run the interactive setup once:
npx -y @fswap/mcp-vikunja@latest setupIt asks for your Vikunja URL and token, verifies them against
/api/v1/user, lets you pick a default project, and stores the answers in your OS config directory (mode0600).Add the server to your client. Every value asked in
setupcan be skipped with Enter; anything you skip goes into theenvblock shown below instead.setup --printshows these snippets again at any time.Claude Desktop (
claude_desktop_config.json) and Cursor (~/.cursor/mcp.jsonor<project>/.cursor/mcp.json):{ "mcpServers": { "vikunja": { "command": "npx", "args": ["-y", "@fswap/mcp-vikunja@latest"] } } }Codex (
~/.codex/config.toml):[mcp_servers.vikunja] command = "npx" args = ["-y", "@fswap/mcp-vikunja@latest"]Claude Code:
claude mcp add vikunja -- npx -y @fswap/mcp-vikunja@latest
Without setup (environment variables)
Environment variables take precedence over the config file, so you can skip setup entirely (or skip individual values in it and set them here):
{
"mcpServers": {
"vikunja": {
"command": "npx",
"args": ["-y", "@fswap/mcp-vikunja@latest"],
"env": {
"VIKUNJA_URL": "https://try.vikunja.io",
"VIKUNJA_API_TOKEN": "tk_..."
}
}
}
}Codex equivalent:
[mcp_servers.vikunja]
command = "npx"
args = ["-y", "@fswap/mcp-vikunja@latest"]
[mcp_servers.vikunja.env]
VIKUNJA_URL = "https://try.vikunja.io"
VIKUNJA_API_TOKEN = "tk_..."Variable | Purpose |
| Vikunja base URL (with or without |
| API token or login JWT |
|
|
| Project used by |
Related MCP server: Vikunja MCP Server
Tools
Tool | Method + endpoint | Notes |
|
| id, title, description, parent |
|
| |
|
| optional parent project |
|
| open tasks by default; |
|
| full task incl. description, labels, assignees |
|
| title, description, dates, priority, labels |
|
| merges your changes onto the current task; |
|
|
|
|
| label ids for create/update |
|
| |
|
| only when delete is allowed (setup answer or |
Every task and project includes a url to its page in the Vikunja web UI (taken from /info frontend_url). Vikunja's zero date (0001-01-01T00:00:00Z) is normalised to null in every response. API errors are returned to the model as isError results rather than crashing the server.
Development
TypeScript source in src/, bundled to dist/ with tsdown. Only dist/ is published.
npm install
npm run build # tsdown → dist/index.js
npm run lint # eslint (typescript-eslint)
npm run typecheck # tsc --noEmit
npm test # builds, then spawns the server and checks the tool list
npm run check # all of the above (also runs on prepublishOnly)
VIKUNJA_URL=... VIKUNJA_API_TOKEN=... npm run inspect # MCP Inspector UI against dist/Never write to stdout from server code — it is the protocol channel. Use console.error.
Reset
npx -y @fswap/mcp-vikunja@latest setup --resetLicense
MIT
Available Tools
10 toolscomplete_taskComplete taskB
Mark a task as done (or reopen it with done=false).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id | |
| done | No | false to reopen a completed task |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the bidirectional behavior (done=false reopens), but says nothing about side effects (e.g. timestamps), idempotency, what happens if the task is already in the target state, or required permissions for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the primary action and folds the inverse case into a parenthetical. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter toggle tool with no output schema, the description covers the essential behavior. It falls short only on edge-case behavior and permissions, which a mutation tool would ideally mention, but the core is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both id and done, including the 'false to reopen' semantics. The description's parenthetical essentially restates the schema's own done description, adding no new format or constraint detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Mark a task as done') and even covers the inverse operation ('reopen it with done=false'), so the agent knows both directions of the toggle. It does not differentiate itself from the sibling update_task, which an agent could plausibly reach for to change task state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this over update_task, nor any prerequisites or conditions. The only usage-adjacent signal is the parenthetical reopen case, which is about the parameter, not about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_labelCreate labelC
Create a new label.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| hexColor | No | Colour as 6 hex digits without '#', e.g. e8e8e8 | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a mutation, but says nothing about required permissions, whether titles must be unique, whether the label is global or scoped to a project/task, or what happens on duplicate input. For a write operation with zero annotation coverage this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence is structurally clean and front-loaded, but here brevity reflects under-specification rather than efficient communication. Nothing beyond the tool name is conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no annotations, no output schema, and only a third of parameters documented in the schema, the description should explain scope, permissions, and return behavior. It covers none of these, leaving the agent unable to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (hexColor is documented, title and description are not). The description adds no parameter meaning at all, so it fails to compensate for the undocumented title (required, non-empty) and description fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Create a new label." is a near-verbatim restatement of the tool name (create_label) and title (Create label). It states a verb and resource but adds no scope, no distinguishing detail, and no differentiation from siblings such as list_labels or create_task. This is tautology rather than a genuinely informative purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, what prerequisites apply (e.g. whether a project or task must exist first), or how it relates to siblings like list_labels. The agent is left to infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate projectB
Create a new Vikunja project. Optionally nest it under a parent project.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Project title | |
| description | No | Project description | |
| parentProjectId | No | Parent project id for nesting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden for a mutation tool. It says nothing about required permissions, whether the parent project must exist or be accessible, what happens on duplicate titles, or what is returned after creation. Only the nesting behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the core action front-loaded and the optional behavior second. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter tool with complete schema coverage and no output schema, the description is minimally adequate. However, as a mutation with no annotations, it leaves auth requirements, parent-project validity conditions, and post-creation behavior unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents title, description, and parentProjectId. The description's mention of nesting adds only marginal framing over the schema's 'Parent project id for nesting', which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new Vikunja project'), which cleanly separates it from siblings like create_task and create_label that share the verb but target other resources. It does not explicitly name or contrast with a sibling doing the same thing, but the resource specificity is enough for an agent to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Optionally nest it under a parent project' implies when the parentProjectId path applies, but there is no explicit when-to-use guidance, no prerequisites, and no stated alternatives or exclusions. Usage is left to inference from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskCreate taskB
Create a task in a project. Use list_projects to find the projectId and list_labels for label ids.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Task title | |
| dueDate | No | RFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z | |
| endDate | No | RFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z | |
| labelIds | No | Label ids to attach | |
| priority | No | 0 = unset, 1 = low, 2 = medium, 3 = high, 4 = urgent, 5 = DO NOW | |
| projectId | Yes | Project id | |
| startDate | No | RFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z | |
| description | No | Task description (markdown/HTML accepted by Vikunja) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden for a write tool, and it says almost nothing: no permissions required, no note on whether the created task is returned or how its id is obtained, no side effects such as notifications or watchers, no error behavior for invalid projectId. The only behavioral hint is the lookup routing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the lookup guidance. No filler. It is arguably too terse for an 8-parameter write tool, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 8 parameters, no annotations, and no output schema, the description should at least indicate what happens on success and whether there are permission or validation constraints. With no output schema, the return value (e.g., the new task id) is undocumented anywhere in the definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so titles, dates, priority scale, and label/project ids are all documented in the schema itself, making 3 the baseline. The description adds only the pointer that label ids come from list_labels, which is marginally useful but not compensating for anything missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a task in a project'), which is unambiguous. It does not, however, differentiate itself from siblings like create_project or create_label beyond the resource name, which is enough here but not exceptional.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete prerequisite routing: use list_projects to find the projectId and list_labels for label ids. That is real when/how guidance an agent can act on. It does not state any when-not conditions or alternatives to create_task itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet projectC
Get one Vikunja project by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose that this is a non-mutating read, what happens on a missing or unauthorized id (error vs. empty), or anything about permissions. For a mutation-free lookup the risk is low, but the disclosure gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the resource and keying parameter come first. It is efficient but arguably under-specified rather than truly concise, which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema and no annotations, the description gives the minimum needed to invoke it correctly. It could usefully note that it returns a single project object and how missing ids behave, but nothing essential is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter is documented as 'Project id' in the schema, so the description correctly need not repeat it. It adds no format or range meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('one Vikunja project by id'), which cleanly distinguishes it from list_projects and the task/label siblings. It stops short of 5 only because it adds no scoping detail (e.g., whether archived/deleted projects are returned).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance. An agent can infer it is the single-item counterpart to list_projects, but the description never says so, nor does it mention prerequisites or what to do if the id is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet taskB
Get a single task with full details: description, dates, priority, labels and assignees.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It implies a read operation and enumerates the returned fields (description, dates, priority, labels, assignees), which is valuable since there is no output schema. However, it omits any mention of permissions, error behavior, or whether the task must exist, so it is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence that front-loads the core purpose and then lists key return fields. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and annotations, the description usefully lists the primary returned fields. It could additionally state that the task must exist or describe error conditions, but for a simple get-by-id tool it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'id' has full schema description coverage ('Task id'). The description adds no meaning beyond the schema—it does not explain ID format, source, or edge cases. With schema coverage at 100%, the baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('a single task'), and the word 'single' implicitly distinguishes it from list_tasks. It does not explicitly name the sibling it contrasts with, so a 4 is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus list_tasks, get_project, or update_task. The description only states what it returns, leaving usage context entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_labelsList labelsB
List labels available to the user, with ids for use in create_task / update_task.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | Filter labels by title | |
| perPage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it is thin. It hints at return content ('with ids') but says nothing about pagination behavior despite page/perPage parameters, nor about permissions, ordering, or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the verb and the practical reason for calling it appear immediately. Nothing redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema, the description covers the essential purpose and the key return field (ids). However, with three parameters at 33% schema coverage and no annotations, pagination and filtering behavior are left undisclosed, which an agent invoking it with search or paging would need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only 'search' is documented) and the description compensates for none of it. It never mentions page, perPage, or the search filter, so an agent must infer pagination and filtering entirely from bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List labels') and adds scope ('available to the user') plus the reason the output matters (ids for create_task / update_task). This separates it from the write-oriented sibling create_label, though it does not explicitly contrast with list_projects or list_tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'with ids for use in create_task / update_task' makes the calling context clear: fetch this before populating label ids on tasks. No explicit when-not-to-use or named alternative is given, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsB
List Vikunja projects the user can access. Returns id, title, description, identifier and parent project. Use the id with list_tasks or create_task.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | Filter projects by title | |
| perPage | No | ||
| includeArchived | No | Include archived projects |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the return fields (id, title, description, identifier, parent) and implies a read-only, permission-scoped operation, but is silent on pagination behavior and on the fact that archived projects are excluded by default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler, with the core purpose front-loaded ahead of the return-shape and follow-up-usage details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description helpfully enumerates the returned fields, which covers the main gap. Still missing for a 4-param list tool are pagination semantics and the archived-exclusion default, and no annotations back-fill them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: search and includeArchived are documented, while page and perPage are not, though their types and defaults make them conventional. The description adds no parameter meaning at all, so it neither compensates for nor worsens the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List Vikunja projects') with the scoping condition 'the user can access', which an agent can distinguish from the singular get_project. It does not explicitly name a sibling to contrast with, so it falls just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Use the id with list_tasks or create_task' gives a downstream hand-off hint, but there is no guidance on when to use this versus get_project or when listing is preferred over fetching a single project. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList tasksA
List tasks, across all projects or within one project. Returns id, title, done, due date, priority, label names, assignee usernames and a web url (no descriptions — use get_task). By default only open tasks are returned. Set assignedToMe=true for the current user's tasks. For advanced queries pass a raw Vikunja filter string such as done = false && due_date < now+7d, labels in 3, 5 or assignees in alice.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| filter | No | Raw Vikunja filter expression; overrides includeDone. Fields: done, due_date, priority, labels, assignees, project | |
| search | No | Full-text search in title/description | |
| sortBy | No | due_date | |
| orderBy | No | asc | |
| perPage | No | ||
| projectId | No | Limit to this project (omit for all projects) | |
| includeDone | No | Include completed tasks | |
| assignedToMe | No | Only tasks assigned to the authenticated user |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does reasonably: it discloses the default open-only filter, the exact returned field set (and what is omitted), and the override semantics of `filter` over includeDone. It is silent on pagination behavior and rate limits, which leaves some behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three information-dense sentences with no filler: scope first, then return shape and the get_task handoff, then the default behavior and both query shortcuts. Every clause carries actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-annotation, no-output-schema list tool, the description covers the essentials and even enumerates the return fields, which substitutes for a missing output schema. Pagination semantics across pages are the one omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, and the description fills much of the gap: it explains both boolean flags, and gives concrete Vikunja filter syntax examples (`done = false && due_date < now+7d`, `labels in 3, 5`) that go well beyond the schema's one-line field list. page, perPage, sortBy, orderBy and search are left to the schema, which documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('across all projects or within one project'), and explicitly carves out what it does not return, routing agents to the sibling get_task for descriptions. An agent can distinguish it from get_task and the mutation siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: default open-only behavior, assignedToMe=true for the current user, and raw filter strings for advanced queries with worked examples. It names get_task as the alternative for full task detail, though it does not state when a caller should prefer search or when filters should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskUpdate taskA
Update fields of an existing task. Only the fields you pass are changed. To clear a date pass null. labelIds, when given, REPLACES the task's labels. Use complete_task to just mark a task done.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id | |
| done | No | ||
| title | No | ||
| dueDate | No | ||
| endDate | No | ||
| labelIds | No | Replace labels with these ids | |
| priority | No | 0 = unset, 1 = low, 2 = medium, 3 = high, 4 = urgent, 5 = DO NOW | |
| projectId | No | Move the task to another project | |
| startDate | No | ||
| description | No | ||
| percentDone | No | Progress as a fraction 0–1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the highest-risk behaviors: partial-update semantics (unspecified fields are preserved) and the destructive replace semantics of labelIds. It does not cover permissions, reversibility, error behavior, or the response shape, but the mutation-critical traits are front-loaded and unambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the core semantic (only passed fields change) is placed first. Each remaining sentence addresses a distinct footgun: null clearing, label replacement, sibling routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no annotations and no output schema, the description covers the behaviors most likely to cause a wrong call. What is missing is error/permission behavior and what the call returns, which matters more here than for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 45%, with done, title, and description carrying no inline docs at all. The description compensates meaningfully by explaining the null-clears-a-date convention and that labelIds replaces the whole label set, but it adds nothing about done/title/description semantics beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (existing task) with the scope qualifier 'fields of an existing task', and explicitly distinguishes itself from the sibling complete_task. An agent can route between update_task and complete_task without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance: only passed fields change, pass null to clear a date, labelIds replaces rather than appends, and directs to complete_task for the mark-done-only case. The alternative and the conditions that select it are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.6- First observed
complete_task - First observed
create_label - First observed
create_project - First observed
create_task - First observed
get_project - First observed
get_task - First observed
list_labels - First observed
list_projects - First observed
list_tasks - First observed
update_task
TDQS
Scored across 10 tools
Tools are clearly separated by resource (projects, tasks, labels) and action (list, get, create, update, complete). The only minor overlap is update_task vs complete_task for marking a task done, but the description explicitly redirects that use case.
All tool names follow a consistent snake_case verb_noun pattern (list_projects, get_task, create_label, etc.). There are no deviations or mixed conventions.
With 10 tools, the set is well within the ideal 3-15 range and each tool maps to a distinct operation. It is focused without unnecessary redundancy.
Task management has create/get/update/complete but lacks delete_task. Projects and labels lack update and delete operations entirely, which are notable gaps for a complete task management surface.
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Share one project context across ChatGPT, Claude, Telegram and any MCP client.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with Vikunja task management instances through natural language. Supports comprehensive project and task operations including CRUD, assignments, labels, comments, relations, and attachments.3318 npm1MIT
- AlicenseNot gradedqualityCmaintenanceConnects Claude to self-hosted Vikunja instances for conversational task and project management. Supports CRUD operations on projects and tasks, plus labels, comments, weekly reviews, calendar feeds, and task relations.18 npm-
- FlicenseAqualityBmaintenanceAn MCP server that exposes tasks in a Vikunja instance as typed tools for list, get, add, update, complete, and reopen operations, enabling natural language task management via Claude.7-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants like Claude to manage Vikunja tasks – view, add, complete, edit, and delete tasks through natural language commands via Vikunja's REST API.MIT