loading…
Search for a command to run...
loading…
Enables AI-powered project management by connecting Claude to Planka kanban boards via 75+ MCP tools for creating, updating, and managing projects, boards, list
Enables AI-powered project management by connecting Claude to Planka kanban boards via 75+ MCP tools for creating, updating, and managing projects, boards, lists, and cards.
MCP (Model Context Protocol) server that connects Planka kanban boards to Claude.ai for AI-powered project management.
This server exposes all Planka v2 API operations as MCP tools via the Streamable HTTP transport, making it compatible with Claude.ai custom connectors.
POST /mcp + GET /mcp SSE) for Claude.ai compatibilityghcr.io, multi-stage Dockerfile + docker-composehttps://planka-mcp.domain.tld)We strongly recommend creating a dedicated Planka user account specifically for Claude (e.g. [email protected]), rather than using your personal account. This makes it easy to:
npm install
cp .env.example .env
# Edit .env with your Planka URL and Claude's dedicated account credentials
Authentication options (pick one):
| Method | Variables | Notes |
|---|---|---|
| API Key (recommended) | PLANKA_API_KEY |
Never expires. Generate via planka_create_user_api_key tool |
| Email + Password | PLANKA_EMAIL + PLANKA_PASSWORD |
Auto-refreshes JWT on 401 |
Claude.ai requires the MCP server to be accessible over HTTPS. You need a public domain pointing to this server, for example:
https://planka-mcp.domain.tld
Configure your reverse proxy (Nginx, Traefik, Caddy…) to forward HTTPS traffic to localhost:3001.
npm run build
npm start
curl https://planka-mcp.domain.tld/health
# {"status":"ok","planka_url":"http://...","version":"1.0.0"}
Go to Settings > Connectors > Add custom connector
Set the URL to: https://planka-mcp.domain.tld/mcp
⚠️ The URL must include
/mcpat the end — Claude.ai will not find the MCP server without it.
Click Add, then Connect and authorize via the OAuth screen
Enable the connector in a conversation via the "+" button > Connectors
A pre-built image is automatically published to the GitHub Container Registry on every push to main and on every version tag (v*).
ghcr.io/nextheberg/planka-mcp-server-for-claude:latest
The provided docker-compose.yml pulls the pre-built image by default:
# Pull latest image and start
docker compose up -d
# Check logs
docker compose logs -f planka-mcp
docker run -d \
--name planka-mcp \
--restart unless-stopped \
-p 3001:3001 \
--env-file .env \
ghcr.io/nextheberg/planka-mcp-server-for-claude:latest
To build the image from source instead of pulling it:
# Edit docker-compose.yml: comment out `image:` and uncomment `build:`
docker compose up -d --build
Or directly:
docker build -t planka-mcp-server .
Even though the MCP server is exposed on a public domain, it is effectively inaccessible to anyone except Claude. Here's why:
/mcp without a valid Bearer token is rejected immediately.planka-mcp-token-{uuid}, with UUID v4 providing 2¹²² possible values.The only realistic attack surface is token interception in transit — mitigated entirely by HTTPS/TLS. The OAuth discovery endpoints (/.well-known/*, /oauth/authorize, /oauth/token) are public but grant no access without completing the interactive flow.
In practice: only Claude — after you have clicked "Authorize" — can use this server.
Managing Planka tasks (creating cards, updating lists, searching boards…) does not require a powerful model. These are structured, low-complexity operations that work perfectly with Claude Haiku, Anthropic's fastest and most affordable model.
Using Claude Haiku for Planka operations costs a fraction of Claude Sonnet or Opus — making this connector extremely cost-effective for day-to-day project management automation.
npm run dev # Uses tsx --watch for hot reload
| Variable | Required | Default | Description |
|---|---|---|---|
PLANKA_BASE_URL |
Yes | - | Full URL to Planka (e.g. http://192.168.1.50:3000) |
PLANKA_API_KEY |
One of | - | API key for authentication |
PLANKA_EMAIL |
One of | - | Email for password auth |
PLANKA_PASSWORD |
One of | - | Password for password auth |
PORT |
No | 3001 |
Server listen port |
NODE_TLS_REJECT_UNAUTHORIZED |
No | true |
Set to false for self-signed certs |
PLANKA_REQUEST_TIMEOUT |
No | 30000 |
Request timeout in ms |
LOG_LEVEL |
No | info |
Log level: error, warn, info, debug |
| Tool | Description |
|---|---|
planka_get_bootstrap |
Get Planka instance info (version, OIDC, limits) |
planka_get_config |
Get SMTP configuration (admin) |
planka_update_config |
Update SMTP configuration (admin) |
planka_test_smtp |
Test SMTP configuration (admin) |
| Tool | Description |
|---|---|
planka_list_users |
List all users |
planka_create_user |
Create a new user |
planka_get_user |
Get user details |
planka_update_user |
Update user settings |
planka_delete_user |
Delete a user |
planka_update_user_email |
Change user email |
planka_update_user_password |
Change user password |
planka_update_user_username |
Change username |
planka_create_user_api_key |
Generate API key |
| Tool | Description |
|---|---|
planka_list_projects |
List all projects |
planka_create_project |
Create a project |
planka_get_project |
Get project with boards and members |
planka_update_project |
Update project settings |
planka_delete_project |
Delete a project |
planka_add_project_manager |
Add a project manager |
planka_remove_project_manager |
Remove a project manager |
planka_create_base_custom_field_group |
Create base custom field group |
| Tool | Description |
|---|---|
planka_create_board |
Create a board |
planka_get_board |
Get board with all content |
planka_update_board |
Update board settings |
planka_delete_board |
Delete a board |
planka_get_board_actions |
Get board activity log |
planka_add_board_member |
Add board member |
planka_update_board_member |
Update member role |
planka_remove_board_member |
Remove board member |
| Tool | Description |
|---|---|
planka_create_list |
Create a list |
planka_get_list |
Get list with cards |
planka_update_list |
Update list (name, color, position, move) |
planka_delete_list |
Delete a list |
planka_sort_list |
Sort cards in a list |
planka_move_list_cards |
Move all cards to another list |
planka_clear_list |
Clear all cards from a list |
| Tool | Description |
|---|---|
planka_list_cards |
List cards with filters |
planka_create_card |
Create a card |
planka_get_card |
Get card with all details |
planka_update_card |
Update card (move, rename, due date, etc.) |
planka_delete_card |
Delete a card |
planka_duplicate_card |
Duplicate a card |
planka_read_card_notifications |
Mark card notifications read |
planka_get_card_actions |
Get card activity log |
| Tool | Description |
|---|---|
planka_create_task_list |
Create a checklist on a card |
planka_get_task_list |
Get task list with tasks |
planka_update_task_list |
Update task list |
planka_delete_task_list |
Delete task list |
planka_create_task |
Create a task |
planka_update_task |
Update task (complete, assign, rename) |
planka_delete_task |
Delete a task |
| Tool | Description |
|---|---|
planka_create_label |
Create a label |
planka_update_label |
Update a label |
planka_delete_label |
Delete a label |
planka_add_label_to_card |
Add label to card |
planka_remove_label_from_card |
Remove label from card |
| Tool | Description |
|---|---|
planka_assign_user_to_card |
Assign user to card |
planka_unassign_user_from_card |
Unassign user from card |
| Tool | Description |
|---|---|
planka_list_comments |
List card comments |
planka_create_comment |
Add a comment |
planka_update_comment |
Edit a comment |
planka_delete_comment |
Delete a comment |
| Tool | Description |
|---|---|
planka_add_link_attachment |
Add a link attachment |
planka_update_attachment |
Rename attachment |
planka_delete_attachment |
Delete attachment |
| Tool | Description |
|---|---|
planka_update_base_custom_field_group |
Update base field group |
planka_delete_base_custom_field_group |
Delete base field group |
planka_create_custom_field_in_base_group |
Create field in base group |
planka_create_board_custom_field_group |
Create board field group |
planka_create_card_custom_field_group |
Create card field group |
planka_get_custom_field_group |
Get field group |
planka_update_custom_field_group |
Update field group |
planka_delete_custom_field_group |
Delete field group |
planka_create_custom_field_in_group |
Create field in group |
planka_update_custom_field |
Update a custom field |
planka_delete_custom_field |
Delete a custom field |
planka_update_custom_field_value |
Set field value on card |
planka_delete_custom_field_value |
Remove field value from card |
| Tool | Description |
|---|---|
planka_list_notifications |
List all notifications |
planka_get_notification |
Get notification details |
planka_update_notification |
Mark read/unread |
planka_read_all_notifications |
Mark all as read |
| Tool | Description |
|---|---|
planka_create_board_notification_service |
Create board webhook |
planka_create_user_notification_service |
Create user webhook |
planka_update_notification_service |
Update notification service |
planka_delete_notification_service |
Delete notification service |
planka_test_notification_service |
Test notification service |
| Tool | Description |
|---|---|
planka_list_webhooks |
List all webhooks |
planka_create_webhook |
Create a webhook |
planka_update_webhook |
Update a webhook |
planka_delete_webhook |
Delete a webhook |
| Tool | Description |
|---|---|
planka_get_board_overview |
Full board view: lists + cards + members + labels |
planka_get_project_overview |
Project with boards and card counts per list |
planka_search_cards_in_project |
Search cards across all boards in a project |
planka_get_my_cards |
Get all cards assigned to a user across all projects |
src/
index.ts # Express HTTP server (Streamable HTTP transport)
server.ts # MCP server definition + all 75+ tools
planka/
client.ts # HTTP client (auth, auto-refresh, timeout)
types.ts # Full TypeScript type definitions
api/
auth.ts # Access tokens + bootstrap
projects.ts # Projects + managers
boards.ts # Boards + memberships
lists.ts # Lists (CRUD + sort + move + clear)
cards.ts # Cards (CRUD + duplicate + notifications)
task-lists.ts # Task lists
tasks.ts # Tasks
labels.ts # Labels + card labels
card-memberships.ts # Card member assignments
comments.ts # Comments
attachments.ts # Attachments (link type)
custom-fields.ts # Custom field groups + fields + values
users.ts # Users (CRUD + email/password/username/apikey)
notifications.ts # Notifications
notification-services.ts # Notification services
webhooks.ts # Webhooks
config.ts # SMTP config
GPL-3.0 license
Run in your terminal:
claude mcp add planka-mcp-server-for-claude -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.