Skip to main content
Glama

vikunja-mcp

Minimal Model Context Protocol server for a self-hosted Vikunja. It lets Claude Code (or any MCP client) read a project's tasks, create and close them and leave comments, so an agent can work through a board on its own.

Python, stdio transport, two dependencies (mcp, httpx). No install step: uvx runs it straight from this repository.

Tools

Tool

What it does

list_projects()

Projects with id, title and archived flag.

list_tasks(project?, include_done=false)

Tasks of a project (id or title). Pending only unless include_done.

get_task(task_id)

One task with its full description as plain text.

create_task(title, description?, project?)

New task; plain-text description, blank line between paragraphs.

update_task(task_id, done?, title?, description?)

Close (done=true), reopen or edit.

add_comment(task_id, text)

Comment on a task (e.g. the commit that closed it).

list_comments(task_id)

Comments in order.

project may be omitted wherever VIKUNJA_PROJECT is set.

Related MCP server: vikunja-mcp

Per-repo setup (Claude Code)

One command in the repo root writes (or completes) its .mcp.json:

uvx --from git+https://github.com/zurdi15/vikunja-mcp vikunja-mcp-init "My project" --url https://vikunja.example.net

--url can be omitted when VIKUNJA_URL is in the environment; the project defaults to the folder name. Commit the file. The URL and the default project are plain values; the token is not in the file — it is read from the environment of whoever runs the agent:

{
  "mcpServers": {
    "vikunja": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/zurdi15/vikunja-mcp", "vikunja-mcp"],
      "env": {
        "VIKUNJA_URL": "https://vikunja.example.net",
        "VIKUNJA_PROJECT": "My project",
        "VIKUNJA_TOKEN": "${VIKUNJA_TOKEN}"
      }
    }
  }
}

Claude Code expands ${VAR} in .mcp.json from the environment, so each machine only needs uv and the variable:

# Linux / macOS: in ~/.bashrc, ~/.zshrc or a file you source
export VIKUNJA_TOKEN=tk_…

# Windows (PowerShell, user scope, persistent)
[Environment]::SetEnvironmentVariable('VIKUNJA_TOKEN', 'tk_…', 'User')

The token is an API token created in Vikunja (Settings → API tokens) with read/write access to tasks and comments. Rotate it there and update the variable; nothing else changes.

The first time Claude Code opens a repo with a .mcp.json it asks whether to trust the project's MCP servers. Pin a revision with git+https://github.com/zurdi15/vikunja-mcp@v0.1.0 if you want builds to be reproducible.

Private setup (no file in the repo)

For a repo you don't want a .mcp.json in (an open-source project, say), register the same entry for yourself only, in that directory only:

uvx --from git+https://github.com/zurdi15/vikunja-mcp vikunja-mcp-init "My project" --url https://vikunja.example.net --local

It runs claude mcp add-json vikunja ... --scope local, which Claude Code keeps in ~/.claude.json under the project path. ${VIKUNJA_TOKEN} is still read from the environment, and a local entry wins over a .mcp.json one with the same name. To move an existing .mcp.json entry out of a repo:

claude mcp add-json vikunja --scope local "$(jq -c .mcpServers.vikunja .mcp.json)" && rm .mcp.json

Environment

Variable

Required

Meaning

VIKUNJA_URL

yes

Base URL of the instance, without /api/v1.

VIKUNJA_TOKEN

yes

API token. Never written to disk by this server, never logged.

VIKUNJA_PROJECT

no

Default project (id or title) for tools with an optional project.

Local development

uv run vikunja-mcp                    # starts the stdio server (waits for a client)
uv run --with mcp python scripts/smoke.py   # spawns it and calls list_projects/list_tasks

License

MIT

Available Tools

7 tools
add_commentA

Añade un comentario a una tarea (p. ej. el commit o la versión que la cerró).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
task_idYes

TDQS

A3.5/5.0
Behavior2/5

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

There are no annotations, so the description must disclose behavior on its own; it only says it adds a comment. It does not mention whether the task must exist, whether comments can be edited, what response is returned, or any side effects beyond creating the comment.

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 a useful parenthetical example; every part contributes to understanding the tool's purpose without redundancy.

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 two-parameter mutation, the description is adequate to select and minimally invoke the tool. However, with no output schema and no annotations, it omits return/error behavior and any situational constraints, leaving the agent to infer those.

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?

With 0% schema description coverage, the description provides some compensation: 'comentario' and 'tarea' map to the text and task_id parameters, and the commit/version example clarifies expected text content. It does not explicitly describe task_id or text, but their meaning is largely self-evident from the 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?

The description uses a specific verb and resource: 'Añade un comentario a una tarea' (adds a comment to a task), and the parenthetical example about commit/version adds concrete purpose. It clearly differentiates from siblings like list_comments and update_task because adding is a distinct action.

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 description implies the use case: when a comment must be attached to a task, especially to record the commit or version that closed it. However, it does not explicitly state when to prefer this over siblings such as list_comments or how it relates to create_task/update_task.

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

