Transports
Decisions, part 1 of 2 MCP tools
The 18 tools /mcp offers for Decisions, part 1 of 2, what each needs and an example call.
Your spaces and their RFCs, PRDs, ADRs and studies: read, draft, comment and ask for review. These are 18 tools of the 36 tools of the decisions backend (part 1 of 2; the others are part 2); all MCP tools lists the other backends.
decisions_add_comment
Comment. Comment on a heading of the document, or reply to a comment.
Scopes: mcp:write, decisions:write · changes something
| Argument | Type | What it is |
|---|---|---|
anchor | string | A heading id: lowercase letters, digits and "-", at most 200; ignored on a reply. |
body | string | 1 byte to 10 KiB. |
document_id | string | The document's id (decisions_list_documents). |
parent_id | string | The thread's first comment, for a reply. |
quote | object | A thread on a selected passage: set with anchor naming the heading it falls under; ignored on a reply. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_add_comment",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_ask_question
Ask a person. Ask a person to settle something, in a space: the question (text), what the answer unblocks, optionally the document it is about and whom it is for (asked_of, a subject; empty for the account's owners and admins). To ask for a decision, give two to six options, your recommendation (one of them) and your reasons: the person answers with one tap, and the choice is recorded on the document. It waits on their list until a person answers it; an assistant never answers.
Scopes: mcp:write, decisions:write · changes something
| Argument | Type | What it is |
|---|---|---|
asked_of | string | |
document_id | string | The document's id (decisions_list_documents). |
options | list of string | A decision request: two to six options, at most 100 characters each; empty for an open question. |
reasons | string | Why; at most 2000 characters. |
recommendation | string | One of the options; needs options. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
text | string | |
unblocks | string |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_ask_question",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_create_diagram
Start a diagram. Make a diagram; version 1 is the model given (or an empty one).
Scopes: mcp:write, decisions:write · changes something
| Argument | Type | What it is |
|---|---|---|
model | string | The model as JSON text: an object with version (a positive integer, 1 when absent), nodes (at most 500, each with a string id) and edges (at most 2000, each with source and target naming nodes); other keys are kept as given. At most 1 MiB. Empty is \{"version": 1, "nodes": [], "edges": []\}. |
name | string | 1 to 80 characters. |
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_create_diagram",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_create_document
Start a document. Start a document from a template in a space: its number is the next free one for its kind in the space, its slug comes from the title. Version 1, a draft.
Scopes: mcp:write, decisions:write · changes something
| Argument | Type | What it is |
|---|---|---|
account_id | string | Optional: the account the space is in. Left out, the space's own account; when given it must be that one, else the call is refused. |
child_index | integer | A part's N, 1 to 99 (an import keeps the file's); 0 is the next free one under the parent. Taken: ALREADY_EXISTS. |
kind | string | "rfc", "study", "prd" or "adr". |
number | integer | A top-level document's number, 1 to 9999, kept when it was claimed before the document existed; 0 is the next free one. For the space's managers (owners and admins of its account). Unique per kind across all the account's spaces. Taken: ALREADY_EXISTS. A part takes its parent's number: 0 or the parent's. |
outward | boolean | The scope faces outward (see Document.outward). |
parent_id | string | Make it a part of this document of the space: a top-level RFC, or a top-level study for a study. Its number is the parent's, its file NNNN.N-slug.md, and the front matter says parent: NNNN-slug. |
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
summary | string | At most 1000 characters, on one line. |
template | string | "" or "default": the kind's sections; "blank": front matter and the status log only; "findings", for a study only: a template run's sections (question, context, method, findings, recommendation, open questions). |
title | string | 1 to 200 characters on one line; the slug is made from it. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_create_document",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_create_space
Make a space. Make a Decisions space in an account, where its PRDs, ADRs, RFCs and studies will live, with the default settings: name (1 to 80 characters), optionally a slug (lowercase letters, digits and -, at most 48; empty derives it from the name) and a description (at most 500). An empty account_id is the caller's own; making one needs write rights in that account. The same slug again is refused as already existing, never a second space. The space is made by the person the assistant acts for, and recorded as made through the assistant.
Scopes: mcp:write, decisions:write · changes something · safe to repeat
| Argument | Type | What it is |
|---|---|---|
access_floor | string | Its access floor; empty for none of its own. |
account_id | string | The account; empty is the caller's own. |
department | string | Which department, when kind is "department". |
description | string | At most 500 characters. |
kind | string | "space" (the default), "department" or "project". |
name | string | 1 to 80 characters. |
parent_id | string | Make it under this space of the same account; empty: at the top. |
slug | string | Lowercase letters, digits and "-", at most 48; empty derives it from the name. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_create_space",
"arguments": {}
}
}decisions_get_diagram
Read a diagram. One diagram and the model of its current version, or of version.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
diagram_id | string | The diagram's id (decisions_list_diagrams). |
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
svg | boolean | Also draw the version as an SVG document (svg in the response). |
version | integer | 0 is the current version. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_diagram",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_get_document
Read a document. A document's text (one version; 0 is the current) and its findings, with the documents around it: parent, parts, mentions and typed links, each in brief (id, kind, number, title, status) unless related is "full". section reads one heading's text only (its anchor or title; an unknown one is refused with the headings there are, so read the whole text first when unsure). space_id is required; there is no account_id (the space fixes the account). document_id takes an id, "rfc 12.1", "prd-12" or a repository path.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
diff_from | integer | With a version (1 or more, older than the one read), the response also carries diff: what changed from that version to the one read. |
document_id | string | The document's id (ldoc_…), or what people call it: its kind and number with a part after a dot (prd-12, adr 55, study 13), or its repository path (docs/rfcs/0102.1-slug.md). |
related | string | How the related documents (parent, parts, mentions, links) come: one of "", "brief" or "full". "" and "full": each in full; "brief", each as its id, kind, number, part, title, status and access only, enough to name it and read it next. |
section | string | One section only: text is that heading's section (to the next heading of its level), named by its anchor ("open-questions", "proposal-1" for a second one) or its title in any case. Empty: the whole text. An unknown section is refused, naming the headings there are. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
version | integer | 0 is the current version. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_document",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_get_settings
Get a space's settings. A space's settings: approvals needed to decide, redaction rules, and ai_approval, what assistants may approve there (manual: a person approves; auto: assistants may approve the listed kinds). Only a person changes them, in the console.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_settings",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_get_space
Get a space. One space, with its counts: documents, open documents and reviews waiting.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_space",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_get_space_tree
The account's spaces as a tree. Every space of an account as a tree: each parent before the spaces under it, with depth, kind (space, department or project), the department it names, the access floor it falls under and the templates suggested there. An empty account_id is the caller's own.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
account_id | string | The account; empty is the caller's own. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_space_tree",
"arguments": {}
}
}decisions_get_waiting
What waits on me. Everything waiting on the caller across an account's spaces, oldest first: reviews asked of them, documents they are to decide, and open questions asked of them (or of the owners and admins, when they are one), each with what settling it unblocks. Counts per kind. An empty account_id is the caller's own.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
account_id | string | The account; empty is the caller's own. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_get_waiting",
"arguments": {}
}
}decisions_link_document
List a document in another space. List a document in another space of the same account as well, for example an SLO in Product beside SRE. It keeps its home space and its own access level; nothing moves.
Scopes: mcp:write, decisions:write · changes something · safe to repeat
| Argument | Type | What it is |
|---|---|---|
document_id | string | The document's id (decisions_list_documents). |
space_id | string | The document's home space. |
target_space_id | string | The space of the same account it is also listed in. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_link_document",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_link_job
Link a coordinator job. Link a coordinator job to a document: job_id (job_ and a ULID) and role: implements (the default) or part_of. Needs the right to write the document. Linking one already linked changes its role. The coordinator's gates read the link; it never links itself.
Scopes: mcp:write, decisions:write · changes something · safe to repeat
| Argument | Type | What it is |
|---|---|---|
document_id | string | The document's id, or what people call it ("prd-39"). |
job_id | string | The coordinator job: "job_" and a ULID. |
role | string | "implements" (the default) or "part_of". |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_link_job",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_link_pull_request
Link a pull request. Link a pull request to a document: repo (owner/name) and number, or url (https://github.com/owner/name/pull/N), and role: implements (the default), part_of or related. Link every pull request you open for a document as soon as it is open. Linking one already linked changes its role. Its state is then kept current from GitHub.
Scopes: mcp:write, decisions:write · changes something · safe to repeat
| Argument | Type | What it is |
|---|---|---|
document_id | string | The document's id, or what people call it ("prd-39"). |
number | integer | |
repo | string | "owner/name"; with number, or leave both empty and give url. |
role | string | "implements" (the default), "part_of" or "related". |
source | string | "manual" (the default) or "backfill" (a script reading older comments). Kept from the first link. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
url | string | https://github.com/owner/name/pull/N, instead of repo and number. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_link_pull_request",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_list_comments
List comments. The document's comments, oldest first (a conversation reads down), a reply naming its thread's first comment. 0 means 100, at most 500.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
document_id | string | The document's id (decisions_list_documents). |
page_size | integer | |
page_token | string | The next_page_token of the page before. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
status | string | "open", "resolved", or empty for both (by the thread's state). |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_list_comments",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}decisions_list_diagrams
List diagrams. The space's diagrams, last changed first. 0 means 50, at most 200.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
page_size | integer | |
page_token | string | The next_page_token of the page before. |
query | string | Narrows to diagrams whose name contains this, any case. |
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_list_diagrams",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_list_documents
List documents. The space's documents (PRDs, ADRs, RFCs and studies), last changed first. 0 means 50, at most 200.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
account_id | string | Optional: the account the space is in. Left out, the space's own account; when given it must be that one, else the call is refused. |
compact | boolean | Each document as its id, kind, number, part, title, status and access only: a listing to find one by, a fraction of the full one's size. |
include_linked | boolean | Also the documents of other spaces linked into this one; each says linked and keeps its home space in space_id. |
mine | boolean | Only the caller's: documents they own, write or build, or are asked to review. |
page_size | integer | |
page_token | string | The next_page_token of the page before. |
query | string | Narrows to documents whose title, slug or current text contains this, any case. |
space_id | string | The space's whole id (lab_ and a ULID, never shortened); decisions_list_spaces names the caller's spaces. |
status | string | One status, or empty for all. |
types | list of string | "rfc", "study", "prd", "adr", or empty for every kind. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_list_documents",
"arguments": {
"space_id": "<space_id>"
}
}
}decisions_list_jobs
List coordinator jobs. The coordinator jobs linked to a document now, newest link first: job_id, role (implements or part_of), who linked it and through which assistant, and when. document_id is the id or what people call it ("rfc 12", "prd-39"). Needs membership of the space's account or a role on the document; a public document's readers do not see its jobs. Unlinked jobs are left out. Paged: page_size (0 means 50, at most 200), then page_token from next_page_token.
Scopes: mcp:read, decisions:read · reads only
| Argument | Type | What it is |
|---|---|---|
document_id | string | The document's id, or what people call it ("prd-39"). |
page_size | integer | 0 means 50, at most 200. |
page_token | string | The next_page_token of the page before. |
space_id | string | The space's whole id (lab_ and a ULID; decisions_list_spaces names them). May be left out when document_id is an ldoc_ id: the document names its own space. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "decisions_list_jobs",
"arguments": {
"document_id": "<document_id>",
"space_id": "<space_id>"
}
}
}