Skip to main content
Glama
sunblob
by sunblob

@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

  1. Create an API token in Vikunja under Settings → API Tokens (scope it to projects, tasks and labels).

  2. Run the interactive setup once:

    npx -y @fswap/mcp-vikunja@latest setup

    It 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 (mode 0600).

  3. Add the server to your client. Every value asked in setup can be skipped with Enter; anything you skip goes into the env block shown below instead. setup --print shows these snippets again at any time.

    Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json or <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_URL

Vikunja base URL (with or without /api/v1)

VIKUNJA_API_TOKEN

API token or login JWT

VIKUNJA_ALLOW_DELETE

true to expose delete_task

VIKUNJA_DEFAULT_PROJECT_ID

Project used by create_task when projectId is omitted

Related MCP server: Vikunja MCP Server

Tools

Tool

Method + endpoint

Notes

list_projects

GET /projects

id, title, description, parent

get_project

GET /projects/{id}

create_project

PUT /projects

optional parent project

list_tasks

GET /tasks or GET /projects/{id}/tasks

open tasks by default; assignedToMe, filter, sortBy, pagination

get_task

GET /tasks/{id}

full task incl. description, labels, assignees

create_task

PUT /projects/{id}/tasks

title, description, dates, priority, labels

update_task

POST /tasks/{id}

merges your changes onto the current task; labelIds replaces labels

complete_task

POST /tasks/{id} with done: true

done=false reopens

list_labels

GET /labels

label ids for create/update

create_label

PUT /labels

delete_task

DELETE /tasks/{id}

only when delete is allowed (setup answer or VIKUNJA_ALLOW_DELETE=true)

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 --reset

License

MIT

Available Tools

10 tools
complete_taskComplete taskB

Mark a task as done (or reopen it with done=false).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask id
doneNofalse to reopen a completed task

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
hexColorNoColour as 6 hex digits without '#', e.g. e8e8e8
descriptionNo

TDQS

C2/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose2/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesProject title
descriptionNoProject description
parentProjectIdNoParent project id for nesting

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTask title
dueDateNoRFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z
endDateNoRFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z
labelIdsNoLabel ids to attach
priorityNo0 = unset, 1 = low, 2 = medium, 3 = high, 4 = urgent, 5 = DO NOW
projectIdYesProject id
startDateNoRFC 3339 timestamp, e.g. 2026-09-15T17:00:00Z
descriptionNoTask description (markdown/HTML accepted by Vikunja)

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProject id

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask id

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
searchNoFilter labels by title
perPageNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
searchNoFilter projects by title
perPageNo
includeArchivedNoInclude archived projects

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
filterNoRaw Vikunja filter expression; overrides includeDone. Fields: done, due_date, priority, labels, assignees, project
searchNoFull-text search in title/description
sortByNodue_date
orderByNoasc
perPageNo
projectIdNoLimit to this project (omit for all projects)
includeDoneNoInclude completed tasks
assignedToMeNoOnly tasks assigned to the authenticated user

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask id
doneNo
titleNo
dueDateNo
endDateNo
labelIdsNoReplace labels with these ids
priorityNo0 = unset, 1 = low, 2 = medium, 3 = high, 4 = urgent, 5 = DO NOW
projectIdNoMove the task to another project
startDateNo
descriptionNo
percentDoneNoProgress as a fraction 0–1

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 10 tool updatesv0.1.6
    • First observedcomplete_task
    • First observedcreate_label
    • First observedcreate_project
    • First observedcreate_task
    • First observedget_project
    • First observedget_task
    • First observedlist_labels
    • First observedlist_projects
    • First observedlist_tasks
    • First observedupdate_task

TDQS

B3.2/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables interaction with Vikunja task management instances through natural language. Supports comprehensive project and task operations including CRUD, assignments, labels, comments, relations, and attachments.
    33
    18 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects 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
    -
  • F
    license
    A
    quality
    B
    maintenance
    An 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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