Minimal MCP server for Vikunja (server-side filtering, no fluff)
Project description
Altiplano
A small, dependable MCP server for Vikunja. Named after the Andean altiplano, the high plateau that is the Vicuña's native habitat.
Filtering and sorting are passed straight to the Vikunja API (server-side), so there is no client-side filtering engine and no paginate-then-filter pitfall.
Tools
Projects:
list_projects(includesparent_project_id, shows sub-project nesting)create_project(title, parent_project_id?, description?) — passparent_project_idfor a sub-project
Tasks:
list_tasks(project_id, filter, sort_by, page, per_page)get_task(task_id)create_task(project_id, title, description?, priority?, due_date?)update_task(task_id, title?, description?, done?, priority?)set_reminders(task_id, reminders) — replaces the task's reminders with the given ISO 8601 datetimes; empty list clears
Labels:
list_labelsadd_label(task_id, label_id)remove_label(task_id, label_id)
Comments:
list_comments(task_id)add_comment(task_id, comment)
Assignees:
search_users(query) — find auser_idto assignlist_assignees(task_id)add_assignee(task_id, user_id)remove_assignee(task_id, user_id)
Credentials (no secrets in mcp.json)
The server resolves two values, in order:
- Environment variables
VIKUNJA_URLandVIKUNJA_API_TOKEN. - A per-device file of
KEY=VALUElines, default~/.config/altiplano/env(override the path withALTIPLANO_CONFIG).
VIKUNJA_URL is the base API URL including /api/v1 (e.g. https://todo.example.com/api/v1).
Recommended so the shared mcp.json carries no secret:
- Drop a per-device file and lock it down:
mkdir -p ~/.config/altiplano printf 'VIKUNJA_URL=https://todo.example.com/api/v1\nVIKUNJA_API_TOKEN=tk_xxx\n' > ~/.config/altiplano/env chmod 600 ~/.config/altiplano/env
- Or inject via the launcher's environment (e.g. a systemd unit
EnvironmentFile=pointing at achmod 600file), which the server inherits. - For stronger setups, source the token from a secret manager/keychain at launch and export it into the environment.
Then mcp.json only needs the command, no env block, no plain-text secrets:
{
"altiplano": {
"command": "uvx",
"args": ["altiplano"]
}
}
Run
uv run altiplano # dev, from this directory
uvx --from /your/local/path altiplano # local path
uvx altiplano # from PyPI
Notes
- Vikunja priority scale: 0 Unset, 1 Low, 2 Medium, 3 High, 4 Urgent, 5 DO NOW.
- The UI shows tasks by their project-local
identifier(e.g.#50), which is not the globalidthe API uses. - Endpoint shapes (create via
PUT /projects/{id}/tasks, update viaPOST /tasks/{id}) follow current Vikunja; adjust if your instance differs.
Licence
MIT.
Support
RTFM, then RTFC... If you are still stuck or just need an additional feature, file an issue.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file altiplano-0.2.2.tar.gz.
File metadata
- Download URL: altiplano-0.2.2.tar.gz
- Upload date:
- Size: 931.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ebbbc8a543e4b3bf112d9dbf867d5b8056dacbe3f9172425a0649b7e4a6b974
|
|
| MD5 |
277285ca53ab4cf53473eeccf4d46796
|
|
| BLAKE2b-256 |
1d30ff80783f1225fd910770fd324464804ddc2d82df0131d804db4326f8d16f
|
File details
Details for the file altiplano-0.2.2-py3-none-any.whl.
File metadata
- Download URL: altiplano-0.2.2-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce1071252b25e4c5d8a4b3471bb77cea4d02151cfe25b62048c92ed8a12b8148
|
|
| MD5 |
8c48c6175ed3814e02366c1dcc4c2cd7
|
|
| BLAKE2b-256 |
ad77fa9a821b39ece03eff41c2b9e49a60c66a74d875f61583ffad16123b1cc1
|