Kanboard Skill
Overview
Kanboard uses JSON-RPC 2.0 over HTTP POST. All calls go to a single endpoint.
Make sure you have follow parameter to to access Kanboard:
- 1. KANBOARDURL, the server url.
- KANBOARDAPI_TOKEN, the access api token.
Auth modes
Application API skips permission checks and has no session. Use it for automation.
Here is an example of curl:
curl "${KANBOARD_URL}/jsonrpc.php" -u "jsonrpc:$token" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"$method\",\"id\":1,\"params\":$params}"
Core Helper
Always use this shell function to call the API:
CODEBLOCK1
Check for errors in every response:
# Always verify result is not null/false
result=$(kb getMe | jq '.result')
if [ "$result" = "null" ] || [ "$result" = "false" ]; then
echo "Error: $(kb getMe | jq -r '.error.message // "unknown error"')"
fi
Projects
CODEBLOCK3
Board & Columns
CODEBLOCK4
Tasks
CODEBLOCK5
Move task to another project
kb moveTaskToProject '{
"task_id": 42,
"project_id": 2,
"swimlane_id": 1,
"column_id": 1,
"category_id": 0
}'
Duplicate task to another project
kb duplicateTaskToProject '{
"task_id": 42,
"project_id": 2
}'
Close / Open task
kb closeTask '{"task_id": 42}'
kb openTask '{"task_id": 42}'
Remove task (irreversible)
kb removeTask '{"task_id": 42}'
Get task color list
kb getTaskColors
### Task color IDs
`yellow`, `blue`, `green`, `purple`, `red`, `orange`, `grey`, `brown`, `deep_orange`, `dark_grey`, `pink`, `teal`, `cyan`, `lime`, `light_green`, `amber`
---
## Subtasks
bash
List subtasks for a task
kb getAllSubtasks '{"task_id": 42}'
Create subtask
kb createSubtask '{
"task_id": 42,
"title": "Write unit tests",
"user_id": 3,
"time_estimated": 4
}'
Update subtask (status: 0=todo, 1=in-progress, 2=done)
kb updateSubtask '{
"id": 10,
"task_id": 42,
"status": 1,
"time_spent": 2
}'
Remove subtask
kb removeSubtask '{"subtask_id": 10}'
---
## Comments
bash
List comments for a task
kb getAllComments '{"task_id": 42}'
Create comment
kb createComment '{
"task_id": 42,
"user_id": 1,
"content": "This is a
markdown comment."
}'
Update comment
kb updateComment '{"id": 7, "content": "Updated comment text."}'
Remove comment
kb removeComment '{"comment_id": 7}'
---
## Swimlanes
bash
List swimlanes for a project
kb getSwimlanes '{"project_id": 1}'
Get active swimlanes only
kb getActiveSwimlanes '{"project_id": 1}'
Create swimlane
kb addSwimlane '{"project_id": 1, "name": "Team Alpha"}'
Update swimlane
kb updateSwimlane '{"swimlane_id": 3, "name": "Team Beta"}'
Remove swimlane
kb removeSwimlane '{"project
id": 1, "swimlaneid": 3}'
Change swimlane position
kb changeSwimlanePosition '{"project
id": 1, "swimlaneid": 3, "position": 1}'
---
## Categories
bash
List categories for a project
kb getAllCategories '{"project_id": 1}'
Create category
kb createCategory '{"project_id": 1, "name": "Backend"}'
Update category
kb updateCategory '{"id": 5, "name": "Backend & API"}'
Remove category
kb removeCategory '{"category_id": 5}'
---
## Users
bash
List all users (Application API only)
kb getAllUsers
Get user by ID
kb getUserById '{"user_id": 3}'
Get user by username
kb getUserByName '{"username": "alice"}'
Create user
kb createUser '{
"username": "bob",
"password": "S3cur3P@ss",
"name": "Bob Smith",
"email": "bob@example.com",
"role": "app-user"
}'
Roles: app-admin | app-manager | app-user
Update user
kb updateUser '{"id": 3, "name": "Bob Jones", "email": "bob.jones@example.com"}'
Disable / Enable user
kb disableUser '{"user_id": 3}'
kb enableUser '{"user_id": 3}'
Remove user
kb removeUser '{"user_id": 3}'
Current user (User API only)
kb getMe
kb getMyProjects
kb getMyDashboard
kb getMyActivityStream
kb getMyCalendar
kb getMyNotifications
---
## Project Permissions
bash
List project users
kb getProjectUsers '{"project_id": 1}'
Add user to project
kb addProjectUser '{
"project_id": 1,
"user_id": 3,
"role": "project-member"
}'
Roles: project-manager | project-member | project-viewer
Change user role in project
kb changeProjectUserRole '{"project
id": 1, "userid": 3, "role": "project-manager"}'
Remove user from project
kb removeProjectUser '{"project
id": 1, "userid": 3}'
Add/remove group to project
kb addProjectGroup '{"project
id": 1, "groupid": 2, "role": "project-member"}'
kb removeProjectGroup '{"project
id": 1, "groupid": 2}'
---
## Tags
bash
Get all tags for a project
kb getTagsByProject '{"project_id": 1}'
Create tag
kb createTag '{"project_id": 1, "tag": "urgent"}'
Update tag
kb updateTag '{"id": 4, "tag": "critical"}'
Remove tag
kb removeTag '{"tag_id": 4}'
Get tags for a task
kb getTaskTags '{"task_id": 42}'
Assign tags to a task (replaces existing tags)
kb setTaskTags '{"project
id": 1, "taskid": 42, "tags": ["bug", "urgent"]}'
---
## Task Links (Internal)
bash
Get link types
kb getAllLinks
Get links for a task
kb getAllTaskLinks '{"task_id": 42}'
Create task link
kb createTaskLink '{
"task_id": 42,
"opposite
taskid": 55,
"link_id": 1
}'
Common link_id: 1=relates to, 2=blocks, 3=is blocked by, 4=duplicates, 5=is duplicated by
Remove task link
kb removeTaskLink '{"task
linkid": 8}'
---
## Application
bash
Get app version
kb getVersion
Get app timezone
kb getTimezone
Get app default language
kb getDefaultLanguage
Get current datetime
kb now
Get available board column types
kb getDefaultTaskColors
---
## Common Workflows
### Create project with full setup
bash
1. Create project
project_id=$(kb createProject '{"name":"Sprint 1"}' | jq '.result')
2. Add columns
kb addColumn "{\"project
id\": $projectid, \"title\": \"Backlog\"}"
kb addColumn "{\"project
id\": $projectid, \"title\": \"In Progress\", \"task_limit\": 3}"
kb addColumn "{\"project
id\": $projectid, \"title\": \"Review\"}"
kb addColumn "{\"project
id\": $projectid, \"title\": \"Done\"}"
3. Add swimlane
kb addSwimlane "{\"project
id\": $projectid, \"name\": \"Team Alpha\"}"
4. Show board
kb getBoard "{\"project
id\": $projectid}"
### Move task through workflow
bash
task_id=42
project_id=1
Get column IDs first
columns=$(kb getColumns "{\"project
id\": $projectid}" | jq '.result')
in
progresscol=$(echo $columns | jq '[.[] | select(.title=="In Progress")][0].id')
Move task
kb moveTaskPosition "{
\"project
id\": $projectid,
\"task
id\": $taskid,
\"column
id\": $inprogress_col,
\"position\": 1,
\"swimlane_id\": 1
}"
### Create task with subtasks
bash
Create parent task
task_id=$(kb createTask '{
"title": "Implement feature X",
"project_id": 1,
"priority": 2
}' | jq '.result')
Add subtasks
kb createSubtask "{\"task
id\": $taskid, \"title\": \"Write spec\"}"
kb createSubtask "{\"task
id\": $taskid, \"title\": \"Implement\"}"
kb createSubtask "{\"task
id\": $taskid, \"title\": \"Write tests\"}"
kb createSubtask "{\"task
id\": $taskid, \"title\": \"Code review\"}"
### Bulk close completed tasks
bash
project_id=1
Get all open tasks, close those tagged "done"
kb getAllTasks "{\"project
id\": $projectid, \"status_id\": 1}" \
| jq -r '.result[] | select(.tags[]? == "done") | .id' \
| while read task_id; do
kb closeTask "{\"task
id\": $taskid}"
echo "Closed task $task_id"
done
---
## Setup & Configuration
Add to your OpenClaw environment:
bash
Required
export KANBOARD_URL="https://kanboard.example.com"
export KANBOARD
APITOKEN="your
tokenfrom
settingspage"
``
**Getting your API token:**
1. Log in to Kanboard as admin
2. Go to **Settings → API**
3. Copy the token shown there
---
## Notes
- Kanboard use Http basic auth, pass token by --user/-u parameter. You **must not** set token at http header.
- All dates use YYYY-MM-DD
format or Unix timestamps
- Task priority
: 0=low, 1=normal, 2=high, 3=urgent
- Kanboard supports **batch requests** — multiple JSON-RPC calls in one HTTP request (useful for bulk ops)
- status
id for tasks: 1=open, 2=closed
- API endpoint is always URL>/jsonrpc.php`
Kanboard 技能
概述
Kanboard 通过 HTTP POST 使用 JSON-RPC 2.0 协议。所有调用都指向同一个端点。
请确保拥有以下参数以访问 Kanboard:
- 1. KANBOARDURL,服务器地址。
- KANBOARDAPI_TOKEN,访问 API 令牌。
认证模式
应用 API 跳过权限检查且无会话。请将其用于自动化操作。
以下是 curl 示例:
curl ${KANBOARD_URL}/jsonrpc.php -u jsonrpc:$token -H Content-Type: application/json -d {\jsonrpc\:\2.0\,\method\:\$method\,\id\:1,\params\:$params}
核心辅助函数
始终使用此 shell 函数来调用 API:
bash
kb() {
local method=$1
local params=${2:-{}}
local token=${KANBOARDPASS:-$KANBOARDAPI_TOKEN}
curl -s -X POST \
-u jsonrpc:$token \
-H Content-Type: application/json \
-d {\jsonrpc\:\2.0\,\method\:\$method\,\id\:1,\params\:$params} \
${KANBOARD_URL}/jsonrpc.php | jq .
}
在每个响应中检查错误:
bash
始终验证结果不为 null/false
result=$(kb getMe | jq .result)
if [ $result = null ] || [ $result = false ]; then
echo 错误:$(kb getMe | jq -r .error.message // 未知错误)
fi
项目
bash
列出所有项目
kb getAllProjects
按 ID 获取单个项目
kb getProjectById {project_id: 1}
按名称获取项目
kb getProjectByName {name: 我的项目}
创建项目
kb createProject {name: 新项目, description: 可选描述}
更新项目
kb updateProject {id: 1, name: 已重命名, description: 已更新}
删除项目(不可逆)
kb removeProject {project_id: 1}
启用/禁用项目
kb enableProject {project_id: 1}
kb disableProject {project_id: 1}
获取项目活动动态
kb getProjectActivity {project_id: 1}
看板与列
bash
获取项目的完整看板(列+任务)
kb getBoard {project_id: 1}
列出列
kb getColumns {project_id: 1}
获取单个列
kb getColumn {column_id: 5}
创建列
kb addColumn {project
id: 1, title: 审核中, tasklimit: 3}
更新列
kb updateColumn {column
id: 5, title: 审核, tasklimit: 5}
删除列
kb removeColumn {column_id: 5}
更改列位置
kb changeColumnPosition {project
id: 1, columnid: 5, position: 2}
任务
bash
创建任务(最低要求:标题 + 项目ID)
kb createTask {
title: 修复登录错误,
project_id: 1,
column_id: 2,
swimlane_id: 1,
color_id: red,
priority: 2,
due_date: 2025-12-31,
description: 此处填写详细描述,
owner_id: 3,
tags: [bug, urgent]
}
按 ID 获取任务
kb getTask {task_id: 42}
按引用获取任务(外部引用)
kb getTaskByReference {project_id: 1, reference: EXT-123}
列出项目中的所有任务(状态:1=开放,2=关闭)
kb getAllTasks {project
id: 1, statusid: 1}
使用高级查询搜索任务
kb searchTasks {project_id: 1, query: assignee:me status:open}
更新任务
kb updateTask {
id: 42,
title: 修复登录错误(已更新),
column_id: 3,
color_id: green,
priority: 1,
due_date: 2025-11-30
}
将任务移动到另一列/泳道/位置
kb moveTaskPosition {
\project
id\: $projectid,
\task
id\: $taskid,
\column
id\: $inprogress_col,
\position\: 1,
\swimlane_id\: 1
}
将任务移动到另一个项目
kb moveTaskToProject {
task_id: 42,
project_id: 2,
swimlane_id: 1,
column_id: 1,
category_id: 0
}
将任务复制到另一个项目
kb duplicateTaskToProject {
task_id: 42,
project_id: 2
}
关闭/打开任务
kb closeTask {task_id: 42}
kb openTask {task_id: 42}
删除任务(不可逆)
kb removeTask {task_id: 42}
获取任务颜色列表
kb getTaskColors
任务颜色 ID
yellow, blue, green, purple, red, orange, grey, brown, deep
orange, darkgrey, pink, teal, cyan, lime, light_green, amber
子任务
bash
列出任务的子任务
kb getAllSubtasks {task_id: 42}
创建子任务
kb createSubtask {
task_id: 42,
title: 编写单元测试,
user_id: 3,
time_estimated: 4
}
更新子任务(状态:0=待办,1=进行中,2=已完成)
kb updateSubtask {
id: 10,
task_id: 42,
status: 1,
time_spent: 2
}
删除子任务
kb removeSubtask {subtask_id: 10}
评论
bash
列出任务的评论
kb getAllComments {task_id: 42}
创建评论
kb createComment {
task_id: 42,
user_id: 1,
content: 这是一条
Markdown 格式的评论。
}
更新评论
kb updateComment {id: 7, content: 已更新的评论内容。}
删除评论
kb removeComment {comment_id: 7}
泳道
bash
列出项目的泳道
kb getSwimlanes {project_id: 1}
仅获取活跃泳道
kb getActiveSwimlanes {project_id: 1}
创建泳道
kb addSwimlane {project_id: 1, name: Alpha 团队}
更新泳道
kb updateSwimlane {swimlane_id: 3, name: Beta 团队}
删除泳道
kb removeSwimlane {project
id: 1, swimlaneid: 3}
更改泳道位置
kb changeSwimlanePosition {project
id: 1, swimlaneid: 3, position: 1}
分类
bash
列出项目的分类
kb getAllCategories {project_id: 1}
创建分类
kb createCategory {project_id: 1, name: 后端}
更新分类
kb updateCategory {id: 5, name: 后端与 API}
删除分类
kb removeCategory {category_id: 5}
用户
bash
列出所有用户(仅应用 API)
kb getAllUsers
按 ID 获取用户
kb getUserById {user_id: 3}
按用户名获取用户
kb getUserByName {username: alice}
创建用户
kb createUser {
username: bob,
password: S3cur3P@ss,