Skip to main content

Minimal MCP server for Vikunja (server-side filtering, no fluff)

Project description

Altiplano

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 (includes parent_project_id, shows sub-project nesting)
  • create_project (title, parent_project_id?, description?) — pass parent_project_id for 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_labels
  • add_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 a user_id to assign
  • list_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:

  1. Environment variables VIKUNJA_URL and VIKUNJA_API_TOKEN.
  2. A per-device file of KEY=VALUE lines, default ~/.config/altiplano/env (override the path with ALTIPLANO_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 a chmod 600 file), 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 global id the API uses.
  • Endpoint shapes (create via PUT /projects/{id}/tasks, update via POST /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

altiplano-0.2.2.tar.gz (931.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

altiplano-0.2.2-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

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

Hashes for altiplano-0.2.2.tar.gz
Algorithm Hash digest
SHA256 1ebbbc8a543e4b3bf112d9dbf867d5b8056dacbe3f9172425a0649b7e4a6b974
MD5 277285ca53ab4cf53473eeccf4d46796
BLAKE2b-256 1d30ff80783f1225fd910770fd324464804ddc2d82df0131d804db4326f8d16f

See more details on using hashes here.

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

Hashes for altiplano-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ce1071252b25e4c5d8a4b3471bb77cea4d02151cfe25b62048c92ed8a12b8148
MD5 8c48c6175ed3814e02366c1dcc4c2cd7
BLAKE2b-256 ad77fa9a821b39ece03eff41c2b9e49a60c66a74d875f61583ffad16123b1cc1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page