Skip to main content

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

  • list_projects
  • 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?)
  • list_labels
  • add_label (task_id, label_id)
  • remove_label (task_id, label_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 with secrets:

{
  "altiplano": {
    "command": "uvx",
    "args": ["altiplano"]
  }
}

Run

uv run altiplano                                  # dev, from this directory
uvx --from /mnt/settings/MCP/altiplano 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. #49), 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.

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.1.0.tar.gz (929.8 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.1.0-py3-none-any.whl (4.7 kB view details)

Uploaded Python 3

File details

Details for the file altiplano-0.1.0.tar.gz.

File metadata

  • Download URL: altiplano-0.1.0.tar.gz
  • Upload date:
  • Size: 929.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.9

File hashes

Hashes for altiplano-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b1206527634a892a3ca242582c339c6c607ab7b16d502704b3926b32926aab56
MD5 01ad2e3225c1aabb00a985c7a6ed2e85
BLAKE2b-256 8c49c869f5abb4d6b557354a5cdf25b742e579d381a56ac1ad620c7b5590db6a

See more details on using hashes here.

File details

Details for the file altiplano-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: altiplano-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.9

File hashes

Hashes for altiplano-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 543c224ccdf447be07ba3f1b683bd1f32cf46afe7e059680ed174e59df383eb5
MD5 92cc1e4227f9430295c6463a41316f64
BLAKE2b-256 1c473e4bb43623ddec77892af8ce387ef3f5be6f83720e7e7e3b92a875e69d67

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