planka-mcp
# planka-mcp
MCP server for [Planka](https://planka.app) project management. Provides tools for managing projects, boards, lists, cards, tasks, labels, comments, stopwatches, and memberships.
## Configuration
Set these environment variables:
- `PLANKA_BASE_URL` — The base URL of your Planka instance (e.g. `https://planka.example.com`)
- `PLANKA_API_TOKEN` — Your Planka API token (from Account → API Tokens)
## Development
```bash
# Install dependencies
uv sync
# Run the MCP server
uv run python -m planka_mcp
```
## Tools
This server exposes 50+ MCP tools covering:
- **Projects**: get/create/update/delete
- **Boards**: get/create/update/delete, summaries
- **Lists**: get/create/update/delete
- **Cards**: get/create_cards/update/move_cards/delete_cards/duplicate (all batch-aware), details, parent-child, file attachments
- **Tasks**: get/create/batch create/update/delete/toggle complete
- **Labels**: get/create/update/delete, add/remove from cards
- **Comments**: get/create/update/delete
- **Stopwatches**: start/stop/get/reset
- **Memberships**: get/create/update/delete
- **Users**: list users
TDQS
Scored across 56 tools
Most tools are clearly separated by resource and action, but some overlap exists: update_task can set completion while complete_task toggles it, and get_card_details bundles comments/tasks/labels that also have dedicated getters. Descriptions are clear enough to avoid major misselection.
Tool names are predominantly snake_case verb_noun and easy to predict. Minor inconsistency: list-all operations use get_projects/get_boards but get_all_lists/get_all_cards/get_all_tasks, and there is no get_label single counterpart.
56 tools is well above the 50+ extreme threshold for an MCP tool surface. Although the Planka domain has many entity types and each tool maps to a distinct operation, the sheer count will make agent tool selection unwieldy.
Core lifecycle coverage is strong across projects, boards, lists, cards, tasks, labels, comments, memberships, and stopwatch. Gaps include no attachment removal/update, no unassign parent-card operation, and no single-label getter, but these are minor compared to the covered surface.