Vikunja MCP Server
Enables interaction with Vikunja task management instances through natural language. Supports comprehensive project and task operations including CRUD, assignments, labels, comments, relations, and attachments.
README
Vikunja MCP Server
A Model Context Protocol server for managing Vikunja projects and tasks.
Quick Start
Run directly with npx (no installation required):
npx vikunja-mcp --token YOUR_VIKUNJA_TOKEN
With custom Vikunja URL:
npx vikunja-mcp --url https://your-vikunja.com/api/v1 --token YOUR_TOKEN
Or using environment variables:
export VIKUNJA_TOKEN=your_token
export VIKUNJA_URL=https://your-vikunja.com/api/v1
npx vikunja-mcp
Features
- Full CRUD operations for projects
- Full CRUD operations for tasks
- Task comments management
- Task relations (subtasks, blocking, etc.)
- Task attachments listing
- Task assignees management
- Task labels management
- Project hierarchy (epics) management
Available Tools
Projects
| Tool | Description |
|---|---|
list_projects |
List all projects the user has access to |
get_project |
Get a specific project by ID |
create_project |
Create a new project |
update_project |
Update an existing project |
delete_project |
Delete a project by ID |
list_project_children |
List child projects under a project |
move_project |
Move project to different parent/position |
Tasks
| Tool | Description |
|---|---|
list_tasks |
List all tasks across all projects |
list_project_tasks |
List all tasks for a specific project |
get_task |
Get a specific task by ID |
create_task |
Create a new task in a project |
update_task |
Update an existing task |
delete_task |
Delete a task by ID |
Task State & Movement
| Tool | Description |
|---|---|
complete_task |
Mark a task as done |
reopen_task |
Reopen a completed task |
move_task |
Move task to different project/position |
Assignees
| Tool | Description |
|---|---|
add_task_assignee |
Add a user as assignee to a task |
remove_task_assignee |
Remove assignee from a task |
list_task_assignees |
List all assignees for a task |
Labels
| Tool | Description |
|---|---|
add_task_label |
Add a label to a task |
remove_task_label |
Remove a label from a task |
list_task_labels |
List all labels on a task |
list_labels |
List all available labels (globally) |
Comments
| Tool | Description |
|---|---|
list_comments |
List all comments for a task |
create_comment |
Add a comment to a task |
update_comment |
Update a comment |
delete_comment |
Delete a comment |
Relations
| Tool | Description |
|---|---|
create_relation |
Create a relation between two tasks |
delete_relation |
Delete a relation between tasks |
list_task_relations |
List all relations for a task |
Subtasks
| Tool | Description |
|---|---|
create_subtask |
Create a subtask linked to parent task |
list_subtasks |
List all subtasks for a task |
Attachments
| Tool | Description |
|---|---|
list_task_attachments |
List all attachments for a task |
delete_task_attachment |
Delete an attachment from a task |
See below for complete parameter documentation for all tools.
Tool Reference
Parameter Types
- string: Text value
- number: Numeric value (integer)
- boolean: true/false value
- required: This parameter must be provided
- optional: This parameter can be omitted
Note: All ID parameters (e.g.,
projectId,taskId) accept both number and string values. The MCP server usesz.coerce.number()to automatically convert string IDs (like "123") to numbers. This means you can pass either123or"123"for any ID parameter. See Using String IDs for examples.
Projects
list_projects
List all projects the user has access to.
- Parameters: None required
- Optional:
page(number): Page number for paginationper_page(number): Number of items per page (default: 25)
get_project
Get a specific project by ID.
- Parameters:
projectId(number, required): The project ID
create_project
Create a new project.
- Parameters:
title(string, required): The project title
- Optional:
description(string): Project descriptionhex_color(string): Hex color code (e.g., "#FF5733")identifier(string): Unique identifier for the projectparent_project_id(number): ID of parent project (for epics/hierarchy)is_archived(boolean): Whether the project is archived
update_project
Update an existing project.
- Parameters:
projectId(number, required): The project ID
- Optional:
title(string): New titledescription(string): New descriptionhex_color(string): New hex color codeidentifier(string): New identifierparent_project_id(number): New parent project IDis_archived(boolean): Archive status
delete_project
Delete a project by ID.
- Parameters:
projectId(number, required): The project ID
list_project_children
List child projects under a project.
- Parameters:
projectId(number, required): The parent project ID
move_project
Move project to different parent or position.
- Parameters:
projectId(number, required): The project ID
- Optional:
parent_project_id(number): New parent project ID (null to remove from parent)position(number): New position in the parent project
Tasks
list_tasks
List all tasks across all projects.
- Parameters: None required
- Optional:
page(number): Page number for paginationper_page(number): Number of items per pagestatus(string): Filter by status (open, done, done_lte, done_gte)priority(number): Filter by prioritydue_date(string): Filter by due datelabel(string): Filter by label
list_project_tasks
List all tasks for a specific project.
- Parameters:
projectId(number, required): The project ID
- Optional:
page(number): Page number for paginationper_page(number): Number of items per page
get_task
Get a specific task by ID.
- Parameters:
taskId(number, required): The task ID
create_task
Create a new task in a project.
- Parameters:
projectId(number, required): The project ID
- Required:
task(object): The task objecttitle(string, required): The task title
- Optional:
task(object): The task objectdescription(string): Task descriptiondone(boolean): Whether task is completeddue_date(string): Due date (ISO 8601 format)start_date(string): Start dateend_date(string): End datehex_color(string): Task colorpriority(number): Priority (1-5, where 5 is highest)percent_done(number): Progress (0-100)repeat_after(number): Repeat after X minutesrepeat_mode(number): Repeat mode (0=relative, 1=absolute)
update_task
Update an existing task.
- Parameters:
taskId(number, required): The task IDtaskUpdates(object, required): The task fields to update
- Optional:
taskUpdates(object):title(string): New titledescription(string): New descriptiondone(boolean): Completion statusdue_date(string): New due datestart_date(string): New start dateend_date(string): New end datehex_color(string): New colorpriority(number): New prioritypercent_done(number): Progress (0-100)repeat_after(number): New repeat intervalrepeat_mode(number): Repeat mode (0=relative, 1=absolute)
delete_task
Delete a task by ID.
- Parameters:
taskId(number, required): The task ID
Task State & Movement
complete_task
Mark a task as done.
- Parameters:
taskId(number, required): The task ID
reopen_task
Reopen a completed task.
- Parameters:
taskId(number, required): The task ID
move_task
Move task to different project or position.
- Parameters:
taskId(number, required): The task IDproject_id(number, required): Target project ID
- Optional:
position(number): New position
Assignees
add_task_assignee
Add a user as assignee to a task.
- Parameters:
taskId(number, required): The task IDuserId(number, required): The user ID to add
remove_task_assignee
Remove assignee from a task.
- Parameters:
taskId(number, required): The task IDuserId(number, required): The user ID to remove
list_task_assignees
List all assignees for a task.
- Parameters:
taskId(number, required): The task ID
Labels
add_task_label
Add a label to a task.
- Parameters:
taskId(number, required): The task IDlabel_id(number, required): The label ID to add
remove_task_label
Remove a label from a task.
- Parameters:
taskId(number, required): The task IDlabel_id(number, required): The label ID to remove
list_task_labels
List all labels on a task.
- Parameters:
taskId(number, required): The task ID
list_labels
List all available labels (globally).
- Parameters: None required
- Optional:
project_id(number): Filter by project IDpage(number): Page numberper_page(number): Items per page
Comments
list_comments
List all comments for a task.
- Parameters:
taskId(number, required): The task ID
- Optional:
page(number): Page numberper_page(number): Items per page
create_comment
Add a comment to a task.
- Parameters:
taskId(number, required): The task IDcomment(string, required): The comment text
update_comment
Update a comment.
- Parameters:
taskId(number, required): The task IDcommentId(number, required): The comment IDcomment(string, required): New comment text
delete_comment
Delete a comment.
- Parameters:
taskId(number, required): The task IDcommentId(number, required): The comment ID to delete
Relations
create_relation
Create a relation between two tasks.
- Parameters:
taskId(number, required): The source task IDotherTaskId(number, required): The related task IDrelationKind(string, required): Relation type (unknown, subtask, parenttask, related, duplicateof, duplicates, blocking, blocked, precedes, follows, copiedfrom, copiedto)
delete_relation
Delete a relation between tasks.
- Parameters:
taskId(number, required): The source task IDotherTaskId(number, required): The related task IDrelationKind(string, required): Relation type (unknown, subtask, parenttask, related, duplicateof, duplicates, blocking, blocked, precedes, follows, copiedfrom, copiedto)
list_task_relations
List all relations for a task.
- Parameters:
taskId(number, required): The task ID
Subtasks
create_subtask
Create a subtask linked to parent task.
- Parameters:
projectId(number, required): The project IDparent_task_id(number, required): The parent task IDtask(object, required): The subtask object
- Required:
task(object):title(string, required): The subtask title
- Optional:
task(object):description(string): Subtask descriptiondone(boolean): Whether subtask is completeddue_date(string): Due datestart_date(string): Start dateend_date(string): End datehex_color(string): Subtask colorpriority(number): Prioritypercent_done(number): Progress (0-100)repeat_after(number): Repeat after X minutesrepeat_mode(number): Repeat mode (0=relative, 1=absolute)
list_subtasks
List all subtasks for a task.
- Parameters:
taskId(number, required): The parent task ID
Attachments
list_task_attachments
List all attachments for a task.
- Parameters:
taskId(number, required): The task ID
- Optional:
page(number): Page numberper_page(number): Items per page
delete_task_attachment
Delete an attachment from a task.
- Parameters:
taskId(number, required): The task IDattachmentId(number, required): The attachment ID
Examples
Listing Projects and Tasks
list my vikunja projects
Returns all projects you have access to.
list_project_tasks projectId: 1
Returns all tasks in project ID 1.
list_tasks per_page: 50
Lists up to 50 tasks across all projects.
Creating Projects and Tasks
create_project title: "My Project" description: "A new project" hex_color: "#FF5733"
Creates a new project with a title, description, and color.
create_task projectId: 1 title: "Buy groceries" priority: 3 due_date: "2024-12-25"
Creates a task in project ID 1 with priority and due date.
Managing Task State
complete_task taskId: 5
Marks task 5 as done.
reopen_task taskId: 5
Reopens task 5.
Working with Assignees
add_task_assignee taskId: 3 userId: 7
Adds user 7 as assignee to task 3.
list_task_assignees taskId: 3
Lists all assignees for task 3.
Comments
create_comment taskId: 3 comment: "This should be done by Friday"
Adds a comment to task 3.
Relations
create_relation taskId: 1 otherTaskId: 2 relationKind: "blocking"
Creates a "blocks" relation from task 1 to task 2 (task 1 blocks task 2).
Using String IDs
All ID parameters accept strings, so these are equivalent:
get_project projectId: 1
get_project projectId: "1"
This is useful when working with data from external sources:
list_project_tasks projectId: "123"
Installation
Prerequisites
- Node.js 18+
- npm or bun
- A Vikunja instance (self-hosted or cloud)
- Vikunja API token
Getting a Vikunja API Token
- Log into your Vikunja instance
- Go to Settings → API Tokens
- Create a new token
Build from Source
git clone https://github.com/Wosh-i/vikunja-mcp.git
cd vikunja-mcp
npm install
npm run build
OpenCode Configuration
Option 1: Using npx (Recommended)
The easiest way to configure Vikunja MCP is using npx. Add this to your OpenCode config (~/.config/opencode/opencode.jsonc):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"vikunja": {
"type": "local",
"command": ["npx", "-y", "vikunja-mcp"],
"environment": {
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
"VIKUNJA_TOKEN": "your-api-token-here",
},
},
},
}
Using npx with -y skips the confirmation prompt and automatically downloads the package.
Option 2: Build from Source
If you prefer to run locally without npx, build from source:
git clone https://github.com/Wosh-i/vikunja-mcp.git
cd vikunja-mcp
npm install
npm run build
Then configure OpenCode:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"vikunja": {
"type": "local",
"command": ["node", "/path/to/vikunja-mcp/dist/index.js"],
"environment": {
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
"VIKUNJA_TOKEN": "your-api-token-here",
},
},
},
}
Configuration Options
| Option | Required | Default | Description |
|---|---|---|---|
VIKUNJA_URL |
No | https://try.vikunja.io/api/v1 | Your Vikunja API base URL |
VIKUNJA_TOKEN |
Yes | - | Your Vikunja API token |
Environment Variables
You can also set environment variables globally in your shell:
export VIKUNJA_URL="https://your-vikunja-instance.com/api/v1"
export VIKUNJA_TOKEN="your-api-token-here"
Then the OpenCode config can be simpler:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"vikunja": {
"type": "local",
"command": ["node", "/path/to/vikunja-mcp/dist/index.js"],
},
},
}
Claude Code Desktop App Configuration
Option 1: Using npx (Recommended)
The easiest way to configure Vikunja MCP is using npx. Add this to your Claude Code desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"vikunja": {
"command": "npx",
"args": ["-y", "vikunja-mcp"],
"env": {
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
"VIKUNJA_TOKEN": "your-api-token-here",
},
},
},
}
Using npx with -y skips the confirmation prompt and automatically downloads the package.
Option 2: Build from Source
If you prefer to run locally without npx, build from source:
git clone https://github.com/Wosh-i/vikunja-mcp.git
cd vikunja-mcp
npm install
npm run build
Then configure Claude Code:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"vikunja": {
"command": "node",
"args": ["/path/to/vikunja-mcp/dist/index.js"],
"env": {
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
"VIKUNJA_TOKEN": "your-api-token-here",
},
},
},
}
Configuration Options
| Option | Required | Default | Description |
|---|---|---|---|
VIKUNJA_URL |
No | https://try.vikunja.io/api/v1 | Your Vikunja API base URL |
VIKUNJA_TOKEN |
Yes | - | Your Vikunja API token |
Environment Variables
You can also set environment variables globally in your shell:
export VIKUNJA_URL="https://your-vikunja-instance.com/api/v1"
export VIKUNJA_TOKEN="your-api-token-here"
Then the Claude Code config can be simpler:
{
"mcpServers": {
"vikunja": {
"command": "node",
"args": ["/path/to/vikunja-mcp/dist/index.js"],
},
},
}
Claude Code TUI Configuration
The Claude Code TUI (terminal user interface) uses the claude mcp add command to configure MCP servers.
Option 1: Using npx (Recommended)
The easiest way to configure Vikunja MCP is using npx:
claude mcp add --transport stdio --env VIKUNJA_URL=https://your-vikunja-instance.com/api/v1 --env VIKUNJA_TOKEN=your-api-token-here vikunja -- npx -y vikunja-mcp
Option 2: Build from Source
If you prefer to run locally without npx, build from source:
git clone https://github.com/Wosh-i/vikunja-mcp.git
cd vikunja-mcp
npm install
npm run build
Then configure Claude Code:
claude mcp add --transport stdio --env VIKUNJA_URL=https://your-vikunja-instance.com/api/v1 --env VIKUNJA_TOKEN=your-api-token-here vikunja -- /path/to/vikunja-mcp/dist/index.js
Configuration Scopes
Claude Code TUI supports different scopes for MCP server configuration:
| Scope | Config Location | Description |
|---|---|---|
user |
~/.claude.json |
Available to you across all projects |
local (default) |
~/.claude.json under project path |
Available only in the current project |
project |
.mcp.json in project root |
Shared with team members (checked into source control) |
# Add with user scope (available across all projects)
claude mcp add --transport stdio --scope user --env VIKUNJA_TOKEN=... vikunja -- npx -y vikunja-mcp
# Add with project scope (shared with team via .mcp.json)
claude mcp add --transport stdio --scope project --env VIKUNJA_TOKEN=... vikunja -- npx -y vikunja-mcp
Managing MCP Servers
# List all configured servers
claude mcp list
# Get details for a specific server
claude mcp get vikunja
# Remove a server
claude mcp remove vikunja
# Within Claude Code, check server status
/mcp
Configuration Options
| Option | Required | Default | Description |
|---|---|---|---|
VIKUNJA_URL |
No | https://try.vikunja.io/api/v1 | Your Vikunja API base URL |
VIKUNJA_TOKEN |
Yes | - | Your Vikunja API token |
Environment Variables
You can also set environment variables globally in your shell:
export VIKUNJA_URL="https://your-vikunja-instance.com/api/v1"
export VIKUNJA_TOKEN="your-api-token-here"
Then the configuration is simpler:
claude mcp add --transport stdio vikunja -- npx -y vikunja-mcp
Usage
CLI Options
| Option | Alias | Description |
|---|---|---|
--token |
-t |
Your Vikunja API token |
--url |
-u |
Your Vikunja API base URL |
--help |
-h |
Show help |
Using with OpenCode
After configuration, you can use Vikunja tools in OpenCode:
list my vikunja projects
create a project called "My Tasks" with color #FF5733
add a task titled "Buy groceries" to project "My Tasks" with priority 3
show me all tasks in the Inbox project
Development
# Install dependencies
npm install
# Build
npm run build
# Run in development mode
npm run dev
# Run tests (when available)
npm test
License
MIT License - see LICENSE file for details.
Contributing
Contributions welcome! Please open an issue or pull request.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.