3
Kanboard
agap-mcp edited this page 2026-07-21 14:01:32 +00:00

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, container kanboard
  • 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_data volume (/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 DB settings table (option='api_token') and is stored in Vaultwarden as KANBOARD_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), role app-admin, web password in Vaultwarden as KANBOARD_CLAUDE_PASSWORD.
  • Gotcha: app-admin grants visibility only. To be assignable a user must be a project memberclaude is added as project-member to every project via addProjectUser(project_id, user_id, "project-member").
  • Assign a card to claude (in the UI or kanboard_assign_task) and it shows up in kanboard_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/kanboardCLAUDE.md.