kanboard-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Pino log level: trace, debug, info, warn, error, fatal | info |
| KANBOARD_URL | No | Base URL of your Kanboard instance, e.g. https://kanboard.example.com | |
| KANBOARD_USERNAME | No | Your Kanboard login username (required in personal mode) | |
| KANBOARD_API_TOKEN | No | API token (personal or application, depending on auth mode) | |
| KANBOARD_AUTH_MODE | No | personal (acts as a Kanboard user) or app (service identity) | personal |
| KANBOARD_TIMEOUT_MS | No | Per-request HTTP timeout in milliseconds | 15000 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| add_project_userA | Add a user to a Kanboard project with the given role. Role defaults to 'project-member' if not specified. Use list_project_users to find user ids and list_projects to find project ids. |
| attach_file_to_taskA | Upload a file to a Kanboard task as an attachment. Provide either file_path (local file) or content_base64 (inline base64 content) — not both. project_id is resolved automatically from the task (no need to provide it). Maximum file size: 5 MB (5,242,880 bytes) — larger files return VALIDATION_ERROR before any HTTP request is made. Returns { file_id } on success. |
| create_columnA | Add a column to a Kanboard project board. Project resolved from explicit project_id/project_identifier or .kanboard.yaml. Returns { column_id } on success. |
| create_commentA | Create a comment on a Kanboard task. The comment author is automatically set to the authenticated user (via getMe() cache). Do NOT pass user_id — it is injected server-side. Returns { comment_id } on success. |
| create_projectA | Create a new Kanboard project. Requires a name (1–255 chars). Optionally provide a description, short identifier, owner user id, start_date / end_date (ISO 8601 string or epoch seconds), and email. Returns { project_id } on success. |
| create_subtaskA | Create a subtask under an existing Kanboard task. Returns { subtask_id } on success. Status: 0 = todo (default), 1 = in progress, 2 = done. |
| create_swimlaneA | Add a swimlane to a Kanboard project. Project resolved from explicit project_id/project_identifier or .kanboard.yaml. Returns { swimlane_id } on success. |
| create_taskA | Create a new task in a Kanboard project. Project is resolved from explicit project_id or project_identifier, or from .kanboard.yaml. Optional fields (column_id, owner_id, category_id, swimlane_id) fall back to .kanboard.yaml defaults when not provided. Returns { task_id } on success. |
| create_tasks_batchA | Bulk-create tasks in a Kanboard project using a single JSON-RPC batch request. Accepts 1–100 tasks per call. Non-atomic: partial failure is possible — check failed[] for per-task errors. Optional fields (column_id, owner_id, category_id, swimlane_id) fall back to .kanboard.yaml defaults when not provided. Returns { created: [...], failed: [...] } — never throws on partial failure. |
| delete_columnA | Permanently delete a Kanboard column. DESTRUCTIVE — requires explicit |
| delete_commentA | Permanently delete a Kanboard comment. DESTRUCTIVE — requires explicit |
| delete_projectA | Permanently delete a Kanboard project (and all its tasks, columns, swimlanes). DESTRUCTIVE — requires explicit |
| delete_subtaskA | Permanently delete a Kanboard subtask. DESTRUCTIVE — requires explicit |
| delete_swimlaneA | Permanently delete a Kanboard swimlane. DESTRUCTIVE — requires explicit |
| delete_taskA | Permanently delete a Kanboard task. DESTRUCTIVE — requires explicit |
| delete_task_fileA | Permanently delete a file attachment from a Kanboard task. DESTRUCTIVE — requires explicit |
| get_projectA | Retrieve a single Kanboard project. Provide exactly one of: project_id (number), project_identifier (short string like 'PRJ'), or project_name (full name). Returns the full project object. Returns NOT_FOUND when no match exists. |
| get_taskA | Retrieve a single Kanboard task by its numeric id. Returns the full task entity including status, dates, column, swimlane, and metadata. Returns NOT_FOUND when the task does not exist. |
| list_categoriesA | List all categories for a Kanboard project. Provide project_id or project_identifier, or configure .kanboard.yaml in your project root. Returns an array of category objects with id, name, and color_id. |
| list_columnsA | List all columns (board stages) for a Kanboard project. Provide project_id or project_identifier, or configure .kanboard.yaml in your project root. Returns an array of column objects with id, title, position, and task_limit. |
| list_my_tasksA | List open tasks assigned to the currently authenticated user in the resolved project. Requires a project_id (explicit or from .kanboard.yaml). Uses Kanboard search query: assignee:me status:open. In app mode (jsonrpc user) returns tasks assigned to the jsonrpc system user. |
| list_overdue_tasksA | List overdue tasks with configurable scope. scope="mine" (default): overdue tasks for the authenticated user. scope="all": all overdue tasks across all projects (admin token required). scope="project": overdue tasks for a specific project (pass project_id or use .kanboard.yaml). Note: getOverdueTasksByUser is not supported by the Kanboard JSON-RPC API. Returns an empty array when nothing is overdue. |
| list_projectsA | Returns the projects where the authenticated user is a member. Does not list projects in the Kanboard instance that the user has no access to. Returns an array of project objects with id, name, identifier, and status. |
| list_subtasksA | List all subtasks for a given Kanboard task. Returns an array of subtask objects including id, title, status, user_id, time_estimated, and time_spent fields. |
| list_swimlanesA | List active swimlanes for a Kanboard project. Provide project_id or project_identifier, or configure .kanboard.yaml in your project root. Returns an array of swimlane objects with id, name, description, position, and is_active. |
| list_tasksA | List tasks in a Kanboard project. Returns active tasks by default (status_id=1). Pass status_id=0 to list closed/inactive tasks. Project is resolved from explicit project_id or project_identifier, or from .kanboard.yaml. |
| list_project_usersA | List the members of a Kanboard project (user_id + username pairs). Provide project_id or project_identifier, or configure .kanboard.yaml in your project root. Works for any user who can see the project — does not require admin permissions. Use the returned user_ids to assign tasks (create_task owner_id), add comments, etc. |
| move_columnA | Reorder a column on the Kanboard project board. Provide column_id and the new 1-based position (required — no default). Returns { ok: true, column_id, position } on success. |
| move_swimlaneA | Reorder a swimlane within a Kanboard project. Provide swimlane_id and the new 1-based position (required — no default). Returns { ok: true, swimlane_id, position } on success. |
| move_task_positionA | Move a Kanboard task to a different column, position, or swimlane. Provide exactly one of column_id or column_name (column_name is resolved case-insensitively). If swimlane_id is omitted, it is resolved from .kanboard.yaml or the first active swimlane. Project is resolved from explicit project_id or project_identifier, or from .kanboard.yaml. Returns { ok: true } on success. |
| remove_project_userA | Unlink a user from a Kanboard project (does not delete the user). DESTRUCTIVE on the project-user relationship — requires explicit |
| update_columnA | Update an existing Kanboard column (partial update). At least one field besides 'column_id' must be provided — otherwise VALIDATION_ERROR. NOT for reordering — use move_column instead. Returns { ok: true } on success. |
| update_commentA | Update the body of an existing Kanboard comment. Returns { ok: true, comment_id } on success. |
| update_projectC | Update an existing Kanboard project (partial update). At least one field besides 'project_id' must be provided — otherwise VALIDATION_ERROR. Returns { ok: true } on success. |
| update_subtaskB | Update an existing Kanboard subtask (partial update). Both 'subtask_id' and 'task_id' are required as identity fields. At least one of title, status, user_id, time_estimated, or time_spent must also be provided. Status: 0 = todo, 1 = in progress, 2 = done. |
| update_swimlaneA | Update an existing Kanboard swimlane (partial update). At least one field besides 'swimlane_id' must be provided — otherwise VALIDATION_ERROR. NOT for reordering — use move_swimlane instead. Returns { ok: true, swimlane_id } on success. |
| update_taskB | Update an existing Kanboard task (partial update). At least one field besides 'task_id' must be provided — otherwise VALIDATION_ERROR. Column and swimlane changes must use move_task_position instead. Returns { ok: true } on success. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ErnestoCorona/kanboard-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server