Interact with a self-hosted Planka instance. Planka is a Trello-like kanban board.
See README.md for setup instructions, usage examples, and advanced use cases.
Setup
Required environment variables:
PLANKA_URL — Base URL (e.g. https://planka.example.com)
PLANKA_API_KEY — API key (generated in Planka UI → User Settings)
These can be set in:
- The current project's
.env file (most common)
~/.env (global, for cross-project use)
- Shell environment (e.g.
~/.bashrc or ~/.zshrc)
API
Base path: $PLANKA_URL/api/
Auth header: X-Api-Key: $PLANKA_API_KEY
Full OpenAPI spec: https://plankanban.github.io/planka/swagger-ui/swagger.json
CRITICAL: How to look up endpoints
- NEVER guess endpoints. Always look them up first.
- Do NOT trust WebFetch summaries of the swagger.json. WebFetch summarizes content and frequently returns incorrect/shortened paths (e.g.
/card-labels instead of /cards/{cardId}/card-labels).
- Instead, fetch the raw JSON and parse it yourself:
curl -sL https://plankanban.github.io/planka/swagger-ui/swagger.json | python3 -c "
import json, sys
spec = json.load(sys.stdin)
for path, methods in spec.get('paths', {}).items():
for method in methods:
if method in ('get','post','put','patch','delete'):
print(f'{method.upper()} {path}')
" | grep -i "SEARCH_TERM"
- On 404 errors: Do NOT retry the same endpoint. Immediately fetch the spec and find the correct path. The server version may differ from the spec -- try path variations (e.g.
/cards/{id}/card-labels vs /card-labels).
Key Concepts
- Hierarchy: Project → Board → List → Card → Task List → Task
- Responses:
{"item": {...}} for single, {"items": [...]} for collections, related data in "included"
- Positioning: Numeric, multiples of 65536. Lower = higher on the board.
- Colors (for lists/labels): e.g.
dark-granite, lagoon-blue, orange-peel, bright-moss, berry-red, light-mud, midnight-blue, light-cocoa, summer-sky, pumpkin-orange
How to Use
The user can talk naturally or use optional shorthand commands:
| Command |
Description |
/planka overview |
Show all projects and boards |
/planka board <name> |
Show a specific board with lists and cards |
These are shortcuts — the user can also just describe what they want freely: "create a card for Feature X", "move Bug Y to Done", "set up a new board with labels", etc.
Understand the intent, look up the right endpoints from the OpenAPI spec if needed, and execute.
Finding boards: Never hardcode IDs. Always list projects first, find boards from the included data, and match by name.
Null safety: Many Planka fields can be None/null — name, description, color, position, etc. Always use or "", or 0, (x or "").strip() patterns in Python code. Never call methods on potentially null values without guarding.
Display formatting:
overview: Show projects as headers with boards as bullet points. Include board card count.
board <name>: Show each list as a section with its cards listed below. For each card show: name, labels (as colored badges), task progress (e.g. 3/5), and description preview if available. Use markdown formatting — headers for lists, bullet points for cards. Skip empty/unnamed system lists (archive, trash).
Always:
- Load env vars before API calls:
source .env 2>/dev/null; source ~/.env 2>/dev/null — tries project .env first, then global ~/.env, silently skips if missing
- Use
curl -sL (silent + follow redirects)
- Use
python3 -c "import json; ..." for safe JSON encoding
- Ask the user when something is ambiguous (e.g. multiple boards/projects)
- Always confirm before executing: describe what you're about to do (e.g. "I'll create a card 'Dark Mode' in Backlog with labels Feature, UI") and wait for the user to approve before making any API calls. This applies to all write operations — create, update, move, delete.
1---2name: planka3description: Manage Planka kanban boards — create, organize, and track project tasks4---56Interact with a self-hosted Planka instance. Planka is a Trello-like kanban board.78> See [README.md](README.md) for setup instructions, usage examples, and advanced use cases.910## Setup1112Required environment variables:1314- `PLANKA_URL` — Base URL (e.g. `https://planka.example.com`)15- `PLANKA_API_KEY` — API key (generated in Planka UI → User Settings)1617These can be set in:181. The current project's `.env` file (most common)192. `~/.env` (global, for cross-project use)203. Shell environment (e.g. `~/.bashrc` or `~/.zshrc`)2122## API2324Base path: `$PLANKA_URL/api/`2526Auth header: `X-Api-Key: $PLANKA_API_KEY`2728**Full OpenAPI spec**: https://plankanban.github.io/planka/swagger-ui/swagger.json2930### CRITICAL: How to look up endpoints31321. **NEVER guess endpoints.** Always look them up first.332. **Do NOT trust WebFetch summaries of the swagger.json.** WebFetch summarizes content and frequently returns incorrect/shortened paths (e.g. `/card-labels` instead of `/cards/{cardId}/card-labels`).343. **Instead, fetch the raw JSON and parse it yourself:**35 ```bash36 curl -sL https://plankanban.github.io/planka/swagger-ui/swagger.json | python3 -c "37 import json, sys38 spec = json.load(sys.stdin)39 for path, methods in spec.get('paths', {}).items():40 for method in methods:41 if method in ('get','post','put','patch','delete'):42 print(f'{method.upper()} {path}')43 " | grep -i "SEARCH_TERM"44 ```454. **On 404 errors**: Do NOT retry the same endpoint. Immediately fetch the spec and find the correct path. The server version may differ from the spec -- try path variations (e.g. `/cards/{id}/card-labels` vs `/card-labels`).4647## Key Concepts4849- **Hierarchy**: Project → Board → List → Card → Task List → Task50- **Responses**: `{"item": {...}}` for single, `{"items": [...]}` for collections, related data in `"included"`51- **Positioning**: Numeric, multiples of 65536. Lower = higher on the board.52- **Colors** (for lists/labels): e.g. `dark-granite`, `lagoon-blue`, `orange-peel`, `bright-moss`, `berry-red`, `light-mud`, `midnight-blue`, `light-cocoa`, `summer-sky`, `pumpkin-orange`5354## How to Use5556The user can talk naturally or use optional shorthand commands:5758| Command | Description |59|---------|-------------|60| `/planka overview` | Show all projects and boards |61| `/planka board <name>` | Show a specific board with lists and cards |6263These are shortcuts — the user can also just describe what they want freely: "create a card for Feature X", "move Bug Y to Done", "set up a new board with labels", etc.6465Understand the intent, look up the right endpoints from the OpenAPI spec if needed, and execute.6667**Finding boards**: Never hardcode IDs. Always list projects first, find boards from the included data, and match by name.6869**Null safety**: Many Planka fields can be `None`/`null` — name, description, color, position, etc. Always use `or ""`, `or 0`, `(x or "").strip()` patterns in Python code. Never call methods on potentially null values without guarding.7071**Display formatting**:72- `overview`: Show projects as headers with boards as bullet points. Include board card count.73- `board <name>`: Show each list as a section with its cards listed below. For each card show: name, labels (as colored badges), task progress (e.g. 3/5), and description preview if available. Use markdown formatting — headers for lists, bullet points for cards. Skip empty/unnamed system lists (archive, trash).7475Always:7677- Load env vars before API calls: `source .env 2>/dev/null; source ~/.env 2>/dev/null` — tries project `.env` first, then global `~/.env`, silently skips if missing78- Use `curl -sL` (silent + follow redirects)79- Use `python3 -c "import json; ..."` for safe JSON encoding80- Ask the user when something is ambiguous (e.g. multiple boards/projects)81- **Always confirm before executing**: describe what you're about to do (e.g. "I'll create a card 'Dark Mode' in Backlog with labels Feature, UI") and wait for the user to approve before making any API calls. This applies to all write operations — create, update, move, delete.