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.

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