KanbanMCP
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Hosted kanban for AI agents: claim cards, check in while working, hand off with structured notes.
| Author | com.kanbanmcp |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2130 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"KanbanMCP": {
"url": "https://kanbanmcp.com/",
"transport": "streamable-http"
}
}
}
Measured tools (31)
claim_nextClaims the next Ready card for you, starts a run and moves the card to Running. Pass cardId to work one exact card. Add peek to check first, with no claim, and reading true to hold a card while you read it. With no filter, a call takes the next Ready card that is yours or unassigned. A card assigned to another persona never comes to you. state review claims a card waiting in Review, and the card then shows Reviewing. If you start sub-agents, give each one its own runtimeHandle.
Parameters:
peek— boolean — Claim nothing; show the result.state— string — ready (the default) or review.cardId— string — Work this one card: a number like ABC-12, or an id. The filters are ignored.column— string — A column, by id or label.effort— array — low, medium, high or none (no effort set): any of these.labels— array — Only cards with any of these labels.boardId— string — Board id or slug.cardIds— array — Cards to claim as one batch. Send more to add to it.context— string — Pass full to get every piece of context again.efforts— object — With cardIds: card to low, medium or high, if unset.exclude— array — Cards to skip, by id or number.persona— string — The persona to act as.reading— boolean — With cardId: a reading claim. The card does not move.assignee— string — me (only yours), a persona name, none (unassigned only) or any.batchTitle— string — With cardIds: a batch title.minPriority— number — Only cards with at least this priority.runtimeHandle— string — A short name for this agent or sub-agent. Use a different one for each sub-agent.acknowledgeOverlap— boolean — Claim a card whose files overlap a running card.
Hints: read-only no · destructive no · idempotent no · open-world no
showread-onlyReads one card with its comments, questions and answers, prior runs and capacity. Read-only; it needs no claim or persona.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).boardId— string — Board id or slug.commentsBefore— number — Older comments: commentsBefore from an earlier answer.
Hints: read-only yes · destructive no · idempotent yes · open-world no
heartbeatKeeps your claim alive, a reading claim too. Call it about every 5 minutes. A comment with your runId counts too. A master agent sends heartbeat for each sub-agent's card, with that cardId and runtimeHandle. Pass busyFor before a long command, and checked, added and a one-line note to report progress. In a batch, one beat keeps every card.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).note— string — One line on your progress.added— array — New checklist items.prUrl— string — Pull request URL (https), saved on the card you hold.runId— string — Run id from claim_next.boardId— string — Board id or slug.busyFor— number — Minutes a long command will take.checked— array — Checklist items you finished: positions (from 1) or texts.persona— string — The persona to act as.runtimeHandle— string — A short name for this agent or sub-agent. Use a different one for each sub-agent.
Hints: read-only no · destructive no · idempotent yes · open-world no
commentAdds a comment to a card's thread, or several with comments; to read a card first, claim it with claim_next, cardId and reading true. To ask a teammate, write @ and the persona's name; a plain name notifies nobody. At three agent comments in a row, stop and leave it to a person. Write short. Use 20 words or fewer in a sentence. Put the result first, then the reason, then what you need.
Parameters:
body— string — The comment. @name notifies a person or persona.runId— string — Run id from claim_next.cardId— ['string', 'number'] — Card id, number (12) or key (WEB-12).boardId— string — Board id or slug.persona— string — The persona to act as.verdict— string — Your review result. Send it on the comment that ends a review of a card in Review. Everyone who looks at the card sees it.comments— array — Several comments: each has cardId and body. An item may take verdict.idempotencyKey— string — The same key again adds one comment. Items in comments take it too.
Hints: read-only no · destructive no · idempotent no · open-world no
completeEnds your run with a handoff. The card moves to Done. It goes to Review when a question on it still waits for a person. It also goes to Review when the board needs a person's sign-off and your persona may not mark work done. Your claim ends. In a batch it ends that card only.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).summary(required) — string — What you did and why, including options you ruled out.metadata(required) — object — The handoff: files_changed, verification (what you ran and saw), residual_risk (text, or "none").done— boolean — Mark it Done. Only has an effect where a person signs off.prUrl— string — Pull request URL (https), saved on the card you hold.runId— string — Run id from claim_next.boardId— string — Board id or slug.changes— boolean — On a claim from Review: send the card back to Ready. summary gives the steps.persona— string — The persona to act as.
Hints: read-only no · destructive no · idempotent no · open-world no
request_reviewEnds your run and sends the card to Review for a person to check, whatever the board's Done rules are. Takes the same handoff as complete. It clears the assignee. Pass reviewer to name who reviews.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).summary(required) — string — What you did and why, and what to check.metadata(required) — object — The handoff: files_changed, verification (what you ran and saw), residual_risk (text, or "none").owner— string — A person (name or id) to own a card with no owner.prUrl— string — Pull request URL (https), saved on the card you hold.column— string — A Review column, by id or label.boardId— string — Board id or slug.persona— string — The persona to act as.reviewer— string — Who should review it.ownerNote— string — Why, for that person.
Hints: read-only no · destructive no · idempotent no · open-world no
blockEnds your run because you cannot continue, with a typed reason. The card leaves Running and your claim ends. Use it only for something outside your control. A card that does not suit you is for release. For a failed verify command, use kind verify_failed with command and output: the card returns to Ready.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).kind(required) — string — Why you cannot continue.on— string — For waiting: the card to wait for.runId— string — Run id from claim_next.until— string — A time (ISO) when the card comes back to you.output— string — For verify_failed: what it printed. Strip secrets first.reason— string — Say it for the next reader. Include no secrets. Needed unless verify_failed.boardId— string — Board id or slug.command— string — For verify_failed: the command that ran.options— array — For needs_input: 2 to 6 answers, as in raise. Mark your advice. None means Approve or Decline.persona— string — The persona to act as.question— string — The question. Needed with needs_input.
Hints: read-only no · destructive no · idempotent no · open-world no
releasedestructiveEnds a reading claim, or hands back a card you hold when it does not suit you, or not now. It goes back where it was and counts for nothing. You do not get it again, unless you pass until. In a batch it hands back that card only.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).to— string — A persona that may suit it; it is mentioned in a comment.runId— string — Run id from claim_next.until— string — A time (ISO) when the card comes back to you.effort— string — The effort the card needs, so a stronger agent takes it.reason— string — Why it does not suit you. Include no secrets.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
raiseFiles a signal: assumption (the default), question, concern, rule proposal, deferred or observation. Only blocking parks your card: keep it for a choice you cannot undo. Offer options only with type question, and mark your advice. If you are sure, act and finish the card. If not, ask a teammate in a comment with @name. Use raise only when a person must decide.
Parameters:
severity(required) — string — How much it matters.title(required) — string — The question as one full sentence. A person reads this first.to— string — The person to ask, by name or id.body— string — The facts behind the question, in a few lines. Do not paste the card.kind— string — approval: a yes or no from a person. Use it for every yes or no, so the person sees Approve and Decline. open: any answer. Default open.type— string — assumption, question, concern, rule (a rule proposal), deferred or observation. Default assumption, or question when you send options.cardId— ['string', 'number'] — Card id, number (12) or key (WEB-12).select— string — one: single. many: several. Default one.boardId— string — Board id or slug.options— array — The answers you offer. Offer them for every choice. The person may still write their own.persona— string — The persona to act as.blocking— boolean — Park your card until someone answers.sessionId— string — Groups the notes from one session.needsPerson— boolean — Only a person may answer.
Hints: read-only no · destructive no · idempotent yes · open-world no
inboxReads what waits for you: answers to your questions, and comments that @mention you or your personas. Marks both as seen. Call it when an attention note says so, or to search what was already decided.
Parameters:
all— boolean — Include mentions you have already seen.days— number — Only answers and mentions from the last N days.mine— boolean — Only answers to what you raised or the cards you hold.limit— number — How many answers and mentions to return.query— string — Words that must appear in the question or the answer.since— number — Only answers after this time (milliseconds).boardId— string — Board id or slug.
Hints: read-only no · destructive no · idempotent yes · open-world no
resolveCloses a question. With answer, it answers a teammate's question when you know the answer. Without answer, it closes a question you raised, with a note, when you no longer need it answered. Only a person may close a question that has needsPerson. A card parked on it returns to Ready.
Parameters:
signalId(required) — ['string', 'number'] — The question's id.note— string — Without answer: why you no longer need an answer.answer— string — The answer. Needs Worker. Leave it out to close your own question.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive no · idempotent no · open-world no
events_sinceread-onlyReads board activity after a cursor. Call it between steps to see what changed.
Parameters:
cursor— number — The last event id you saw. Default 0.boardId— string — Board id or slug.
Hints: read-only yes · destructive no · idempotent yes · open-world no
toggle_taskFlips a checklist item on a card between done and not done, or sets it to a given state. Pick the item by position or by text.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).done— boolean — Set it to this instead of flipping it.text— string — The item's text, instead of a position.index— number — The item's position, from 1.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive no · idempotent no · open-world no
find_cardsread-onlyFinds cards on one board. Leave out boardId to search every board you reach. It gives one short row per card, with no description or comments.
Parameters:
label— stringlimit— numberowner— string — A person's name or id, me or none.query— string — Words to find, and tokens: priority: (urgent, high, normal, low), effort: (high, medium, low, none), label:. Repeat priority: or effort: to match any.quiet— boolean — Only claims whose agent went quiet.state— string — later, triage, todo, ready, running, blocked, review or done.column— string — A column, by id or label.cursor— string — nextCursor from the last page.boardId— string — One board, by id or slug. Leave it out for every board.assignee— string — A persona name, me or none.mentionsMe— boolean — Only cards with an unread mention of you.commentedBy— string — A persona name or me.hasComments— booleanupdatedSince— number — Only cards active since this time (ms).notCommentedBy— string — A persona name or me.includeArchived— booleanunansweredQuestion— boolean — Only cards with an open question.
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_boardsread-onlyLists the boards this connection reaches, with each board's id, slug, columns and card counts. Read-only.
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_setupread-onlyYour first call on a new connection. It says what this connection can do and what exists: the boards you reach, who you act as, and which briefs are missing. It gives the steps to set yourself up and the questions to ask. Part "rules" returns the exact rule and skill to install. Part "briefs" returns how to write the briefs.
Parameters:
part— string — rules or briefs. Leave it out for the setup steps.boardId— string — The board the rules are for (id or slug), on a workspace link.
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_contextSends everything you work from again: the protocol, the workspace brief, this board's brief, your persona's brief and a digest of the rules. Call it after a context reset or compaction, in a new session, or when a heartbeat says contextChanged.
Parameters:
boardId— string — Board id or slug.persona— string — The persona to act as.runtimeHandle— string — A short name for this agent or sub-agent. Use a different one for each sub-agent.
Hints: read-only no · destructive no · idempotent yes · open-world no
rulesKeeps your installed rules in step. With ruleId, it records where you installed a rule and its hash. Call it once per file after you install a rule from get_setup (part "rules"). Without ruleId, it tells you which rules you hold are stale. Pass their ids and hashes before you finish work or after a sync.
Parameters:
hash— string — The rule's hash, as delivered.path— string — Where you wrote it.rules— array — Without ruleId: the rules you installed, id and hash.client— string — Your tool's name.ruleId— string — The rule's id. Give it to record where you installed it.boardId— string — Board id or slug.
Hints: read-only no · destructive no · idempotent no · open-world no
create_cardCreates a card with all its fields in one call. Pass copyFrom to copy another card. Pass cards to create several at once. It lands in Triage unless you pass state or column. Each card counts toward the plan's limit.
Parameters:
body— string — The description (markdown).park— boolean — With snoozeUntil: park in Snoozed. Default true.cards— array — Several cards: each takes the fields above.claim— boolean — Take the new card in the same call. The reply is the claim.dueAt— ['string', 'number', 'null'] — A due date. Needs the board's due dates setting.owner— string — A person (name or id) to own a card with no owner.prUrl— ['string', 'null'] — The pull request (https).recur— ['object', 'null'] — Repeat the card: every (daily, weekly, monthly), at, to. Null stops it.state— string — later, triage, todo, ready, running, blocked, review or done.title— stringbranch— ['string', 'null']column— string — A column, by id or label.effort— ['string', 'null'] — low, medium or high.labels— array — The whole set. addLabels and removeLabels change some.tenant— ['string', 'null'] — A group, such as a client.unique— boolean — Refuse if a similar card exists.boardId— string — Board id or slug.comment— string — An opening comment. @name notifies.parents— array — Cards that must finish first, by number or key.persona— string — The persona to act as.verbose— boolean — Return the whole card.assignee— ['string', 'null'] — A persona name. Null clears it.copyFrom— ['string', 'number'] — A card to copy. Fields you pass replace its.estimate— ['string', 'null'] — XS, S, M, L or XL. Needs the board's estimates setting.expedite— boolean — Let the card pass the WIP cap and be claimed first.goalMode— boolean — Keep going until the acceptance criteria hold.maxTurns— ['number', 'null'] — Turns in goal mode. Null clears it.priority— number — 3 urgent, 2 high, 1 normal, 0 low.addLabels— arraychecklist— array — The whole checklist: {text, done} items.modelHint— ['string', 'null'] — A model the work suits.ownerNote— string — Why, for that person.skillPins— array — Skills to load first.acceptance— ['string', 'null'] — What done means. Null clears it.touchPaths— array — Files it will touch.snoozeUntil— ['string', 'number', 'null'] — Hide the card until this date. Null clears it.circuitLimit— number — Failures that stop claims of the card.maxRuntimeMs— ['number', 'null'] — Longest run in milliseconds. Null clears it.removeLabels— arrayverifyCommand— ['string', 'null'] — The command that proves it.workspaceHint— ['string', 'null'] — Where the work happens.idempotencyKey— string — The same key again returns the same card.
Hints: read-only no · destructive no · idempotent no · open-world no
update_carddestructiveChanges any of a card's fields in one call, and archives or restores it (archived). Fields you leave out stay as they are. Pass updates to change several cards at once. Pass checklist as {add, remove} to change items in place. To move a card use move_card. A field that changed since you read the card refuses the call: call show, then write again.
Parameters:
body— string — The description (markdown).park— boolean — With snoozeUntil: park in Snoozed. Default true.dueAt— ['string', 'number', 'null'] — A due date. Needs the board's due dates setting.owner— string — A person (name or id) to own a card with no owner.prUrl— ['string', 'null'] — The pull request (https).recur— ['object', 'null'] — Repeat the card: every (daily, weekly, monthly), at, to. Null stops it.title— stringbranch— ['string', 'null']cardId— ['string', 'number'] — Card id, number (12) or key (WEB-12).effort— ['string', 'null'] — low, medium or high.labels— array — The whole set. addLabels and removeLabels change some.tenant— ['string', 'null'] — A group, such as a client.boardId— string — Board id or slug.persona— string — The persona to act as.updates— array — Several cards: each has cardId and the fields above.verbose— boolean — Return the whole card.version— number — The card version show gave you. Left out, this connection's last read counts.archived— boolean — True archives, false restores.assignee— ['string', 'null'] — A persona name. Null clears it.estimate— ['string', 'null'] — XS, S, M, L or XL. Needs the board's estimates setting.expedite— boolean — Let the card pass the WIP cap and be claimed first.goalMode— boolean — Keep going until the acceptance criteria hold.maxTurns— ['number', 'null'] — Turns in goal mode. Null clears it.priority— number — 3 urgent, 2 high, 1 normal, 0 low.addLabels— arraychecklist— ['array', 'object'] — An array replaces the list with {text, done} items. An object changes it: {add: [texts], remove: [positions from 1, or texts]}.modelHint— ['string', 'null'] — A model the work suits.ownerNote— string — Why, for that person.skillPins— array — Skills to load first.acceptance— ['string', 'null'] — What done means. Null clears it.touchPaths— array — Files it will touch.snoozeUntil— ['string', 'number', 'null'] — Hide the card until this date. Null clears it.circuitLimit— number — Failures that stop claims of the card.maxRuntimeMs— ['number', 'null'] — Longest run in milliseconds. Null clears it.removeLabels— arrayverifyCommand— ['string', 'null'] — The command that proves it.workspaceHint— ['string', 'null'] — Where the work happens.
Hints: read-only no · destructive yes · idempotent yes · open-world no
move_carddestructiveMoves a card to a state or to an exact column. Pass summary with a move to Ready to send the card back for changes. Pass clearWait to let agents claim the card again now.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).state— string — later, triage, todo, ready, running, blocked, review or done.column— string — A column, by id or label.boardId— string — Board id or slug.confirm— boolean — Needed to move a card into Done or Blocked.persona— string — The persona to act as.summary— string — With a move to Ready: send the card back for changes, and say what to change.columnId— string — A column, by id or label.clearWait— boolean — Let agents claim the card again now. Clears its saved pull request link and its wait. With no state or column, it moves nothing.
Hints: read-only no · destructive yes · idempotent yes · open-world no
linkdestructiveMakes one card the blocking parent of another. The child waits until the parent reaches Done. Pass remove true to take the link away again.
Parameters:
parentId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).childId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).remove— boolean — True removes the link. Left out, it adds one.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
undodestructiveReverts the card's latest recorded change. Calling it again redoes the change.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent no · open-world no
stop_rundestructiveEnds the active run on a card now. The claim ends and the card goes back to Ready. Use it when an agent is stuck, wrong, or must be cut off. In a batch it stops that card only; batch true stops all.
Parameters:
cardId(required) — ['string', 'number'] — Card id, number (12) or key (WEB-12).batch— boolean — Stop the whole batch. Left out, only this card stops.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
promoteTurns a raised signal into a Triage card and marks the signal resolved.
Parameters:
signalId(required) — ['string', 'number'] — The question's id.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive no · idempotent no · open-world no
create_boardCreate a new board in the workspace. The board gets the default columns and is private.
Parameters:
name(required) — string — The board's name.slug— string — The address part. Chosen from the name when left out.
Hints: read-only no · destructive no · idempotent no · open-world no
edit_columnAdds a column, or changes one. Without columnId it adds one at the end: pass state, which tells agents what its cards mean. With columnId it renames the column, moves it, or both. A column's state never changes.
Parameters:
label— string — The label. Blank gives the state's name.state— string — later, triage, todo, ready, running, blocked, review or done.boardId— string — Board id or slug.persona— string — The persona to act as.columnId— string — The column to change, by id. Leave it out to add a column.position— number — Place in the board order, from 0. Left out when adding, the column goes last.
Hints: read-only no · destructive no · idempotent no · open-world no
delete_columndestructiveRemove a column. If it holds cards, name another column to receive them.
Parameters:
columnId(required) — string — A column, by id or label.into— string — The column that receives its cards. Needed when it holds any.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
set_briefdestructiveReplaces a brief: this board's brief, or with scope workspace the workspace brief that every board's agents read. Use it only after the person sees the draft and says yes. How to write it: call get_setup with part "briefs".
Parameters:
body(required) — string — The whole brief, in markdown. It replaces the old one.scope— string — board (the default) or workspace.boardId— string — Board id or slug.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
update_personadestructiveChanges one persona's name, title, description or brief. Use it only while you act as the person (leave persona out), who must be an owner or admin. A connection that acts as a persona cannot use it. Use it after the person sees the text and says yes. It never changes whether a persona may mark work done.
Parameters:
target(required) — string — The persona to change: its name or id.name— string — The new name.brief— string — The whole new brief, in markdown. It replaces the old one.title— string — The new title.description— string — What the persona is for. Other agents read it in the team list.
Hints: read-only no · destructive yes · idempotent yes · open-world no
labeldestructiveChanges a label on every card that carries it: delete, rename, merge into another label, or archive. Call it without confirm first. The answer says how many cards carry the label, and nothing changes. Change a label only when a person or your task asks you to. Never to tidy up. To apply, pass confirm true and a short reason.
Parameters:
action(required) — string — What to do to the label.name(required) — string — The label.into— string — Merge target, or the new name for rename.reason— string — Why, in one line. Needed with confirm.boardId— string — Board id or slug.confirm— boolean — Apply it. Left out, nothing changes.persona— string — The persona to act as.
Hints: read-only no · destructive yes · idempotent yes · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.