The complete tool surface exposed by the AI StackWorks MCP server. All content
is exchanged as Markdown strings. Tools that operate on a card take a required
card_id; an unknown or cross-project card_id returns card not found. See
Authentication for how card_id is scoped to your
project.
| Tool | Group | What it does |
|---|---|---|
get_card | Cards | Read a card's content |
update_card | Cards | Save body / properties / status |
create_card | Cards | Open a new card in the Backlog |
approve_card | Cards | Move to Plan Approved |
dispatch_card | Cards | Send to the agent fleet (Ready for Dev) |
get_tasks | Tasks | Read a card's task checklist |
update_tasklist | Tasks | Replace the whole checklist |
create_task | Tasks | Append one task |
create_idea | Ideas | Capture a new idea |
list_ideas | Ideas | List the project's open ideas |
create_changelog | Changelog | Record a user-facing change |
report_progress | Pipeline | Narrate a stage and advance the card |
Cards
get_card
Read a card's current content — title, status, properties, and body. Call it
before update_card so you start from the live body.
| Argument | Description |
|---|---|
card_id | The card you are working on. |
Returns the card as Markdown: frontmatter (title, status, type, priority) above the body.
update_card
Save changes to a card — its body, properties, and/or status. Pass only what you are changing.
| Argument | Description |
|---|---|
card_id | The card you are working on. |
body (optional) | The complete new card body in Markdown. Replaces the whole body, so send the full text, not a fragment. |
properties (optional) | A dict of card properties to merge in (e.g. type, priority). |
status (optional) | A new board status for the card. |
base_body_hash (optional) | A safety check for concurrent edits: the sha256 of the body you started from. If the card's body changed since then the write is refused with card body is stale and nothing is saved. Omit for last-write-wins. |
Saving also syncs the card to its Notion mirror.
create_card
Open a new card in your project's Backlog.
| Argument | Description |
|---|---|
title | A short title for the card. |
body (optional) | Markdown describing the work. |
type (optional) | e.g. Feature, Bug, Improvement. |
priority (optional) | e.g. High, Medium, Low. |
Returns a confirmation with the new card's id, then the card as Markdown, so you have its id to approve and dispatch it next.
approve_card
Approve a card's plan — move it to Plan Approved. This is the approval gate that would otherwise wait on a human; the move is recorded on the Timeline as an agent approval. Approving an already-approved card is a harmless no-op.
| Argument | Description |
|---|---|
card_id | The card you are approving. |
dispatch_card
Dispatch a card to the agent fleet — move it to Ready for Dev. This kicks off the build → test → review → docs → ship pipeline. Dispatch is asynchronous: the card is placed on Ready for Dev and its execution graph is seeded shortly after (within a minute). If the project has no agent host connected, the card still moves but nothing runs until one is enrolled — the reply says so.
| Argument | Description |
|---|---|
card_id | The card you are dispatching. |
Card lifecycle:
create_card→approve_card→dispatch_card.
Tasks
Each card has exactly one task checklist.
get_tasks
Read a card's task checklist as Markdown — one - [ ] (open) / - [x] (done)
line per task, each carrying a <!-- id: N --> anchor.
| Argument | Description |
|---|---|
card_id | The card you are working on. |
update_tasklist
Edit the whole checklist in one call — add, edit, reorder, check off, or remove
tasks. Read the list with get_tasks, change the Markdown, then send the full
list back.
| Argument | Description |
|---|---|
markdown | The complete checklist Markdown. |
card_id | The card you are working on. |
How lines map to tasks: a line that keeps its <!-- id: N --> anchor updates
that task; a line with no id creates a new task; an existing task you leave out
is removed. - [x] marks a task done, - [ ] open.
create_task
Append a single task without resending the whole list.
| Argument | Description |
|---|---|
title | The task text. |
card_id | The card you are working on. |
body (optional) | Markdown detail for the task. |
Ideas
create_idea
Capture a new idea for the project — a feature thought, suggestion, or
improvement to revisit later. Call list_ideas first to avoid duplicates.
| Argument | Description |
|---|---|
title | A short summary of the idea. |
body (optional) | Markdown detail. |
source (optional) | Who it came from: manual, customer, or bot (default manual). |
Returns a confirmation carrying the new idea's slug.
list_ideas
List the project's open ideas as a Markdown checklist (one
- [status] title <!-- slug: ... --> line each). Read-only, no arguments.
Dismissed and closed ideas are excluded.
Changelog
create_changelog
Record a changelog entry — a user-facing note that something shipped or changed.
| Argument | Description |
|---|---|
title | A short headline for the change. |
body (optional) | Markdown detail. |
card_id (optional) | Link the entry to the card it came from; omit for a project-level entry. |
Returns a confirmation carrying the new entry's slug.
Progress reporting
report_progress
How a worker narrates a pipeline stage and lets the card advance itself. Call
it twice per stage you work — once on pickup (status="started") and once on
completion. Do not move stage cards with update_card(status=...).
| Argument | Description |
|---|---|
card_id | The card you are working on. |
skill | Your stage: one of build, test, demo, review, docs, ship. Any other string is recorded but never moves the card. |
status | The stage state, e.g. started, done, passed, failed, blocked. |
headline | A one-line summary of what just happened. For a blocked event this becomes the operator-facing blocked reason. |
iter (optional) | Which attempt this is for the stage (default 1); bump it on a re-drive so a retry's events don't collide with the first run's. |
fields (optional) | A dict of labelled facts to show on the event (e.g. {"BRANCH": "feat/x", "PR": "#42"}). |
sections (optional) | A list of richer narrative blocks ({"title", "body"} each) — e.g. a reviewer's full rationale on a review/failed event, carried into the re-driven build. |
artifact (optional) | A dict linking one artifact (e.g. {"kind": "pr", "label": "PR #42", "href": "https://..."}). |
session_id (optional) | Your kanban task id. Omit it and the card's canonical execution session id is used. |
The (skill, status) pair drives the card's board column:
| Stage event | Card moves to |
|---|---|
build / started | In Dev |
build / done | Ready for QA |
test / started | In QA |
test / done | (no move; demo next) |
demo / started · demo / done | (no move) |
review / passed | Ready for Docs |
review / failed | Ready for Dev (re-drives the build with your feedback) |
docs / started | In Docs |
docs / done | Ready for Release |
ship / done | Done |
Any pair not listed records the event for the Timeline but does not move the
card. status="blocked" (any skill) raises the card's Blocked flag and seeds the
reason from your headline; the card keeps its column until an operator unblocks
it. The card only ever moves forward — a stale or backward pair is recorded but
does not move it.