issue.list
list: issues as compact rows (key, title, status, assignee, release), filtered by app, state_group or status, release or type, paged by cursor (limit up to 100, pass next_cursor back until it is gone); fields adds named fields; since returns only issues changed after an earlier reply's cursor (and removed: archived since)
Needs issues:read · REST GET /api/v1/issues, GET /api/v1/tasks
| Argument | Type | Notes |
|---|
app | string | App key like KID, or its uuid |
state_group | "triage" | "backlog" | "unstarted" | "started" | "review" | "completed" | "cancelled" | Status column |
status | string | A status as the rows show it (In Progress) or its group (started) |
release | string | Release version like 11.4 (in the issue's app), or its uuid |
type | "bug" | "feature" | "chore" | "idea" | |
limit | integer | Page size, 1 to 100 (default 50) |
cursor | string | next_cursor from the previous page |
since | string | integer | Only what changed after this: the cursor value from an earlier reply |
include | "archived" | Also list archived tickets |
fields | "id" | "app" | "state_group" | "priority" | "type" | "severity" | "change_risk" | "difficulty" | "must_have" | "blocked" | "size" | "description" | "done_means" | "custom" | "delegate" | "holder" | "labels" | "source" | "created_at" | "updated_at"[] | Extra fields per row: id, app, state_group, priority, type, severity, change_risk, difficulty, must_have, blocked, size, description, done_means, custom, delegate, holder, labels, source, created_at, updated_at |
waiting | true | Only tickets that need Yan, with what is needed |
issue.get
get: one issue with its state, release, done means and lock
Needs issues:read · REST GET /api/v1/issues/{ref}
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
issue.create
create: a new issue in an app (lands in Triage unless state_group says otherwise); call issue.fields first: the type's template fills description and done_means, and required custom fields must be sent in custom
Needs issues:write · REST POST /api/v1/issues
| Argument | Type | Notes |
|---|
app required | string | App key like KID, or its uuid |
title required | string | |
description | string | |
priority | integer | 0 none, 1 urgent, 2 high, 3 medium, 4 low |
risk_tier | "low" | "medium" | "high" | Change risk (old name risk_tier): how risky the change is for an agent; high always routes through approvals |
change_risk | "low" | "medium" | "high" | How risky the change is for an agent; high always routes through approvals. Same field as risk_tier |
state_group | "triage" | "backlog" | "unstarted" | "started" | "review" | "completed" | "cancelled" | Status column |
release | string | Release version like 11.4 (in the issue's app), or its uuid |
done_means | string[] | Acceptance checks: what "done" means for this ticket |
type | "bug" | "feature" | "chore" | "idea" | bug, feature or chore (ideas: idea.create) |
severity | "crash" | "broken" | "degraded" | "cosmetic" | null | Bugs only: crash, broken, degraded or cosmetic |
source | "person" | "agent" | "crash_report" | "app_store_review" | "support_email" | "monitor" | "import" | Where it came from |
reporter | string | null | Who reported it (a name or handle, not an email) |
external_url | string | null | Link to the crash, review or email thread |
affected_version | string | null | |
platform | string | null | OS or platform, e.g. iOS 18.1 |
device | string | null | |
repro_steps | string | null | Steps to reproduce (bugs) |
review_steps | string | null | Steps a reviewer should try, one per line |
blocked | boolean | |
blocked_reason | string | null | |
snooze_until | string | null | |
must_have | boolean | Must ship in its release; release readiness counts only must-haves |
size | "S" | "M" | "L" | null | S, M or L |
first_seen_at | string | null | |
last_seen_at | string | null | |
occurrence_count | integer | |
difficulty | string | MSH-208: easy, medium or hard: the agent level it needs. Agents may raise it, never lower it; new tickets get a suggestion |
custom | object | MSH-145 custom field values by key, e.g. {"customer_impact": "Many users"}. issue.fields lists the fields for an app and type, their kinds, choices and which are required. Select: one of the options; multi select: a list; checkbox: true/false; member: a member id; version: a release version of the issue's app. On update, null clears a value |
no_code | boolean | true marks the ticket no-code: no PR or branch link needed for review or Done. Needs reason |
reason | string | With no_code: true, at least 20 characters: why this ticket has no code change |
template | string | Template id or name from issue.fields; without one the default template for the type fills description and done_means; "none" for no template |
issue.update
update: title, description, priority, change_risk (or risk_tier), done_means, custom (field values by key), type, severity, source, reporter, external_url, affected_version, platform, device, repro_steps, review_steps, blocked, blocked_reason, snooze_until, must_have, size, first/last_seen_at, occurrence_count, waiting_on_yan and release_note (null clears), no_code with reason. Needs the ticket's lock, except a patch of only description and/or done_means, which needs no lock and never changes the state
Needs issues:write · REST PATCH /api/v1/issues/{ref}
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
title | string | |
description | string | null | |
priority | integer | 0 none, 1 urgent, 2 high, 3 medium, 4 low |
risk_tier | "low" | "medium" | "high" | Change risk (old name risk_tier): how risky the change is for an agent; high always routes through approvals |
change_risk | "low" | "medium" | "high" | How risky the change is for an agent; high always routes through approvals. Same field as risk_tier |
done_means | string[] | Acceptance checks: what "done" means for this ticket |
type | "bug" | "feature" | "chore" | "idea" | bug, feature or chore (ideas: idea.create) |
severity | "crash" | "broken" | "degraded" | "cosmetic" | null | Bugs only: crash, broken, degraded or cosmetic |
source | "person" | "agent" | "crash_report" | "app_store_review" | "support_email" | "monitor" | "import" | Where it came from |
reporter | string | null | Who reported it (a name or handle, not an email) |
external_url | string | null | Link to the crash, review or email thread |
affected_version | string | null | |
platform | string | null | OS or platform, e.g. iOS 18.1 |
device | string | null | |
repro_steps | string | null | Steps to reproduce (bugs) |
review_steps | string | null | Steps a reviewer should try, one per line |
blocked | boolean | |
blocked_reason | string | null | |
snooze_until | string | null | |
must_have | boolean | Must ship in its release; release readiness counts only must-haves |
size | "S" | "M" | "L" | null | S, M or L |
first_seen_at | string | null | |
last_seen_at | string | null | |
occurrence_count | integer | |
difficulty | string | MSH-208: easy, medium or hard: the agent level it needs. Agents may raise it, never lower it; new tickets get a suggestion |
waiting_on_yan | string | null | What Yan must do; null clears |
release_note | string | null | Release notes line; null clears |
custom | object | MSH-145 custom field values by key, e.g. {"customer_impact": "Many users"}. issue.fields lists the fields for an app and type, their kinds, choices and which are required. Select: one of the options; multi select: a list; checkbox: true/false; member: a member id; version: a release version of the issue's app. On update, null clears a value |
no_code | boolean | true marks the ticket no-code: no PR or branch link needed for review or Done. Needs reason |
reason | string | With no_code: true, at least 20 characters: why this ticket has no code change |
issue.fields
fields: the custom fields (kind, choices, required, help) and templates for an app and issue type, so create and update fill them correctly
Needs issues:read · REST GET /api/v1/issues/fields
| Argument | Type | Notes |
|---|
app required | string | App key like KID, or its uuid |
type | "bug" | "feature" | "chore" | "idea" | bug, feature or chore (ideas: idea.create) |
issue.move
move: to a status column (state_group) and/or a release; started plus reason on a ticket in review sends it back (needs comments:write); review and Done need a run receipt and a PR or branch link (or no_code with a reason), frozen releases and high-risk work need Yan's approval; the reply gives `state` and `held`, and a held move names the approval it waits on
Needs issues:write · REST POST /api/v1/issues/{ref}/move
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
state_group | "triage" | "backlog" | "unstarted" | "started" | "review" | "completed" | "cancelled" | Status column |
release | string | null | Release version or uuid; null takes the issue out of every release |
cancel_reason | "merged" | "duplicate" | "not_needed" | "cut_from_scope" | Needed to cancel |
of | string | Ticket merged into or duplicated |
no_code | boolean | true marks the ticket no-code: no PR or branch link needed for review or Done. Needs reason |
reason | string | With no_code: why. With state_group started on a ticket in review: sends it back, kept as a comment |
issue.ci_result
ci_result: record a CI run (commit, result pass|fail, flakes, log path); Done needs a pass on the merged commit
Needs comments:write · REST only, not in MCP · REST POST /api/v1/issues/{ref}/ci
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
commit required | string | |
result required | "pass" | "fail" | |
flakes required | integer | |
log required | string | |
issue.receipt
receipt: submit the run receipt (files_changed, risks, verified [{what, how}], decisions, next_step, done_means [{item, met, evidence}], head_sha of the commit it covers); needed before review and for the Mishka approval merge check
Needs issues:write · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
session_id | string | |
files_changed required | string[] | Paths of files changed |
risks | string[] | Open risks, or an empty list |
verified required | object[] | What was verified and how (tests, screenshots, manual steps) |
decisions | string[] | |
next_step required | string | |
head_sha | string | The commit this receipt covers (git rev-parse HEAD). The merge check needs a receipt for the PR's head commit |
done_means | object[] | One answer per done-means item: item text or number, met, evidence |
issue.review
review: record your pass or fail on one commit of someone else's ticket (head_sha is the full commit; you cannot review a ticket you filed a receipt on); a pass on the commit being merged lets Yan's high-risk rule decide without a click
Needs issues:write · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
head_sha required | string | The full commit you reviewed (git rev-parse HEAD) |
verdict required | "pass" | "fail" | |
summary required | string | What you checked and what you found |
issue.receipts
receipts: the run receipts on an issue, newest first
Needs issues:read · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
issue.scan
scan: record a scanner's findings for a commit: tool, head_sha (the commit), findings [{severity high|medium|low, path, line, rule, link}], [] if none. VOLAT runs no scanner. An open high finding blocks approving that commit
Needs issues:write · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
tool required | string | |
head_sha required | string | |
findings required | any | |
issue.restore
restore: take a ticket out of the archive (canceled goes to Backlog)
Needs issues:write · REST POST /api/v1/issues/{ref}/restore
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
issue.archive_closed
archive_closed: owner only; archive all due closed tickets (state_group limits it)
Needs issues:write · MCP only
| Argument | Type | Notes |
|---|
state_group | "completed" | "cancelled" | |
issue.archive
archive: soft-delete a ticket you hold; more than one ticket becomes an approval for Yan
Needs issues:write · destructive · MCP only
| Argument | Type | Notes |
|---|
issues required | string[] | Identifiers to archive |
issue.code_status
code_status: report branch/PR state on a ticket you hold (repo, branch, pr_number, pr_url, preview_url, pr_state, check_state, mergeable); omit to read
Needs issues:read · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
repo | string | owner/name |
branch | string | |
pr_number | integer | |
pr_url | string | |
preview_url | any | |
pr_state | "open" | "merged" | "closed" | |
check_state | "none" | "pending" | "success" | "failure" | "neutral" | "cancelled" | |
mergeable | "clean" | "conflicting" | "unknown" | |
head_sha | string | |
issue.relations
relations: what this issue blocks, is blocked by, duplicates or relates to
Needs issues:read · REST GET /api/v1/issues/{ref}/relations
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
issue.relate
relate: link to another issue (kind blocks, blocked_by, duplicate_of, related_to); duplicate_of also moves this one to Canceled
Needs issues:write · REST POST /api/v1/issues/{ref}/relations
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
kind required | "blocks" | "blocked_by" | "duplicate_of" | "related_to" | |
other required | string | The other issue, e.g. KID-7 |
issue.unrelate
unrelate: remove a relation by its id (from issue.relations)
Needs issues:write · REST DELETE /api/v1/issues/{ref}/relations/{id}
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
relation_id required | string | |
issue.seen
seen: intake saw this issue again (a matching crash or review): bumps occurrence_count and last_seen_at instead of filing a duplicate
Needs issues:write · REST POST /api/v1/issues/{ref}/seen
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
at | string | |
count | integer | |
issue.attachments
attachments: list an issue's screenshots and logs (metadata)
Needs issues:read · REST GET /api/v1/issues/{ref}/attachments
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
issue.attach
attach: add a screenshot or log to a ticket you hold (file_name, content_type image/png|image/jpeg|image/gif|image/webp|text/plain|text/csv|application/json|application/pdf|application/zip|application/x-ndjson, content_base64; 10 MB at most)
Needs issues:write · REST POST /api/v1/issues/{ref}/attachments
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
file_name required | string | |
content_type required | "image/png" | "image/jpeg" | "image/gif" | "image/webp" | "text/plain" | "text/csv" | "application/json" | "application/pdf" | "application/zip" | "application/x-ndjson" | |
content_base64 required | string | The file, base64-encoded |
issue.start
start: one call to begin a ticket: takes the lock (checkout.take), starts a session (pass machine and branch) and returns the context pack (context.ticket) with any handoff note
Needs issues:write · REST POST /api/v1/issues/{ref}/start, POST /api/v1/tasks/{ref}/claim
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
machine | string | The machine this agent runs on, e.g. mac-mini |
branch | string | Your git branch |
tool | string | claude-code, codex, cursor... |
issue.finish
finish: one call to hand a ticket over: files the run receipt (the receipt fields), adds comment, reports the link (repo, branch, pr_url) or no_code: true with a reason, moves it (state_group review by default; completed closes it in this one call when every done_means item is answered met with evidence) and ends your session. The reply gives `state` and `held`; a held finish names the approval it waits on. One refusal lists everything missing; extra done_means items on a ticket with none are kept as notes
Needs issues:write · REST POST /api/v1/issues/{ref}/finish, POST /api/v1/tasks/{ref}/finish
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
state_group | "triage" | "backlog" | "unstarted" | "started" | "review" | "completed" | "cancelled" | Status column |
cancel_reason | "merged" | "duplicate" | "not_needed" | "cut_from_scope" | |
of | string | Issue identifier like KID-4, or its uuid |
no_code | boolean | true marks the ticket no-code: no PR or branch link needed for review or Done. Needs reason |
reason | string | With no_code: true, at least 20 characters: why this ticket has no code change |
repo | string | owner/name; with branch, reports the code link |
branch | string | |
pr_url | string | |
comment | string | A comment to add, e.g. what changed and the PR link |
summary | string | Session summary (defaults to comment) |
session_id | string | |
files_changed | string[] | Paths of files changed |
risks | string[] | Open risks, or an empty list |
verified | object[] | What was verified and how (tests, screenshots, manual steps) |
decisions | string[] | |
next_step | string | |
head_sha | string | The commit this receipt covers (git rev-parse HEAD). The merge check needs a receipt for the PR's head commit |
done_means | object[] | One answer per done-means item: item text or number, met, evidence |
issue.mirror_export
mirror_export: an app's tickets as Markdown files (tasks/KID.md or backlog/tasks/*.md) with stable ids; you write them into the repo
Needs issues:read · REST only, not in MCP · REST GET /api/v1/mirror
| Argument | Type | Notes |
|---|
app | string | App key like KID, or its uuid |
format | "tasks" | "backlog" | tasks: one tasks/KID.md checklist (default); backlog: one Backlog.md-style file per ticket |
issue.mirror_sync
mirror_sync: send the edited mirror files back; preview by default, apply: true writes status ticks, title edits and new tasks in one changeset (Undo), and refuses on conflicts
Needs issues:write · REST only, not in MCP · REST POST /api/v1/mirror
| Argument | Type | Notes |
|---|
app | string | App key like KID, or its uuid |
format | "tasks" | "backlog" | tasks: one tasks/KID.md checklist (default); backlog: one Backlog.md-style file per ticket |
files required | object[] | The mirror files as they are now in the repo: [{ path, content }] |
apply | boolean | true writes the changes; without it the reply is a preview |
session.start
start: begin a session on a ticket you hold; returns the last pause note on that ticket if there is one
Needs sessions:write · MCP only
| Argument | Type | Notes |
|---|
issue required | string | Issue identifier like KID-4, or its uuid |
tool | string | claude-code, codex, cursor... |
title | string | |
machine | string | The machine this agent runs on, e.g. mac-mini (names the instance: tool · machine · branch) |
branch | string | Git branch, e.g. msh-12-rate-limits |
pr_url | string | Pull request URL (https) |
pr_number | integer | |
session.log
log: record a step (kind plan, action, question, result, error); a question waits for Yan's answer
Needs sessions:write · MCP only
| Argument | Type | Notes |
|---|
session_id required | string | The session id from session.start |
kind required | "plan" | "action" | "question" | "result" | "error" | |
body required | string | |
session.link
link: attach the branch and pull request to the session
Needs sessions:write · MCP only
| Argument | Type | Notes |
|---|
session_id required | string | The session id from session.start |
branch | string | Git branch, e.g. msh-12-rate-limits |
pr_url | string | Pull request URL (https) |
pr_number | integer | |
session.pause
pause: stop with a handoff note and release the ticket; reason limit_hit offers it to another tool
Needs sessions:write · destructive · MCP only
| Argument | Type | Notes |
|---|
session_id required | string | The session id from session.start |
reason | "paused" | "limit_hit" | |
note | string | |
done | string | |
next_step | string | |
open_questions | string | |
session.resume
resume: pick up a paused session (yours or another tool's) from its note; takes the ticket and starts a new session
Needs sessions:write · MCP only
| Argument | Type | Notes |
|---|
session_id | string | The session id from session.start |
issue | string | Issue identifier like KID-4, or its uuid |
session.finish
finish: end the session as done or error, with a summary and the branch/PR
Needs sessions:write · MCP only
| Argument | Type | Notes |
|---|
session_id required | string | The session id from session.start |
status | "done" | "error" | |
summary | string | |
branch | string | Git branch, e.g. msh-12-rate-limits |
pr_url | string | Pull request URL (https) |
pr_number | integer | |
session.get
get: one session with all its steps
Needs sessions:read · MCP only
| Argument | Type | Notes |
|---|
session_id required | string | The session id from session.start |
session.list
list: sessions, by issue, status or only yours
Needs sessions:read · MCP only
| Argument | Type | Notes |
|---|
issue | string | Issue identifier like KID-4, or its uuid |
status | "active" | "waiting_for_input" | "paused" | "error" | "done" | |
mine | boolean | |
session.waiting
waiting: sessions waiting for Yan's answer (Needs-you)
Needs sessions:read · MCP only
No arguments.
release.list
list: open releases per app, oldest version first, with open/done counts, checklist counts and ready_to_ship
Needs releases:read · REST GET /api/v1/releases
| Argument | Type | Notes |
|---|
app | string | App key like KID, or its uuid |
include_shipped | boolean | |
release.get
get: one release by uuid, or by version with app
Needs releases:read · REST GET /api/v1/releases/{ref}
| Argument | Type | Notes |
|---|
release required | string | Release version like 11.4 (in the issue's app), or its uuid |
app | string | App key like KID, or its uuid |
release.readiness
readiness: a release's pre-release checklist (full item ids; who: agent or person for each, so you know before ticking), open must-haves, and what still blocks shipping
Needs releases:read · REST GET /api/v1/releases/{ref}/readiness
| Argument | Type | Notes |
|---|
release required | string | Release version like 11.4 (in the issue's app), or its uuid |
app | string | App key like KID, or its uuid |
release.tick
tick: tick (done true, the default) or untick a checklist item by its id from readiness, with an optional note as evidence ("build 412 from 3f9c2e1"). On a person-only item (who: person) the note is saved for Yan, who ticks from it; shipping is Yan's alone
Needs releases:write · REST POST /api/v1/release-checks/{id}
| Argument | Type | Notes |
|---|
item required | string | Checklist item id from release.readiness |
done | boolean | true ticks (default), false unticks |
note | string | null | Evidence or a reason; null clears it |
release.update
update: internal_only true marks a release as an internal build (tracked, never shipped or announced as public, never ships next), false clears it (people only)
Needs releases:write · MCP only
| Argument | Type | Notes |
|---|
release required | string | Release version like 11.4 (in the issue's app), or its uuid |
app | string | App key like KID, or its uuid |
internal_only required | boolean | |
release.close_tickets
close_tickets: close several tickets to Done in one call (issues: keys, reason: the comment on each), each under issue.finish's gate; the reply says per key what closed and what was refused and why
Needs issues:write · MCP only
| Argument | Type | Notes |
|---|
issues required | string[] | Keys of the tickets to close, e.g. ["FAM-140", "FAM-142"] |
reason required | string | Why they close; added as a comment on each |
idea.search
search: find ideas by words, app, type, status or linked work
Needs ideas:read · MCP only
| Argument | Type | Notes |
|---|
q | string | |
app | string | App key like KID, or its uuid |
type | "improvement" | "new_app" | "new_website" | "other" | |
status | "open" | "archived" | "all" | |
linked | boolean | true: only ideas with a linked ticket |
cursor | string | |
limit | integer | |
idea.get
get: one idea with its research, comments and links
Needs ideas:read · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
idea.create
create: capture an idea (title is enough); items[] captures several
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
items | object[] | |
title | string | |
description | string | |
app | string | App key like KID, or its uuid |
type | "improvement" | "new_app" | "new_website" | "other" | |
key | string | Fresh random id per idea; send the same one when retrying |
idea.update
update: edit title, description, app or type; send the revision you read
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
revision required | integer | From idea.get; a stale one is refused |
title | string | |
description | string | null | |
app | string | null | |
type | "improvement" | "new_app" | "new_website" | "other" | |
original_text | string | Refused: the author's words never change |
idea.research_add
research_add: add a research entry (a finding, never an edit to the idea)
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | The idea |
title required | string | |
body | string | |
sources | string[] | |
idea.research_edit
research_edit: change a research entry you wrote
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | The research entry |
title | string | |
body | string | |
sources | string[] | |
idea.link
link: link an idea to tickets, an app or related ideas; items[] links several
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
items | object[] | |
ticket | string | KID-4 or uuid |
app | string | App key like KID, or its uuid |
idea | string | |
idea.unlink
unlink: take a link off an idea
Needs ideas:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
link_id required | string | |
idea.similar
similar: find ideas that may say the same thing
Needs ideas:read · MCP only
| Argument | Type | Notes |
|---|
q required | string | |
id | string | |
docs.list
list: docs as titles and excerpts, newest first; filter by kind (doc, decision, guideline), app, issue or q (text match). kind=guideline lists the agent rules; kind=decision is the decisions log
Needs docs:read · REST GET /api/v1/docs
| Argument | Type | Notes |
|---|
kind | "doc" | "decision" | "guideline" | doc (a page), decision (the decisions log) or guideline (agent rules) |
app | string | App key like KID, or its uuid |
issue | string | Issue identifier like KID-4, or its uuid |
q | string | Matches the title or the text |
limit | integer | |
docs.get
get: one doc with its full markdown text, app, linked ticket, decision status and version (the text version; pass it back as if_version). section gives that section's text only
Needs docs:read · REST GET /api/v1/docs/{id}
| Argument | Type | Notes |
|---|
id required | string | |
section | string | Heading text without the #s, e.g. "Plan"; "" is the text before the first heading |
occurrence | integer | Which one when the heading repeats; 1 is the first |
docs.versions
versions: the doc's text versions, newest first (at most 50), with when and who
Needs docs:read · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
limit | integer | |
docs.version
version: the doc's full text as it was at a version (from docs.versions)
Needs docs:read · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
version required | integer | |
docs.put
put: add a doc (no id) or change one (id; only the fields you pass). Link it to an app or a ticket (a ticket implies its app). Decisions take decision_status and decided_on. Agent rules (kind guideline) need docs:admin
Needs docs:write · REST POST /api/v1/docs, PATCH /api/v1/docs/{id}
| Argument | Type | Notes |
|---|
id | string | |
kind | "doc" | "decision" | "guideline" | doc (a page), decision (the decisions log) or guideline (agent rules) |
title | string | |
content | string | Markdown. Raw HTML is shown as text |
app | string | null | App key or uuid; null makes it workspace-wide |
issue | string | null | Ticket like KID-4; null unlinks |
decision_status | "proposed" | "accepted" | "superseded" | "rejected" | |
decided_on | string | null | YYYY-MM-DD |
if_version | integer | The version you read; the save is refused (conflict) if the text changed since |
docs.section_put
section_put: replace one section (its heading line through the line before the next heading) with content, heading included. Saved when that section is unchanged since if_version, even if others edited the rest; refused (conflict) otherwise
Needs docs:write · MCP only
| Argument | Type | Notes |
|---|
id required | string | |
if_version required | integer | The version you read (docs.get gives it) |
section required | string | Heading text without the #s, e.g. "Plan"; "" is the text before the first heading |
occurrence | integer | Which one when the heading repeats; 1 is the first |
content required | string | The new section in markdown, heading line included |
docs.archive
archive: move a doc to the trash (a person can restore it from Settings › Trash)
Needs docs:write · destructive · REST DELETE /api/v1/docs/{id}
| Argument | Type | Notes |
|---|
id required | string | |
search.query
query: ranked matches for q (words, "a phrase", or, -not; a ticket key like KID-4 comes first) across tickets, comments, docs, decisions, agent rules, ideas, agent sessions, run receipts, releases and apps; narrow with kinds, app and filters. One row per record, best first, up to 200 results: pass next_cursor back (same arguments) for the next page; changed_since_first_page means the workspace changed since page 1. complete is true only when the results ended on this page, nothing was cut at 200 and not_searched is empty; when it is false and you need every match, use search.list
Needs issues:read · REST GET /api/v1/search
| Argument | Type | Notes |
|---|
q required | string | What to look for |
app | string | App key like KID, or its uuid |
kinds | "issue" | "comment" | "doc" | "decision" | "guideline" | "idea" | "session" | "receipt" | "release" | "app"[] | Only these kinds |
filters | any | Narrow by any of: apps (keys or ids; their rows plus workspace docs and ideas), states (status groups: triage, backlog, unstarted, started, review, completed, cancelled), priorities (0 to 4), assignees, authors, labels, releases (ids), types (bug, feature, chore), changed_by (who last changed it), created, updated, completed and content_changed ({from, to} ISO dates; from is included, to is not), archived (include, exclude or only) |
sort | string | relevance, updated, created, completed: best first, or newest first by that date (completed lists only finished work) |
limit | integer | 1 to 50 (default 20) |
cursor | string | next_cursor from the previous page |
search.list
list: every match page by page, newest first by created (default), updated or completed; q is optional (without it, everything the filters allow); same filters as query; pass next_cursor back (same arguments) until it is gone; sort=created is the full walk; under sort=updated a record edited mid-walk can be missed and the reply says so (changed_since_first_page, complete false); complete is true only on the last page when not_searched is empty
Needs issues:read · REST GET /api/v1/search/list
| Argument | Type | Notes |
|---|
q | string | What to look for |
app | string | App key like KID, or its uuid |
kinds | "issue" | "comment" | "doc" | "decision" | "guideline" | "idea" | "session" | "receipt" | "release" | "app"[] | Only these kinds |
filters | any | Narrow by any of: apps (keys or ids; their rows plus workspace docs and ideas), states (status groups: triage, backlog, unstarted, started, review, completed, cancelled), priorities (0 to 4), assignees, authors, labels, releases (ids), types (bug, feature, chore), changed_by (who last changed it), created, updated, completed and content_changed ({from, to} ISO dates; from is included, to is not), archived (include, exclude or only) |
sort | string | relevance, updated, created, completed: best first, or newest first by that date (completed lists only finished work) |
limit | integer | 1 to 50 (default 20) |
cursor | string | next_cursor from the previous page |
search.changes
changes: what changed since a cursor, across tickets, comments, docs, ideas, sessions and receipts; since is the cursor from an earlier reply (without it the reply is only the cursor); events: created, updated (other fields), content_changed (title or text), moved (status), archived (restorable), restored, deleted (gone for good); more = ask again
Needs issues:read · REST GET /api/v1/search/changes
| Argument | Type | Notes |
|---|
since | string | integer | Only what changed after this: the cursor value from an earlier reply |
limit | integer | Page size, 1 to 100 (default 50) |
search.activity
activity: what happened in the workspace, newest first, one line per burst; filter by actor (name), app, kind (tickets, releases, docs, approvals), from/to (YYYY-MM-DD) and q; older with before = next_cursor
Needs issues:read · REST GET /api/v1/activity
| Argument | Type | Notes |
|---|
actor | string | Person or agent name, e.g. Claude |
app | string | App key like KID, or its uuid |
ticket | string | History of one ticket, e.g. KID-4 |
kind | string | tickets, releases, docs or approvals |
from | string | First day, YYYY-MM-DD |
to | string | Last day, YYYY-MM-DD |
q | string | Text within the log |
before | string | next_cursor from the previous page |
limit | integer | Changes to read, 1 to 100 (default 30) |