create_taskA

Crea una tarea en un proyecto (sin project usa VIKUNJA_PROJECT). La descripción es texto plano; los párrafos se separan con línea en blanco.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
projectNo
descriptionNo

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are present, so the description must disclose behavior. It does reveal that omitting `project` uses VIKUNJA_PROJECT and that the description is plain text with blank-line paragraph separators. However, it does not mention side effects, permissions, rate limits, or the response shape, leaving notable gaps for a write operation.

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?

The description is exactly two sentences. The first sentence states the core purpose, and the second provides two concise usage notes. There is no filler, repetition, or unnecessary detail – every phrase earns its place.

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 without an output schema, the description covers the main points: action, default project, and description formatting. It does not mention what the tool returns (e.g., created task object or ID) or error conditions, which an agent might need. The shortfall is modest but present.

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 0%, so the burden falls on the description. It adds real meaning to `project` (defaults to VIKUNJA_PROJECT when not provided) and to `description` (plain text, paragraphs separated by blank lines). `title` is self-explanatory and already marked required in the schema, so no further elaboration is needed.

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?

The description opens with 'Crea una tarea en un proyecto' (creates a task in a project), which is a specific verb+resource statement. It also explains the project default (VIKUNJA_PROJECT) when omitted, making the tool's scope clear. This distinguishes it from sibling tools like update_task or list_tasks without needing to inspect the 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?

The description gives clear context: use this tool to create a task, and the note about omitting `project` tells the agent when the default applies. It does not explicitly name alternatives or state when not to use it, but for a create operation there is little ambiguity. This fits 'clear context, no exclusions'.

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

get_taskD

Una tarea con su descripción completa (texto plano).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

TDQS

D1.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only hints at return content: 'complete description (plain text).' It does not disclose whether the operation is read-only, what happens if the task is missing, or how the response is structured.

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?

The description is very short, but brevity here is under-specification rather than effective conciseness. It lacks the core verb and any actionable instruction, so the single sentence does not fulfill the purpose of a tool description.

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?

Although the tool is simple with one required parameter, there is no output schema or annotations, and the description does not state that get_task retrieves a task by its ID. The return-format hint about plain text helps only slightly; the description is not complete enough to support confident invocation.

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

Parameters1/5

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

Schema description coverage is 0%, and the description never mentions task_id or explains how the identifier is used. The agent receives no additional meaning beyond the parameter name and type already present in the schema.

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?

The description is a noun phrase—'A task with its complete description (plain text)'—rather than a statement of what the tool does. It restates the resource implied by the name without using an action verb like 'retrieves' or 'gets', so the purpose is only inferable from the tool name and siblings.

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 get_task versus list_tasks or other sibling tools. No alternatives, conditions, exclusions, or context are provided, so selecting this tool correctly depends entirely on reading the name.

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

list_commentsB

Comentarios de una tarea, en orden.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

There are no annotations, so the description carries the behavioral disclosure burden. It mentions that comments are returned 'en orden' (in order), but does not state whether this is read-only, safe to invoke, or what the ordering criterion is. No side effects, permissions, or pagination behavior are 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?

The description is a single short sentence with no filler or redundant information. It is front-loaded with the core purpose and ordering note, making it efficient for an agent to parse.

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?

The tool is simple (one required parameter, output schema available), so an agent can likely call it correctly. However, the description omits any usage guidance, behavioral safety context, and clarification of what 'en orden' means, leaving some important gaps despite the low complexity.

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?

With 0% schema description coverage and one required parameter, the description helps by linking task_id to 'una tarea' (a task), clarifying that the parameter selects the parent task. It does not add constraints, format details, or examples, but for a single integer parameter the semantic gap is partially bridged.

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 identifies the resource and scope: comments of a task, in order. It is clear enough to distinguish from siblings like list_tasks or add_comment, though it relies on the tool name for the verb rather than stating 'list' explicitly.

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?

The description gives no explicit guidance on when to use this tool versus alternatives like add_comment or get_task, and no exclusions are stated. The intended usage is only implied by the tool name and sibling list.

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

list_projectsA

Lista los proyectos de Vikunja (id, título, archivado).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/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 of indicating behavior. 'Lista' clearly conveys a read-only enumeration, and the parenthetical specifies the fields returned. It does not mention pagination or limits, but the empty parameter list and presence of an output schema make the behavior sufficiently clear.

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?

The description is a single, well-structured sentence that front-loads the action and resource, then lists the output fields. Every element is informative and there is no redundancy.

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 parameterless list tool with an output schema, the description is complete: it identifies the resource, the operation, and the relevant output fields. Nothing needed to invoke the tool correctly is missing.

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?

The tool has zero parameters, so the input schema is complete and there is nothing for the description to add about parameter semantics. The baseline of 4 for a zero-parameter tool applies.

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?

