Kanboard
Kanban task boards. Tasks can be assigned to Claude, which fetches, works,
comments and moves cards like a regular team member via the dedicated
kanboard-mcp server.
Service
- Image:
kanboard/kanboard:latest, containerkanboard - Compose:
/home/alvis/agap_git/kanboard/docker-compose.yml - Port:
127.0.0.1:4800→:80(reverse-proxied via Caddy externally) - Storage: SQLite in the
kanboard_datavolume (/var/www/app/data/db.sqlite)
Tier-0: backups, monitoring, degraded mode
Kanboard is tier-0 (fabric backbone, DESIGN-a2a-agents.md v2.1 §6c, hardened in kb#158/A2A-26) — scheduled backups, live Zabbix monitoring of the service and JSON-RPC API, and a verified degraded mode (Kanboard down → Adolf still chats, workers park and retry, nothing is lost). Full detail: Backups#Kanboard.
API
JSON-RPC at /jsonrpc.php. Two auth modes:
- App-wide (admin): HTTP Basic
jsonrpc:<token>— full access to every project. Token lives in the DBsettingstable (option='api_token') and is stored in Vaultwarden asKANBOARD_TOKEN. - Per-user:
<username>:<personal-token>— scoped to that user.
curl -s -u "jsonrpc:$KANBOARD_TOKEN" http://localhost:4800/jsonrpc.php \
-d '{"jsonrpc":"2.0","method":"getAllProjects","id":1}'
Claude bot user
- User
claude(display Claude), roleapp-admin, web password in Vaultwarden asKANBOARD_CLAUDE_PASSWORD. - Gotcha: app-admin grants visibility only. To be assignable a user
must be a project member —
claudeis added asproject-memberto every project viaaddProjectUser(project_id, user_id, "project-member"). - Assign a card to
claude(in the UI orkanboard_assign_task) and it shows up inkanboard_my_tasks.
kanboard-mcp integration
The kanboard_* tools run in a dedicated standalone MCP server (split out of
the shared agap-mcp on 2026-07-06, which had grown overloaded). Lives in the
alvis/kanboard repo at mcp/; container kanboard-mcp on port 3103,
registered in ~/.claude.json as server kanboard (tools appear as
mcp__kanboard__kanboard_*). Authenticates with the app-wide KANBOARD_TOKEN
(read straight from mcp/.env); writes are authored as claude via user_id.
Env: PORT, KANBOARD_URL, KANBOARD_TOKEN, KANBOARD_BOT_USER=claude.
Every tool handler wraps its call in try/catch and returns an MCP isError: true
result on failure rather than crashing (verified kb#158) — so when Kanboard is
unreachable, a kanboard_* tool call just fails cleanly; Adolf/Claude keep
working normally otherwise.
cd /home/alvis/kanboard/mcp && docker compose up -d --build # (with proxy vars unset)
curl -s http://localhost:3103/health # {"status":"ok","tools":23}
Tools (mcp__kanboard__kanboard_*):
| Tool | Purpose |
|---|---|
list_projects / get_project |
projects; columns + swimlanes |
list_tasks / my_tasks |
tasks in a project / assigned to claude (all projects) |
get_task |
task + subtasks + comments + tags |
search_tasks |
Kanboard query syntax (assignee:, status:, due:) |
list_users / project_activity |
monitor users / activity stream |
create_task / update_task |
create / edit (incl. score complexity) |
move_task / change_task_status |
move column / open-close |
assign_task |
(re)assign to a user |
add_comment / remove_comment |
comment as claude / delete |
create_subtask / update_subtask |
track execution steps (0 todo/1 wip/2 done) |
get_task_tags / set_task_tags |
read/add/remove tags (e.g. blocked) |
add_task_link / get_task_links / remove_task_link |
task dependencies ("is blocked by" / "blocks") |
remove_task |
delete a task (irreversible) |
Deleting whole projects is intentionally not exposed.
The orchestration ruleset (how Claude dispatches board tasks to sub-agents) and the full service/provenance notes live in
alvis/kanboard→CLAUDE.md.