name: kanban description: Manage tldw_server Kanban boards via MCP with explicit workflow-status control, safe transitions, lease/approval gates, and recovery primitives for orchestrators. license: MIT
Manages Kanban boards in tldw_server using MCP tools from the kanban module.
Core Rule: Workflow State Is Canonical
For orchestration, treat card.workflow_status as source of truth.
- Canonical state:
kanban_card_workflow_state.workflow_status_key - List placement is projection side effect only (
auto_move_list_id) - Never infer workflow state from list column placement
MCP Tooling
Board/List/Card primitives
kanban.boards.listkanban.boards.getkanban.boards.createkanban.lists.listkanban.lists.createkanban.cards.listkanban.cards.createkanban.cards.movekanban.cards.searchkanban.comments.listkanban.comments.create
Workflow control primitives
kanban.workflow.policy.getkanban.workflow.policy.upsertkanban.workflow.statuses.listkanban.workflow.transitions.listkanban.workflow.task.state.getkanban.workflow.task.state.patchkanban.workflow.task.claimkanban.workflow.task.releasekanban.workflow.task.transitionkanban.workflow.task.approval.decidekanban.workflow.task.events.listkanban.workflow.control.pause(admin)kanban.workflow.control.resume(admin)kanban.workflow.control.drain(admin)kanban.workflow.recovery.list_stale_claimskanban.workflow.recovery.force_reassign(admin)
Safety Contract (Always Enforce)
For workflow write operations:
- Always pass
expected_version(CAS) - Always pass unique
idempotency_key - Always pass
correlation_idon transitions/approval/recovery writes - Re-read state before retries (
kanban.workflow.task.state.get)
Stable conflict codes to handle:
version_conflictlease_requiredlease_mismatchpolicy_pausedtransition_not_allowedapproval_requiredprojection_failedidempotency_conflict
Suggested Status Pipeline (Optional Policy)
Use if the project wants a 7-stage flow:
req -> plan -> review_plan -> impl -> review_impl -> test -> done
Suggested transitions:
req -> planplan -> review_planreview_plan -> implreview_plan -> plan(reject)impl -> review_implreview_impl -> testreview_impl -> impl(reject)test -> donetest -> impl(fail)
Implement this using kanban.workflow.policy.upsert with explicit statuses/transitions.
Default Execution Pattern
No autonomous 7-stage loop is assumed by default. Use explicit step-wise orchestration:
- Load policy and task state (
policy.get,task.state.get) - Claim lease (
task.claim) when required by transition policy - Transition (
task.transition) with CAS + idempotency + correlation - If approval is pending, resolve with
task.approval.decide - Append card comments/checklists as execution notes
- Release lease (
task.release) when complete - Audit/replay via
task.events.list
Pause/Drain/Recovery Runbook
- Pause writes during incidents:
kanban.workflow.control.pause - Resume when safe:
kanban.workflow.control.resume - Drain board for controlled shutdown:
kanban.workflow.control.drain - Find orphaned claims:
kanban.workflow.recovery.list_stale_claims - Reassign ownership when needed:
kanban.workflow.recovery.force_reassign
Minimal MCP Call Shapes
Transition:
{
"name": "kanban.workflow.task.transition",
"arguments": {
"card_id": 123,
"to_status_key": "impl",
"actor": "builder",
"expected_version": 4,
"idempotency_key": "wf-123-transition-0001",
"correlation_id": "run-2026-03-05-001",
"reason": "begin implementation"
}
}
Approval decision:
{
"name": "kanban.workflow.task.approval.decide",
"arguments": {
"card_id": 123,
"reviewer": "inspector",
"decision": "approved",
"expected_version": 5,
"idempotency_key": "wf-123-approval-0001",
"correlation_id": "run-2026-03-05-001",
"reason": "checks passed"
}
}
Notes
- Prefer explicit transitions over direct state patching for normal lifecycle flow.
- Use
task.state.patchonly for controlled admin repair operations. - Keep admin-only tools out of general-purpose agent catalogs.