MCP tools
The kanman MCP server: address, sign-in and every tool with its inputs, results and errors.
kanman’s MCP server (Model Context Protocol) lets Claude Code, Codex and other MCP clients work in kanman as you: on stories, decisions, runs and outcomes, and in your conversation with kanman. Inside a run, kanman gives the coding agent its own connection to the story-work tools. The setup is described in Use kanman from Claude Code or Codex.
Address and sign-in
| Property | Value |
|---|---|
| Address | https://api.kanman.ai/functions/v1/mcp, one address for your whole workspace |
| Transport | Streamable HTTP, JSON responses, no session and no event stream |
| Sign-in | OAuth 2.1 with PKCE. Your MCP client registers itself, opens the browser for you to sign in and allow it, and renews its access on its own. Access lasts an hour and renews without asking you again. |
| Workspace | The one you pick when you allow the client. Disconnect it in Your settings > API tokens > Connected apps. |
| CI and scripts | A workspace API token from Your settings > API tokens as Authorization: Bearer <token>. It covers whoami and the story-work tools. |
| Inside a run | A token kanman creates for that run attempt only. You never see it. |
claude mcp add --transport http --scope user kanman https://api.kanman.ai/functions/v1/mcp
codex mcp add kanman --url https://api.kanman.ai/functions/v1/mcp
Every tool acts with your role in the workspace. A viewer can use the reading tools only. Every change is recorded in the audit log as you, with the name of the client.
Which team a call is about
Team tools take team (the team’s address name, key or name) or repository (your checkout’s git remote get-url origin); kanman picks the team that works on that repository. Tools that take a storyKey find the story’s team on their own. If your workspace has one team, you can leave both out. Call whoami first: it lists your teams and names the one of your repository.
Tools at a glance
| Tool | Purpose |
|---|---|
whoami |
Who you are, your role, your teams and the team of your repository. |
| Board | |
search_stories |
Find stories in every column, of one team or all of them. |
create_stories, get_drafts, write_stories |
Hand kanman a requirement; it drafts stories with acceptance criteria; approve them onto the board. |
refine_story |
Change title, size, acceptance criteria, test plan and Demonstrate. |
move_story |
Move a story; Ready goes through the outcome gate. |
prioritise_story |
Set the class of service (expedite, fixed date, …). |
close_story, reopen_story |
Close without delivering, or reopen. |
| Decisions | |
list_decisions, get_decision, answer_decision |
See what waits for a person and answer it. |
get_brief, answer_brief_item, why |
kanman’s brief: what needs you today, one answer for every story an item covers, why kanman did something on its own. |
| Conversation | |
ask_kanman, get_kanman_reply, act_on_card |
Talk to kanman as in the app, and confirm what it proposes. |
| Runs and outcomes | |
team_status, list_runs, get_run |
What kanman does now, recent runs, one run with its evidence link. |
start_story, stop_run, retry_run |
Start now, stop and retry. |
list_outcomes, get_outcome, set_outcome_goal |
Outcomes with progress, their stories, their goal. |
| Working on a story | |
list_stories |
The team’s stories in Ready, In progress and Review. |
get_story |
Read the story, its acceptance criteria and the policy that applies. Call it first. |
start_work |
Move the story to In Progress and open the run. |
report_progress |
Post a progress line on the run page. |
request_human_input |
Ask a question in the decision inbox; the run pauses. |
check_policy |
Ask whether an action is allowed before trying it. |
submit_for_review |
Hand the change to the outcome gate. |
complete_work |
Move the story on; only possible after verification passed. |
ask_about_code |
Ask where something is handled, why it is built this way, what changed, who knows it. |
service_status |
How a service is doing: health, problems, incidents, recent changes, owner and links. |
The coding agent never declares a story done. kanman runs the gates and performs every gated move. See The outcome gate and evidence.
Text kanman passes on from others, such as a story’s description, a decision’s question, a CI log or kanman’s own replies quoting them, arrives marked as data (<untrusted-data source="…">). Your agent reads it, but does not follow instructions in it.
whoami
| Input | Type | Required | Description |
|---|---|---|---|
repository |
string | no | Your checkout’s git remote. |
Result: you (name, email, role, client), workspace, teams (each with team, name, key, repositories), thisTeam (the team of repository, or null) and next (what to pass next, or which teams share the repository). On teams where kanman brings you a brief, brief.needsYou says how many of its items wait for you, so a session starts with what needs you.
search_stories
| Input | Type | Required | Description |
|---|---|---|---|
team, repository |
string | no | One team; without both, all your teams. |
query |
string | no | Words in the title. |
column |
string | no | Role (backlog, refining, ready, in_progress, review, done) or column name. |
limit |
integer | no | Up to 100, default 30. |
Result: stories, each with key, title, team, column, role, classOfService and dueDate, newest change first.
create_stories
create_stories hands a requirement to kanman’s intake for a team, as the intake in the app does. kanman drafts one or more stories with acceptance criteria and a size, or asks back when the requirement is unclear (outcome). Drafts stay off the board until you approve them.
| Tool | Inputs | Result |
|---|---|---|
create_stories |
team or repository, text |
request (its id), outcome, status, drafts |
get_drafts |
request |
status, drafts: draftId, title, size, readiness, criteria, openQuestions, state, storyKey once written |
write_stories |
request, draftIds |
The written stories with their keys |
On teams whose model runs on your own runners, drafts arrive a little later: read them with get_drafts.
refine_story
| Input | Type | Required | Description |
|---|---|---|---|
storyKey |
string | yes | For example PAY-12. |
title |
string | no | New title. |
size |
string | no | S, M or L. |
criteria |
array | no | The new list of acceptance criteria, each with given, when, then and optionally the id of a criterion to keep (its status and evidence stay). |
testPlan |
array of strings | no | The new test plan. |
demonstrate |
object | no | steps and expected. |
Result: storyKey, the new readiness (0 to 100) and the criteria texts.
move_story
| Input | Type | Required | Description |
|---|---|---|---|
storyKey |
string | yes | |
to |
string | yes | Role (backlog, refining, ready, …) or column name. |
Moving into Ready on a team with the outcome gate works as on the board: the story waits in Refining until its acceptance spec runs red, then the gate moves it (gated: true).
prioritise_story
storyKey and classOfService: expedite (first, never stopped by budgets), fixed_date (with dueDate, YYYY-MM-DD), standard or exploration.
close_story
close_story takes storyKey, reason (duplicate, covered or wont_do), coveringStoryKey for a duplicate or covered story, and an optional note. reopen_story takes storyKey.
list_decisions
| Tool | Inputs | Result |
|---|---|---|
list_decisions |
team or repository (optional), limit |
Pending decisions, oldest first: decisionKey, kind, title, team, storyKey, runKey, waitingSince; heldByKanman: how many questions kanman is still settling itself |
get_decision |
decisionKey |
question, options (id, label, recommended), recommended, storyKey, runKey, status |
answer_decision |
decisionKey, optionId, note |
The answer as kanman recorded it |
Every place shows the same decisions: a question kanman is still settling itself (its own review, or its steward checking the evidence) is missing from the list, the app, Slack and Teams alike, until it needs you. heldByKanman tells you how many there are.
An answer has the same effect as in the app: an approved plan starts the run, an approved merge merges, a resumed run continues.
get_brief
| Tool | Inputs | Result |
|---|---|---|
get_brief |
team or repository (optional: all your teams) |
needsYou, and per team briefs[]: items (itemId, category decision or access, state, ask, unblocks, options with id, label, then and recommended, answered once answered), handledToday, progress, open (the team chat) |
answer_brief_item |
itemId, optionId |
The decisions it answered (decisions) |
why |
storyKey (optional), team or repository, language |
answer: the latest thing kanman did on its own about the story or team, and what it rested on |
The brief is the same one you see in the team chat, in Slack and in Microsoft Teams. One answer applies to every story the item covers and shows everywhere within seconds. Viewers can read the brief but not answer it. Teams without a brief are listed under withoutBrief; list_decisions shows what waits there.
ask_kanman
| Tool | Inputs | Result |
|---|---|---|
ask_kanman |
message; team or repository, or general: true for General; language (en, de, es, fr) |
messageId, reply, and a card when kanman proposes a change; status: working while a runner answers |
get_kanman_reply |
messageId |
The reply as it is now |
act_on_card |
messageId, action (confirm, cancel, retry) |
What kanman did |
The message lands in your own conversation with kanman, in the team’s session or in General, and you see it in the app too. What needs me? is answered at once with kanman’s brief (source: brief), like get_brief.
team_status
| Tool | Inputs | Result |
|---|---|---|
team_status |
team or repository |
What kanman does on the team now, or why it is idle; the run slots and the stories waiting for one |
list_runs |
team or repository, limit |
Recent runs: runKey, storyKey, status, stage, attempt |
get_run |
runKey |
Status, stage, attempts, cost and budget, branch, merge request, the verification gates and page, the link to the run page with its evidence |
start_story |
storyKey |
Start now: started, or what the story needs first |
stop_run |
runKey |
The stopped run |
retry_run |
runKey, moreSteps |
A new attempt; moreSteps gives the agent more turns when it ran out |
list_outcomes
| Tool | Inputs | Result |
|---|---|---|
list_outcomes |
team or repository |
Each outcome with its counts (done, in progress, queued, waiting for people, blocked) |
get_outcome |
outcome (address name or title), team |
goal, successCriteria, status, stories in order with their columns |
set_outcome_goal |
outcome, goal, successCriteria |
The stored goal |
Which story a story-work tool acts on
Every story-work tool except list_stories and ask_about_code takes an optional storyKey (for example PAYME-3). Without it, a call acts on the story you started with start_work. If you have not started one yet, get_story and start_work take the next story in the team’s Ready column that nobody works on (“take the next story”). Inside a run, the tools always work on the run’s story.
list_stories
Lists the team’s stories in Ready, In progress and Review, in board order. Inputs: team or repository.
{
"stories": [
{ "key": "PAYME-3", "title": "Show the invoice total in the list", "column": "Ready", "role": "ready", "readiness": 100, "workingOnIt": false }
]
}
workingOnIt is true when someone already works on the story.
get_story
Returns the story, its acceptance criteria and Demonstrate block, the test plan, the current run and a summary of the team policy. No inputs.
Example result:
{
"story": {
"key": "SBX-12",
"title": "Export invoices as CSV, filtered by date range",
"description": "Customers need to export their invoices for their accountant.",
"acceptanceCriteria": [
{
"id": "ac-1",
"text": "Given a customer with 3 invoices in March, When they export March as CSV, Then the file has 3 rows and the columns date,number,amount"
}
],
"demonstrate": {
"kind": "ui",
"steps": ["open /invoices", "pick 2026-03-01..2026-03-31", "click Download CSV"],
"expected": "a CSV downloads with columns date,number,amount"
},
"testPlan": ["unit: CSV serializer", "e2e: download flow"],
"affectedAreas": ["src/invoices/**"]
},
"run": {
"runKey": "run-7f3k",
"attempt": 1,
"phase": "implement",
"stage": "implementing",
"branch": "kanman/sbx-12-export-invoices-as-csv-filtered-by-date-range",
"status": "running"
},
"policy": {
"preset": "balanced",
"deniedPaths": ["infra/**", "**/*.tf", ".github/workflows/**", ".kanman/acceptance/**"],
"maxChangedFiles": 30,
"maxChangedLines": 800,
"runBudgetCents": 200,
"planApproval": "always",
"requireAcceptanceSpec": true,
"repositories": ["kanman-ai/pilot-sandbox"]
}
}
run is null until a run exists. phase is plan while a run waits for plan approval and implement afterwards.
start_work
Moves the story from Backlog, Refining or Ready to the In Progress column and returns the run. Locally, the first call opens a run for the story, so progress, verification and the evidence pack work as for kanman’s own runs. No inputs.
| Result field | Description |
|---|---|
runKey |
The run, for example run-7f3k. |
branch |
The run’s branch inside a kanman run; null for a local run, which uses your own branch. |
movedToInProgress |
true when the story was moved. |
next |
What to do next. |
While a kanman run is still planning (the team requires plan approval and the plan is not approved yet), start_work refuses: the agent writes the plan and ends its turn, and the plan goes to the decision inbox. Local runs have no planning phase.
report_progress
Posts one line to the progress updates on the run page and sets the run’s stage.
| Input | Type | Required | Description |
|---|---|---|---|
stage |
string | yes | planning, implementing or verifying. |
message |
string | yes | One sentence for the team, up to 2,000 characters. |
approaches |
array | no | For complex stories: the 2 or 3 approaches compared while planning. Each has title, score (0 to 10, higher is better), chosen (exactly one is true) and an optional why (one sentence on the trade-off). They appear under the plan in the evidence pack and in the evidence comment on the pull request. |
Result: { "recorded": true }, with "approaches": 2 (or 3) when approaches were recorded.
request_human_input
Asks a question in the decision inbox (decision kind clarification) and pauses the run until someone answers. The answer comes back to the run as input when it continues.
| Input | Type | Required | Description |
|---|---|---|---|
question |
string | yes | The question, up to 4,000 characters. |
options |
array of strings | no | 2 to 4 answer options. Without them, the decision offers “Answer” and “Stop this run”. |
recommendedIndex |
integer | no | Index (0 to 3) of the option the agent recommends. |
asks |
string | yes | What the question asks for: intent, scope, spec, access, host, permission, fact or base (whether failures are the main branch’s). It decides who gets the question. A call without it is still taken: kanman then reads the kind from the question. |
{ "decisionKey": "dec-4h2k", "next": "Your question is in the team inbox. End your turn now; the run continues with the answer." }
A fact or base question is settled by checking, not by asking: kanman answers with how to find it out (read the code, run the test, read the CI job, compare with the main branch). If the agent tried and still cannot know, it asks again and the question reaches the person who knows the code:
{ "answered": false, "settleYourself": true, "kind": "fact", "next": "This asks for a fact the world can settle, so I do not ask a person for it. …" }
check_policy
Asks whether an action is allowed before the agent tries it, for example “may I touch infra/?”. The answer uses the same rules kanman applies later to the final diff. Every call is recorded in the audit log as policy_decision.
| Input | Type | Required | Description |
|---|---|---|---|
kind |
string | yes | path, repo, diff_size, budget, hours, concurrency, plan_approval or merge. |
subject |
string | yes | What is checked: a repository path (infra/alarms.tf), a repository (acme/billing or github:acme/billing@main), a diff size as <files>:<lines> (12:340), a story size for plan_approval, or the number of changed lines for merge. |
amountCents |
integer | for budget |
The projected spend of the run in euro cents. |
escalate |
boolean | no | With true, an action that needs a human opens the matching decision and pauses the run. |
| Result field | Description |
|---|---|
allowed |
true or false. |
authority |
AUTO, NOTIFY or ESCALATE. See the authority table. |
reasonKey |
Reason as a key, for example policy.path.denied. |
reasonParams |
Values for the reason, for example the path, the matching rule and the preset. |
decisionKind |
Set when a human can lift the denial, for example touch_denied_path. |
decisionKey |
The decision that was opened, when escalate was true; otherwise null. |
{
"allowed": false,
"authority": "ESCALATE",
"reasonKey": "policy.path.denied",
"reasonParams": { "path": "infra/alarms.tf", "glob": "infra/**", "preset": "balanced" },
"decisionKind": "touch_denied_path",
"decisionKey": null
}
submit_for_review
Tells kanman that the work is committed (and pushed, if you can). The summary is kept for the evidence pack. Inside a kanman run, verification starts when the agent ends its turn; a local run is finished right away and verification starts. kanman then runs the gates (the acceptance spec against a fresh environment, the diff guard and the diff limits, CI and the review) and moves the story to Review only when they pass. The result appears on the run page.
| Input | Type | Required | Description |
|---|---|---|---|
summary |
string | yes | What changed and how it meets each acceptance criterion. |
branch |
string | no | The branch the work is on. |
baseBranch |
string | no | The branch the change targets, for example main. |
diff |
string | for teams without a repository | The unified diff of the change (git diff main...HEAD). From your own checkout, kanman reviews this diff. |
prUrl |
string | no | The pull or merge request URL, if you opened one. |
prNumber |
integer | no | The pull or merge request number, if you opened one. |
{ "submitted": true, "next": "Verification has started; the run page shows the evidence." }
If a gate fails, kanman starts an automatic rework attempt with the gate output, as the policy allows.
complete_work
Moves the story to the next column (Review, or Done when the team has no Review column). kanman refuses unless the run has a verification record in which no gate failed and, when the team requires an acceptance spec, the spec proved the outcome. No inputs.
Result: { "completed": true, "movedTo": "<column>" }.
ask_about_code
Asks kanman about the team’s code, with the same answers the team chat gives (see Ask about the code). kanman returns the facts with their links; your agent writes the answer.
| Input | Type | Required | Description |
|---|---|---|---|
question |
string | yes | The question, for example “Where is invoice VAT handled?”, “Why was the export built this way?”, “What changed last week?”, “Who knows billing?” or “How do the repositories fit together?”. A question kanman does not recognise is read as “where is … handled”. |
| Result field | Description |
|---|---|
question |
How kanman understood it: kind (where, why, changed, who or onboarding), topic, and days for “what changed”. |
facts.code |
Places in the code: repository, path, line, link and the matching line. |
facts.changes, facts.commits |
Merged pull or merge requests and commits, with author, time and link. |
facts.decisions, facts.stories |
Decisions and stories with their keys. |
facts.context |
Team context entries (when the team’s context is on). |
facts.people |
People with the reasons: commits:<count>:<repository> or merged:<reference> <title>. |
facts.repos, facts.conventions |
For onboarding: the team’s repositories with the people who work on each, and the team’s conventions. |
facts.codeHost |
ok, none (no repository to read), offline (the team’s runner is offline) or failed. |
Errors
A tool that cannot do what was asked returns a tool result marked isError: true with a readable message. The agent should read it and act on it. Typical messages:
| Message | Meaning |
|---|---|
| No run is active for this story yet. Call start_work first. | The tool needs a run; locally, call start_work first. |
| You are planning this story. Write the plan, end your turn and wait for approval; … | start_work during the planning phase of a kanman run. |
| No verification record yet. Submit for review and wait for verification. | complete_work before the gates ran. |
| Verification failed: … | complete_work after a failed gate; the failing gates are named. |
| Verification has no outcome proof (acceptance spec not green). | complete_work while the acceptance spec has not passed. |
| Invalid arguments: … | An input is missing or has the wrong type. |
| Which team? Pass repository … or team. | The workspace has several teams; name one, or pass your repository. |
| Your role in this workspace is viewer: … | Viewers can use the reading tools only. |
| This tool acts as you in kanman and needs you signed in … | A workspace API token reaches whoami and the story-work tools only. |
Requests the server cannot accept at all (no sign-in, an expired or disconnected client, a token of another workspace) are answered with HTTP 401; your client then asks you to sign in again. See Errors and rate limits.
Related
service_status
How one of the team’s services or systems is doing, with the same facts as the chat’s answer to “How is payment-api doing?” (see Backstage and Checkmk). kanman returns the facts; your agent writes the answer.
| Input | Type | Required | Description |
|---|---|---|---|
service |
string | no | The name, for example payment-api or “Payment API”. Without it, every system of the team with its health. |
| Result field | Description |
|---|---|
found |
Whether a system of that name exists; when not, known lists the names kanman knows. |
status |
Health (down, degraded, ok, unknown), problems from Checkmk and uptime checks (acknowledged and planned downtimes marked), open incidents, recent deploys and merged changes, CI, the Backstage owner with its people, links, dependencies, and when monitoring was last read. |
summary |
The same facts as plain numbered lines. |
systems |
Without service: one row per system with its health, problem and incident counts, owner, latest change and CI. |
Last updated: January 1, 0001
Open kanman