The description uses a specific verb ('Lista') with a clear resource ('proyectos de Vikunja') and names the returned fields (id, título, archivado). It unambiguously distinguishes this tool from sibling list_tasks by naming the resource explicitly.

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?

The description states what the tool does but gives no guidance on when to use it versus alternatives like list_tasks. There are no explicit context cues, prerequisites, or exclusions, though the resource name makes the intended use somewhat inferable.

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

list_tasksA

Tareas de un proyecto (id o título; sin project usa VIKUNJA_PROJECT). Por defecto solo las pendientes, ordenadas por id.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
include_doneNo

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It does reveal important defaults: only pending tasks are shown by default and results are ordered by id. However, it does not mention return format, pagination, side effects, or the explicit effect of include_done beyond the implied default.

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 compact sentences deliver all essential information with no filler. The most important scoping detail (project selection) is front-loaded, followed by default behavior and ordering.

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 list tool with two optional parameters, the description is adequate. However, with no output schema and no annotations, it would benefit from stating the return shape, pagination behavior, or a clearer explanation of include_done=true. It is functional but not fully self-sufficient.

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 0%, so the description must compensate. It does: it explains that 'project' accepts an id or title and falls back to VIKUNJA_PROJECT, and 'Por defecto solo las pendientes' clarifies the default behavior tied to include_done. It does not explicitly name include_done, so a small gap remains.

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?

The description clearly states the action and resource: 'Tareas de un proyecto' (tasks of a project). It adds valuable specifics: project can be given by id or title, defaults to VIKUNJA_PROJECT, and results are only pending tasks ordered by id. This distinguishes it from siblings like list_projects or get_task by scope and return set.

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?

It gives clear context for when to use the tool: to retrieve tasks for a project, identified by id or title, with a fallback to VIKUNJA_PROJECT when absent. It does not explicitly name alternatives or exclusion conditions, so it stops short of full routing guidance.

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

update_taskA

Actualiza una tarea: done=true la cierra (false la reabre); título y descripción opcionales. Los campos no indicados se conservan.

ParametersJSON Schema
NameRequiredDescriptionDefault
doneNo
titleNo
task_idYes
descriptionNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that `done=true` closes a task and `false` reopens it, and that unspecified fields are preserved. This adds significant context beyond the raw schema. However, it omits details about error handling or the response format, which are minor for a simple mutation tool.

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?

The description is a single, concise sentence that front-loads the core action ('Actualiza una tarea') followed by the essential parameter behavior. Every word earns its place; there is no fluff or redundancy.

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 tool with 4 parameters and no output schema, the description covers the key behavioral aspects needed to call it correctly: the `done` toggle, optional fields, and preservation semantics. It does not address potential errors or return values, but given the simplicity of an update operation, this is acceptable and close to complete.

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 0%, so the description must compensate. It does: it explains the exact semantics of `done`, notes that `title` and `description` are optional, and clarifies the behavior of unset fields (preserved). This goes beyond the bare schema, which only lists types and defaults without any descriptive text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Actualiza una tarea' (Updates a task), a specific verb+resource combination that clearly states the tool's function. It further clarifies the `done` parameter's special closing/reopening semantics, making the purpose unambiguous and distinguishing it from sibling tools like `create_task`, `get_task`, 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 Guidelines3/5

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

The description implies usage—use this to modify an existing task—but provides no explicit guidance on when to choose this over alternatives like `create_task` (for new tasks) or `get_task` (for reading). There is no mention of exclusions or when not to use it.

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. 7 tool updatesv0.1.0
    • First observedadd_comment
    • First observedcreate_task
    • First observedget_task
    • First observedlist_comments
    • First observedlist_projects
    • First observedlist_tasks
    • First observedupdate_task

TDQS

A3.5/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource-action combination: projects vs tasks vs comments, with list/get/create/update/comment operations clearly separated. There is no overlap or ambiguity between tools like list_tasks and get_task, which are standard list-detail pairs.

Naming Consistency5/5

All tool names follow the consistent snake_case verb_noun pattern (list_, get_, create_, update_, add_). The verbs are simple and predictable, making the API easy to learn and navigate.

Tool Count5/5

Seven tools is well-scoped for a project/task management integration. Each tool covers a necessary operation without redundancy or bloat, fitting comfortably in the ideal 3-15 tool range.

Completeness4/5

Core task lifecycle is covered well: create, get, update (including done state), plus comments (add/list). The main gap is the lack of a delete task tool, and projects are only listed, not created or updated, but these are minor for typical task management use.

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
    48 npm
    2
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Connect your AI assistant to Vikunja, the open-source task manager. This MCP server lets you manage projects, tasks, kanban boards, and more—just by asking.
    31
    49 npm
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables to interact with Vikunja task management through its REST API, supporting projects, tasks, comments, labels, assignees, and relations with field preservation.
    48 npm
    MIT