Log decisions with expectations, add evidence, and track metrics in Ledger.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer token: a workspace API key or personal access token from accounts.zerowidth.ai
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Posts a comment on a workspace entity — a new thread, or a reply when rootId is given. Use it to leave findings where the discussion already lives (an eval result on the flow being debated, a summary on a long thread). Mention people via mentionedUserIds (from workspace member ids) to ring their notification bell; never mention someone who didn't ask to be pulled in.
What the thread hangs on.
Reply into this thread; omit to start a new one.
Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Posts a comment on a workspace entity — a new thread, or a reply when rootId is given. Use it to leave findings where the discussion already lives (an eval result on the flow being debated, a summary on a long thread). Mention people via mentionedUserIds (from workspace member ids) to ring their notification bell; never mention someone who didn't ask to be pulled in.
| Argument | Type | Description |
|---|---|---|
| body* | string | |
| rootId | string | Reply into this thread; omit to start a new one. |
| entityId* | string | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | |
| entityKind* | string | What the thread hangs on. |
| mentionedUserIds | array |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entityKind",
"entityId",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 10000,
"minLength": 1
},
"rootId": {
"type": "string",
"description": "Reply into this thread; omit to start a new one."
},
"entityId": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
},
"entityKind": {
"enum": [
"workbench_flow",
"compass_page",
"compass_opportunity",
"caliper_review",
"caliper_dataset",
"caliper_rubric",
"caliper_eval",
"caliper_spec",
"napkin_board",
"napkin_diagram",
"napkin_doc",
"napkin_sheet",
"napkin_interface",
"ledger_entry",
"prism_field",
"workspace_file"
],
"type": "string",
"description": "What the thread hangs on."
},
"mentionedUserIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
}
}
}Lists the comment threads on one workspace entity (open first, then resolved) with authors and timestamps. Read this before weighing in on contested work — the threads are where disagreement lives before it becomes a decision.
| Argument | Type | Description |
|---|---|---|
| entityId* | string | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| entityKind* | string | What the thread hangs on. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entityKind",
"entityId"
],
"properties": {
"entityId": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"entityKind": {
"enum": [
"workbench_flow",
"compass_page",
"compass_opportunity",
"caliper_review",
"caliper_dataset",
"caliper_rubric",
"caliper_eval",
"caliper_spec",
"napkin_board",
"napkin_diagram",
"napkin_doc",
"napkin_sheet",
"napkin_interface",
"ledger_entry",
"prism_field",
"workspace_file"
],
"type": "string",
"description": "What the thread hangs on."
}
}
}Sets a comment thread's resolved state (rootId = the thread's root comment id). Resolve ONLY when the human asked or the thread's question is demonstrably settled — and say what settled it in a reply first. Reopening is for new evidence.
| Argument | Type | Description |
|---|---|---|
| rootId* | string | |
| resolved* | boolean | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"rootId",
"resolved"
],
"properties": {
"rootId": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"resolved": {
"type": "boolean"
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
}
}
}Without a tag: every tag in use across the workspace with how many entities carry it, most-used first — the vocabulary the team already organizes by. With a tag: everything filed under it across every tool, each with its kind, id, title, and path. Use it to reuse existing labels instead of inventing near-duplicates, and to answer 'show me everything about X' when X is a label.
| Argument | Type | Description |
|---|---|---|
| tag | string | A tag to expand into its items. Omit to list tags. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tag": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "A tag to expand into its items. Omit to list tags."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
}
}
}Returns the tags on a batch of entities of one kind — the labels galleries organize by. Ids come from the kind's list/get tool or from search_workspace. Use it before entity_tags_set so you replace the full set knowingly, and to answer 'what is this filed under'. Entities the user can't see are omitted.
| Argument | Type | Description |
|---|---|---|
| ids* | array | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| entityKind* | string | Which kind the ids belong to. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entityKind",
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 100,
"minItems": 1
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"entityKind": {
"enum": [
"workbench_flow",
"workbench_task",
"workbench_kb",
"compass_page",
"compass_opportunity",
"caliper_dataset",
"caliper_rubric",
"caliper_eval",
"caliper_review",
"caliper_spec",
"caliper_source",
"ledger_entry",
"ledger_metric",
"napkin_board",
"napkin_deck",
"napkin_doc",
"napkin_sheet",
"napkin_diagram",
"prism_field",
"prism_study"
],
"type": "string",
"description": "Which kind the ids belong to."
}
}
}Replaces the FULL tag set on one entity (an empty list clears it). Read the current tags with entity_tags_get first and pass the merged list — this is not additive. Tags are lowercase letters, numbers, spaces, and hyphens; prefer labels already in use (entity_tags_browse) so the workspace's vocabulary stays small. The id comes from the kind's list/get tool or search_workspace.
| Argument | Type | Description |
|---|---|---|
| tags* | array | |
| entityId* | string | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation response. Omit on the first call. |
| entityKind* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entityKind",
"entityId",
"tags"
],
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9](?:[a-z0-9 -]*[a-z0-9])?$",
"maxLength": 40
},
"maxItems": 50
},
"entityId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation response. Omit on the first call."
},
"entityKind": {
"enum": [
"workbench_flow",
"workbench_task",
"workbench_kb",
"compass_page",
"compass_opportunity",
"caliper_dataset",
"caliper_rubric",
"caliper_eval",
"caliper_review",
"caliper_spec",
"caliper_source",
"ledger_entry",
"ledger_metric",
"napkin_board",
"napkin_deck",
"napkin_doc",
"napkin_sheet",
"napkin_diagram",
"prism_field",
"prism_study"
],
"type": "string"
}
}
}Fetch the full Markdown body of a specific docs page by its slug. Use this after `search_docs` when the user needs the complete content of a page. No authentication required.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Page slug. Accepts 'compass/api', '/compass/api', or 'docs/compass/api'. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "Page slug. Accepts 'compass/api', '/compass/api', or 'docs/compass/api'."
}
}
}Records what happened against an open decision — a manual observation the user reports ('the pilot team says triage feels faster'), an implementation note, or a reference to a Caliper run. Evidence is what settlement later reads, so attach it as it arrives and cite it in the lesson. Metric readings attach themselves via ledger_metrics_record_reading — don't duplicate them here. Fails with conflict on superseded entries. Ids come from ledger_entries_list. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| data | object | Structured detail worth keeping with the summary. |
| kind | string | Usually `manual`; `caliper_eval_run` with refId for a run; `implementation` when the change shipped. |
| refId | string | Source record id (a Caliper run id, …) when there is one. |
| entryId* | string | The entry the evidence is about. |
| summary* | string | What happened, in one or two sentences. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
Records a memory entry. Every entry is a TITLE (`summary`: one short plain sentence) over a BODY (`rationale`: the detail, markdown welcome) — never put the detail in the title. Three kinds: `decision` — a change being made now; PRE-REGISTRATION IS THE POINT, so `prediction` (what we expect) must be written NOW, before any evidence exists, and never backfilled to match an outcome. `lesson` — a distilled belief the team already holds (`lesson` text required, no prediction). `observation` — a durable fact worth remembering (no prediction): something already true, never something planned. Ideas, pitches, backlog items, and upcoming work are NOT entries — a dated piece of work that carries out a decision is a plan item (ledger_plan_add on that decision), and a running list you keep across runs belongs in a Napkin doc or sheet. When a user states something durable about their business in conversation, offer to capture it as a lesson or observation. When a user shares MEETING NOTES, propose the decisions you find with ledger_entries_draft so they keep or drop each one in Ledger; use this tool for an entry they've asked you to record. Link the Compass pages the entry touches so future consult-before-acting finds it. May return `needs_confirmation` — summarize the entry and wait for approval.
| Argument | Type | Description |
|---|---|---|
| kind | string | decision = a change with a pre-registered expectation; lesson = a belief arriving already settled; observation = a fact that is already true (not a plan, idea, or pitch). |
| lesson | string | What we learned — required for kind=lesson, optional for kind=observation, forbidden on decisions (their lesson is written at settlement). |
| summary* | string | The entry's TITLE: one short plain sentence naming what we did (decision) or the fact itself (lesson, observation). Plain text, no markdown, at most 280 characters — e.g. "Newsletter moves to a biweekly cadence". Everything longer goes in rationale. |
Writes up to 50 entries as DRAFTS: proposals that stay out of the record until a person confirms each one in Ledger's Drafts view. Use it for entries you found rather than were told — decisions in meeting notes, or a team's past changes read from its tracker, pull requests or launch posts (set `fromHistory: true`). For history: take each claim from what the source said AT THE TIME, set `landedAt` to when it shipped, attach the source URL, and leave `rollout` as full unless the source says otherwise. These read as low confidence because they were written down after the fact; say so plainly rather than overstating them. Tell the person how many drafts are waiting and that they review them under Decisions → Drafts. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| drafts* | array | |
| workspace | string | Workspace slug. Ignored for workspace API keys. |
| approvalId | string | |
| fromHistory | boolean | True when the drafts come from a team's past work, not the conversation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"drafts"
],
"properties": {
"drafts": {
"type": "array",
"items": {
"type": "object",
"required": [
"summary"
],
"properties": {
"kind": {
"enum": [
"decision",
"lesson",
"observation",
"belief"
],
"type": "string",
"default": "decision"
},
"lesson": {
"type": "string",
"maxLength": 4000
},
"source": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"title": {
"type": "string",
"maxLength": 300
}
},
"description": "Where the claim came from — the ticket, pull request or post."
},
"rollout": {
"enum": [
"full",
"partial",
"controlled"
],
"type": "string",
"description": "full unless the source says it was staged (partial) or had a held-out group (controlled)."
},
"summary": {
"type": "string",
"maxLength": 280,
"minLength": 1,
"description": "The TITLE: one short plain sentence naming the change or fact."
},
"landedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "When the change took effect: the merge, ship or launch date. Set once."
},
"rationale": {
"type": "string",
"maxLength": 4000,
"description": "The BODY. For history, quote what the source said the change was for."
},
"prediction": {
"type": "object",
"properties": {
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"source"
],
"properties": {
"hold": {
"type": "object",
"required": [
"kind"
],
"properties": {
"days": {
"type": "integer",
"default": 28,
"maximum": 365,
"minimum": 1
},
"kind": {
"type": "string",
"const": "pre_landing"
},
"maxDrop": {
"type": "number",
"default": 0,
"maximum": 1,
"minimum": 0
},
"maxRise": {
"type": "number",
"maximum": 1,
"minimum": 0
}
}
},
"unit": {
"type": "string",
"maxLength": 50
},
"slice": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1
}
},
"watch": {
"type": "boolean"
},
"evalId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"source": {
"enum": [
"caliper_eval",
"metric",
"manual"
],
"type": "string"
},
"target": {
"type": "number"
},
"metricId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"comparator": {
"enum": [
">=",
"<=",
">",
"<",
"="
],
"type": "string"
}
}
},
"default": [],
"maxItems": 10
},
"deadline": {
"type": "string",
"maxLength": 40
},
"freeform": {
"type": "string",
"maxLength": 2000
}
},
"description": "Decisions only. For history, the claim the source made at the time, not one fitted to what happened since."
}
}
},
"maxItems": 50,
"minItems": 1
},
"workspace": {
"type": "string",
"description": "Workspace slug. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
},
"fromHistory": {
"type": "boolean",
"description": "True when the drafts come from a team's past work, not the conversation."
}
}
}One entry's full anatomy — the six fields, attached evidence (Caliper runs, measurements, observations), and the supersede chain (what replaced it, or what it replaced). Cite entry ids when telling the user about prior related decisions.
| Argument | Type | Description |
|---|---|---|
| entryId* | string | Entry id (from ledger_entries_list). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId"
],
"properties": {
"entryId": {
"type": "string",
"description": "Entry id (from ledger_entries_list)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
}
}
}The workspace's memory: decisions (changes with pre-registered expectations), lessons (distilled beliefs), and observations (captured facts). CONSULT BEFORE ACTING — before proposing a flow change, prompt edit, or process decision, filter by the Compass page it touches (compassPageId) and check whether prior attempts exist and how they settled. Filter status=open for unsettled expectations awaiting evidence (each carries a derived `lapsed` flag — true when its deadline has passed; surface lapsed ones when the user asks what needs attention); kind=lesson for what the team already believes.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text search across an entry's summary, rationale, and lesson (case-insensitive). Use it to find the entry about a topic before acting. |
| kind | string | Filter by species: decision (pre-registered expectations), lesson (distilled beliefs), observation (captured facts). |
| cursor | string | Pagination cursor from a prior page. |
| origin | string | Filter by who wrote it (manual, workbench, …). |
| status | string | Filter by lifecycle state (open = awaiting evidence). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
Takes an entry out of the curated ledger — THE remedy when you recorded something wrong (a decision that wasn't made, a duplicate, a fact the user corrects). Reversible from Ledger and fully audited, so it is safe to offer as soon as the user says 'that's not right'. Not for overturning a settled claim the team once believed — a human supersedes that. Fails with conflict if already retracted. Ids come from ledger_entries_list. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| entryId* | string | The entry to retract. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId"
],
"properties": {
"entryId": {
"type": "string",
"description": "The entry to retract."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
}
}
}The ritual moment: evidence has landed, the expectation closes, the lesson is written. Only propose settlement when attached evidence actually answers the prediction — check `ledger_entries_get` first and cite the evidence in the lesson. `lesson` (what we now believe) is required and permanent; settlement happens exactly once. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| lesson* | string | What we now believe — the distilled, citable lesson. |
| entryId* | string | The open entry to settle. |
| verdict | string | Did the pre-registered expectation hold? `confirmed` every claim came out as hoped, `missed` none did, `mixed` some did and some didn't. Mixed is not a softer miss — "it worked and it cost us something" is usually the most informative result a change can produce, so use it rather than rounding to either side. Only when the entry carries an expectation and the evidence gives a clear answer. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId",
"lesson"
],
"properties": {
"lesson": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "What we now believe — the distilled, citable lesson."
},
"entryId": {
"type": "string",
"description": "The open entry to settle."
},
"verdict": {
"enum": [
"confirmed",
"mixed",
"missed"
],
"type": "string",
"description": "Did the pre-registered expectation hold? `confirmed` every claim came out as hoped, `missed` none did, `mixed` some did and some didn't. Mixed is not a softer miss — \"it worked and it cost us something\" is usually the most informative result a change can produce, so use it rather than rounding to either side. Only when the entry carries an expectation and the evidence gives a clear answer."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
}
}
}Corrects an entry in place — its title (summary), body (rationale), the pre-registered prediction of an OPEN decision (null clears it), or its facet (filing category; editable even after settlement). Works on open decisions, and on lessons, observations, and beliefs (they carry no expectation, so fixing their wording is fine any time). Use to fix a typo, swapped fields, or a misrecorded detail. Never edits kind or lesson. Fails with conflict on a settled decision — its claim is corrected by a human superseding it in Ledger — and on superseded or retracted entries. Entry ids come from ledger_entries_list. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| facet | any | Filing facet; empty string = unassigned. |
| entryId* | string | The entry to edit: an open decision, or a lesson / observation / belief. |
| summary | string | New title: one short plain sentence, no markdown, at most 280 characters. |
| rationale | string | New body: the detail under the title; markdown is fine. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
The connected servers this workspace exposes to you, with the id a feed needs. Their tools appear to you namespaced as `ext__<name>__<tool>` — call one directly to see what it returns before proposing a feed. A server the workspace has switched off for you is not listed and cannot be fed from here.
| Argument | Type | Description |
|---|---|---|
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
}
}
}Run the same frozen instruction over a past range, so a metric has history instead of starting the day it was set up. Offer this whenever you create a feed — a chart with a year behind it is worth far more than one that begins today, and an expectation can be judged against what normal looked like. Works when the source returns a series; a source that only ever reports 'right now' will write one point. Safe to repeat: overlapping ranges dedupe. Keep ranges to a few hundred points; a run that fills up says so. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| id* | string | Feed id, from ledger_feeds_list. |
| to | string | End of the range. Defaults to now. |
| from* | string | Start of the range, ISO date or instant. |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"from"
],
"properties": {
"id": {
"type": "string",
"description": "Feed id, from ledger_feeds_list."
},
"to": {
"type": "string",
"description": "End of the range. Defaults to now."
},
"from": {
"type": "string",
"description": "Start of the range, ISO date or instant."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
}
}
}Freeze a tool call as a metric's standing source: it runs on the cadence you give and records what it finds, with no model involved. `metric` takes an id or a snake_case slug; an unknown slug starts tracking that metric. Confirm the mapping with ledger_feeds_preview first. Tell the user they can backfill history afterwards with ledger_feeds_backfill. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| label | string | Short name for the feed, e.g. "Weekly signups". |
| metric* | string | Metric id, or a snake_case slug to start tracking. |
| mapping* | object | |
| schedule* | object | |
| toolArgs | object | |
| toolName* | string | The tool's own name on that server. |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string | |
| windowHours | integer |
Remove a feed. The readings it already wrote stay — the series is the record and outlives the instruction. Prefer pausing with ledger_feeds_update when the user might want it back. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| id* | string | Feed id, from ledger_feeds_list. |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Feed id, from ledger_feeds_list."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
}
}
}The standing instructions for how metrics' numbers arrive — which tool each one calls, how often, and how the last run went. Check before proposing a feed so you don't duplicate one, and consult when a user asks why a metric is stale: a feed with a failing last run is usually the answer.
| Argument | Type | Description |
|---|---|---|
| metricId | string | Narrow to one metric (id or slug). |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"metricId": {
"type": "string",
"description": "Narrow to one metric (id or slug)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
}
}
}Call a connected server's tool once and see what a mapping would pull out of the response — nothing is written and no feed is created. Send no `mapping` for a first look: you get a sample of the response plus the paths that hold numbers. Then send a mapping to confirm it finds the readings you expect. Always do this before ledger_feeds_create; proposing a feed whose mapping you haven't seen work is how a metric fills up with the wrong number. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| mapping | object | How to read the number. Omit on the first look. |
| toolArgs | object | Arguments, exactly as the tool wants them. Use {{from}} / {{to}} (ISO instants) or {{date}} (YYYY-MM-DD) where a time range goes — those are substituted per run, and are what let one feed also backfill. |
| toolName* | string | The tool's own name on that server — NOT the ext__ namespaced form you call it by. |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string | |
| windowHours | integer | How far back the preview's window reaches. Default 24. |
| integrationId* | string | From ledger_feed_sources_list. |
Run a feed immediately over its own window and record what it finds. Use it right after creating one to prove the mapping works — a run that comes back `empty` names the path that missed, which is what you fix with ledger_feeds_update. Does not move the feed's schedule. Re-running is safe: readings dedupe per time bucket. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| id* | string | Feed id, from ledger_feeds_list. |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Feed id, from ledger_feeds_list."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
}
}
}Change a feed's arguments, mapping, cadence, or pause it. Reach for this when a feed's last run reports `empty` (the response shape moved, so the mapping needs a new path) or `error`. Changing the mapping changes what the number means, so say what you're changing and why. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| id* | string | Feed id, from ledger_feeds_list. |
| label | string | |
| enabled | boolean | false pauses it; the definition and history are kept. |
| mapping | object | |
| schedule | object | |
| toolArgs | object | |
| toolName | string | |
| workspace | string | Workspace slug. Omit to use the pinned workspace. |
| approvalId | string | |
| windowHours |
Creates the named presets as real metrics the workspace owns, tagged from the catalog. Safe to repeat: a preset the workspace already has comes back `already_present` rather than creating a second series, and a workspace's own renames and targets are never overwritten. Adopt only what the user agreed to — a metric nobody reads is noise on the Metrics tab, and eight thoughtful ones beat forty. Tell them the metrics start empty and the next step is a feed (ledger_feeds_create) or a first reading. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| slugs* | array | Preset slugs from ledger_metric_presets_list. |
| workspace | string | Workspace slug. Ignored for workspace API keys. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slugs"
],
"properties": {
"slugs": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40,
"minItems": 1,
"description": "Preset slugs from ledger_metric_presets_list."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
}
}
}Ready-made metrics a business can start tracking, each with a unit, a cadence, which direction is good, a business surface (facet), and cross-cutting tags. Reach for this when a workspace has few or no metrics, when someone asks what they should be measuring, or when a decision needs a number to settle against and none exists. Filter by `facet` (where it lives in the business) or `tag` (what kind of number it is). Suggest a SMALL set — three to six that fit what you know about this business — and say in one sentence why each one, rather than listing the catalog. Adopt with ledger_metric_presets_adopt. These are starting points: a workspace renames and retargets them freely afterwards.
| Argument | Type | Description |
|---|---|---|
| tag | string | Cross-cutting bucket, e.g. retention, cost, speed. |
| facet | string | Business surface, matching the Ledger facet taxonomy. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tag": {
"enum": [
"revenue",
"growth",
"retention",
"efficiency",
"quality",
"speed",
"cost",
"risk",
"team",
"customer",
"pipeline",
"reliability",
"usage",
"reach",
"cash"
],
"type": "string",
"description": "Cross-cutting bucket, e.g. retention, cost, speed."
},
"facet": {
"enum": [
"product",
"pricing",
"gtm",
"sales",
"people",
"ops",
"tooling",
"finance",
"positioning",
"risk"
],
"type": "string",
"description": "Business surface, matching the Ledger facet taxonomy."
}
}
}Creates a starter's metrics at their levels and links them. Pass `slugs` to keep only some of its metrics; links are made only where both ends exist. Safe to repeat and safe after a different starter: metrics the workspace already has are left as they are and get linked into the tree. Adopt only what the user agreed to. Tell them the metrics start empty and the next step is connecting a source (ledger_feeds_create) or a first reading. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| slugs | array | The starter's metrics to keep. Omit for all of them. |
| starter* | string | Starter slug from ledger_metric_starters_list. |
| workspace | string | Workspace slug. Ignored for workspace API keys. |
| approvalId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"starter"
],
"properties": {
"slugs": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40,
"description": "The starter's metrics to keep. Omit for all of them."
},
"starter": {
"type": "string",
"description": "Starter slug from ledger_metric_starters_list."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
}
}
}Starter trees by shape of business or team (subscription software, services firm, online store, sales team, service operation). Each lists its metrics with a level (outcome / driver / activity) and the links between them (which number moves which). Reach for this before ledger_metric_presets_list when a workspace has no metrics yet or asks how its numbers fit together: pick the starter that matches what you know about the business, describe its tree in a sentence or two, and offer to adopt it with ledger_metric_starters_adopt, dropping any metric that doesn't fit.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Takes a metric out of the gallery (`archived: true`) or puts it back (`false`). Readings stay, and entries that settled against it still read correctly — this is the cleanup for a metric minted once and abandoned, or one the workspace stopped watching. `metricId` accepts the id or slug from ledger_metrics_list. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| archived* | boolean | true to archive, false to restore. |
| metricId* | string | Metric id or slug (from ledger_metrics_list). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metricId",
"archived"
],
"properties": {
"archived": {
"type": "boolean",
"description": "true to archive, false to restore."
},
"metricId": {
"type": "string",
"description": "Metric id or slug (from ledger_metrics_list)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
}
}
}Create a metric — a number the workspace watches (triage time, weekly signups, cost per run). Check ledger_metrics_list first; names are unique per workspace. When a user says they want to track or measure something, offer this. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| icon | string | The thing the number counts, e.g. phone for calls, landmark for profit. |
| name* | string | e.g. "Triage time". |
| unit | string | Display unit — "min", "%", "$", "tickets/day". |
| level | string | outcome = what the business is judged on; driver = moves an outcome; activity = daily work. |
| drives | array | Ids of existing metrics this one moves. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | |
| description | string | What the number means and where it comes from. |
One metric's definition (unit, kind, direction, target, cadence) plus its readings newest first and the open decisions bound to it. Use before answering 'how is X trending?' or before recording a reading against it. `metricId` accepts the id or the snake_case slug from ledger_metrics_list. For an event metric whose readings carry labels, `labels` lists each label and its values, largest total first. Pass `slice` to get the series for part of it ("new users in DE"), or `by` to split the series by one label ("new users by country"); either returns `series`, summed per `bucket`.
| Argument | Type | Description |
|---|---|---|
| by | string | Event metrics only. A label name to split the series by. |
| slice | object | Event metrics only. Per label, the values to keep: { country: ["DE", "AT"] } keeps readings from DE or AT; several labels must all match. Names and values come from `labels`. |
| bucket | string | Series bucket when `slice` or `by` is set. Default week. |
| metricId* | string | Metric id or slug (from ledger_metrics_list). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metricId"
],
"properties": {
"by": {
"type": "string",
"description": "Event metrics only. A label name to split the series by."
},
"slice": {
"type": "object",
"description": "Event metrics only. Per label, the values to keep: { country: [\"DE\", \"AT\"] } keeps readings from DE or AT; several labels must all match. Names and values come from `labels`.",
"propertyNames": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1
}
},
"bucket": {
"enum": [
"day",
"week",
"month"
],
"type": "string",
"description": "Series bucket when `slice` or `by` is set. Default week."
},
"metricId": {
"type": "string",
"description": "Metric id or slug (from ledger_metrics_list)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
}
}
}The numbers the workspace watches — each with unit, latest reading, and how many open decisions are bound to it. Consult when a user mentions a number that sounds like a tracked metric, and before recording a reading.
| Argument | Type | Description |
|---|---|---|
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
}
}
}Record one observation of a tracked metric. `metricId` accepts a metric id OR its snake_case slug from ledger_metrics_list; an unknown one is a not_found error — check ledger_metrics_list, create it with ledger_metrics_create, or pass `createIfMissing: true` to mint a "measure" metric at that slug in the same call (an "event" metric when the reading carries `labels`). The reading automatically lands as evidence on every open decision whose prediction is bound to this metric — so when a user reports a number ("triage is down to 12 minutes"), offer to record it. For event-kind metrics, omit `value` to count one occurrence. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| at | string | ISO timestamp the reading is for. Defaults to now; set it when backfilling an earlier reading. |
| key | string | Idempotency key (e.g. "2026-w32") — a repeat write with the same key returns the original reading instead of doubling the series. Use for scheduled/recurring recordings. The key is per set of labels, so one key per day can cover every country. |
| note | string | Where the number came from, if worth recording. |
| value | number | The observed value, in the metric's unit. Omit for event-kind metrics to record one occurrence. |
| labels | object | Event metrics only. What this count is broken down by, e.g. { country: "DE", plan: "pro" } — snake_case names, string values. Lets the metric be read and claimed by slice later. Refused on a measure. |
| metricId |
Corrects a metric's name, unit, description, kind (measure / event), direction (which way is good), target, cadence, icon, level, or the metrics it drives (its place in the metric tree). Readings are untouched. Only what you pass changes. The slug is not editable here — external writers address metrics by slug. Fails with conflict when a rename collides with a live metric. `metricId` is the id from ledger_metrics_list. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| icon | any | The mark the metric wears in every tool: the thing it counts (phone for calls, landmark for profit). "" goes back to the catalog's icon. |
| kind | string | measure = a value each reading; event = a count of occurrences. |
| name | string | |
| unit | string | "min", "%", "$", "tickets/day". |
| level | any | outcome = what the business is judged on; driver = a number that moves an outcome; activity = daily work. "" unplaces it. |
| drives | array | Ids of the metrics this one moves. Replaces the current set; pass the full list. Loops are refused. |
| target | any | Goal value in the metric's unit; null clears. |
Adds a plan item to an OPEN decision (the work that carries it out: a post, a launch step, an email). Omit entryId for a standalone date (a holiday, an event you're only watching). Items are all-day unless you pass startTime with timeZone (and optionally endTime), for a webinar, a scheduled post, or a launch at noon. If the date costs money or time and comes with an expectation, record it as a decision with ledger_entries_create instead. Use repeatWeeklyUntil for a weekly cadence: it writes one row per week (max 60), each movable on its own. Fails with conflict once the decision is settled. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| url | string | Where the work lives (draft, deck, published post). |
| note | string | |
| tags | array | What kind of work it is: blog, video, social, event… Reuse the workspace's existing tags (see ledger_plan_list). |
| dueOn* | string | A calendar day, YYYY-MM-DD. |
| title* | string | |
| endTime | string | Same-day end, after startTime. |
| entryId | string | The open decision this carries out. |
| timeZone | string |
Removes one plan item while its decision is open, for an item added by mistake or work that's no longer planned. If the work was planned and then dropped, prefer ledger_plan_update with status 'skipped' so settlement can see it. Fails with conflict once the decision is settled. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| itemId* | string | |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"itemId"
],
"properties": {
"itemId": {
"type": "string"
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
}
}
}Pass `entryId` for one decision's plan items, or `from` + `to` (YYYY-MM-DD, at most about a year apart) for the calendar: decision spans (recorded day → expectation deadline) plus every dated item inside the window, including standalone dates with no decision. Filter the calendar by `ownerUserId` to answer 'what's mine this week' or to find tomorrow's items to draft. Never use it to compare or rank people's output.
| Argument | Type | Description |
|---|---|---|
| to | string | A calendar day, YYYY-MM-DD. |
| tag | string | Only items with this tag (blog, video, event…). |
| from | string | A calendar day, YYYY-MM-DD. |
| entryId | string | One decision's plan. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| ownerUserId | string | Only items owned by this member. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"description": "A calendar day, YYYY-MM-DD."
},
"tag": {
"type": "string",
"description": "Only items with this tag (blog, video, event…)."
},
"from": {
"type": "string",
"description": "A calendar day, YYYY-MM-DD."
},
"entryId": {
"type": "string",
"description": "One decision's plan."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"ownerUserId": {
"type": "string",
"description": "Only items owned by this member."
}
}
}Edits one plan item while its decision is open: move it (dueOn), rename it, change the owner (null clears), attach the link, or set status (planned | done | skipped). Mark done only when the user says it shipped; a link alone doesn't mean done. Fails with conflict once the decision is settled. May return `needs_confirmation`.
| Argument | Type | Description |
|---|---|---|
| url | any | |
| note | string | |
| tags | array | Replaces the item's tags. |
| dueOn | string | A calendar day, YYYY-MM-DD. |
| title | string | |
| itemId* | string | |
| status | string | |
| endTime | any | |
| timeZone | any | Required when setting startTime. |
| startTime | any |
Enumerate all available docs pages, optionally filtered by product (e.g. 'compass', 'legal', 'overview'). Use this to discover what slugs exist before calling `get_doc`. No authentication required.
| Argument | Type | Description |
|---|---|---|
| product | string | Optional product slug filter (e.g. 'compass', 'legal', 'overview'). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"product": {
"type": "string",
"description": "Optional product slug filter (e.g. 'compass', 'legal', 'overview')."
}
}
}Search ZeroWidth product documentation. Returns matching pages with title, slug, public URL, and a query-relevant snippet. Use this when the user asks about a ZeroWidth product (Compass, Workbench, Caliper, Prism, Ledger, Napkin, the assistant), an API behavior, or a policy. No authentication required — the docs corpus is public.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max number of results. Defaults to 10. |
| query* | string | Search query — keywords or natural-language phrase. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"description": "Max number of results. Defaults to 10.",
"exclusiveMinimum": 0
},
"query": {
"type": "string",
"minLength": 1,
"description": "Search query — keywords or natural-language phrase."
}
}
}Finds anything in the workspace in one call — uploaded files (searching the text inside them), folders, Workbench flows, shims, knowledge bases and tasks, Compass pages and changes, Caliper datasets, evals, rubrics, reviews, specs and sources, Ledger entries, Napkin sketches, decks, docs, sheets, diagrams and interfaces. The same search the person uses in Home. Use it FIRST whenever the user mentions something without saying where it lives ('the SOW', 'the dispatch interviews', 'that invoice'). The query is words in any order: each word must appear in the thing's name, its tags, the names of the folders it's filed under, or the text inside it — so 'northwind sow' finds the SOW filed in the Northwind folder, and 'dispatch interview' finds 'Dispatcher interview 1.md'. Results are ranked best first. Each hit carries its id, kind, path (for a link), folderPath (where it's filed, top-down), tags, and a snippet when the words were found inside it rather than in its name — say where a thing lives using folderPath. A file's id feeds workspace_files_read; other ids feed the kind's *_get tool. Pass folderId to search only inside one folder and everything under it. If nothing comes back, try fewer or different words before telling the user it doesn't exist. Results only include what the user can see, and only kinds this token may read.
| Argument | Type | Description |
|---|---|---|
| q* | string | Words, any order, case-insensitive. Fewer words find more. |
| kinds | array | Restrict to these kinds (file, folder, flow, page, doc, dataset, …). Omit to search everything. |
| limit | integer | |
| folderId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId",
"summary"
],
"properties": {
"data": {
"type": "object",
"description": "Structured detail worth keeping with the summary.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"kind": {
"enum": [
"caliper_eval_run",
"manual",
"metric_reading",
"implementation",
"task_run",
"verbatim",
"source"
],
"type": "string",
"default": "manual",
"description": "Usually `manual`; `caliper_eval_run` with refId for a run; `implementation` when the change shipped."
},
"refId": {
"type": "string",
"maxLength": 100,
"description": "Source record id (a Caliper run id, …) when there is one."
},
"entryId": {
"type": "string",
"description": "The entry the evidence is about."
},
"summary": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What happened, in one or two sentences."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
}
}
}| rationale | string | The entry's BODY: the detail under the title — why, context, lists, steps. Markdown is fine here and renders as formatted text. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
| prediction | object | Decisions ONLY. What we expect: a list of `claims` plus one shared `deadline`, or `freeform` for room decisions nothing can settle. A claim either REACHES a value (comparator + target, e.g. CTA clicks >= 400) or HOLDS one (`hold`, e.g. newsletter reads no more than 5% below the 28 days before this). Name every number the change is expected to move AND every number it shouldn't cost — a decision that claims only what it hopes will rise gets to pick its own evidence. Set `watch: true` on a number worth following that the decision isn't committing to. When the change aims at part of an event metric ("new users in Germany"), narrow the claim with `slice` ({ country: ["DE"] }) using label values from ledger_metrics_get — a claim on an event metric settles on the total counted since landing (reach) or events per day (hold). |
| compassPageIds | array | Where — Compass page ids this decision touches. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"summary"
],
"properties": {
"kind": {
"enum": [
"decision",
"lesson",
"observation",
"belief"
],
"type": "string",
"default": "decision",
"description": "decision = a change with a pre-registered expectation; lesson = a belief arriving already settled; observation = a fact that is already true (not a plan, idea, or pitch)."
},
"lesson": {
"type": "string",
"maxLength": 4000,
"description": "What we learned — required for kind=lesson, optional for kind=observation, forbidden on decisions (their lesson is written at settlement)."
},
"summary": {
"type": "string",
"maxLength": 280,
"minLength": 1,
"description": "The entry's TITLE: one short plain sentence naming what we did (decision) or the fact itself (lesson, observation). Plain text, no markdown, at most 280 characters — e.g. \"Newsletter moves to a biweekly cadence\". Everything longer goes in rationale."
},
"rationale": {
"type": "string",
"maxLength": 4000,
"description": "The entry's BODY: the detail under the title — why, context, lists, steps. Markdown is fine here and renders as formatted text."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
},
"prediction": {
"type": "object",
"properties": {
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"source"
],
"properties": {
"hold": {
"type": "object",
"required": [
"kind"
],
"properties": {
"days": {
"type": "integer",
"default": 28,
"maximum": 365,
"minimum": 1
},
"kind": {
"type": "string",
"const": "pre_landing"
},
"maxDrop": {
"type": "number",
"default": 0,
"maximum": 1,
"minimum": 0
},
"maxRise": {
"type": "number",
"maximum": 1,
"minimum": 0
}
}
},
"unit": {
"type": "string",
"maxLength": 50
},
"slice": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1
}
},
"watch": {
"type": "boolean"
},
"evalId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"source": {
"enum": [
"caliper_eval",
"metric",
"manual"
],
"type": "string"
},
"target": {
"type": "number"
},
"metricId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"comparator": {
"enum": [
">=",
"<=",
">",
"<",
"="
],
"type": "string"
}
}
},
"default": [],
"maxItems": 10
},
"deadline": {
"type": "string",
"maxLength": 40
},
"freeform": {
"type": "string",
"maxLength": 2000
}
},
"description": "Decisions ONLY. What we expect: a list of `claims` plus one shared `deadline`, or `freeform` for room decisions nothing can settle. A claim either REACHES a value (comparator + target, e.g. CTA clicks >= 400) or HOLDS one (`hold`, e.g. newsletter reads no more than 5% below the 28 days before this). Name every number the change is expected to move AND every number it shouldn't cost — a decision that claims only what it hopes will rise gets to pick its own evidence. Set `watch: true` on a number worth following that the decision isn't committing to. When the change aims at part of an event metric (\"new users in Germany\"), narrow the claim with `slice` ({ country: [\"DE\"] }) using label values from ledger_metrics_get — a claim on an event metric settles on the total counted since landing (reach) or events per day (hold)."
},
"compassPageIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Where — Compass page ids this decision touches."
}
}
}| compassPageId | string | Compass page id — every decision touching that workflow / system / person. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"description": "Free-text search across an entry's summary, rationale, and lesson (case-insensitive). Use it to find the entry about a topic before acting."
},
"kind": {
"enum": [
"decision",
"lesson",
"observation",
"belief"
],
"type": "string",
"description": "Filter by species: decision (pre-registered expectations), lesson (distilled beliefs), observation (captured facts)."
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a prior page."
},
"origin": {
"enum": [
"manual",
"workbench",
"caliper",
"compass",
"prism",
"room",
"assistant",
"import"
],
"type": "string",
"description": "Filter by who wrote it (manual, workbench, …)."
},
"status": {
"enum": [
"draft",
"open",
"settled",
"superseded"
],
"type": "string",
"description": "Filter by lifecycle state (open = awaiting evidence)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"compassPageId": {
"type": "string",
"description": "Compass page id — every decision touching that workflow / system / person."
}
}
}| prediction | any | Replacement expectation (claims + deadline, or freeform), or null to clear it. Correcting a misrecorded expectation is fine; rewriting one to match what happened is not. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId"
],
"properties": {
"facet": {
"anyOf": [
{
"enum": [
"product",
"pricing",
"gtm",
"sales",
"people",
"ops",
"tooling",
"finance",
"positioning",
"risk"
],
"type": "string"
},
{
"type": "string",
"const": ""
}
],
"description": "Filing facet; empty string = unassigned."
},
"entryId": {
"type": "string",
"description": "The entry to edit: an open decision, or a lesson / observation / belief."
},
"summary": {
"type": "string",
"maxLength": 280,
"minLength": 1,
"description": "New title: one short plain sentence, no markdown, at most 280 characters."
},
"rationale": {
"type": "string",
"maxLength": 4000,
"description": "New body: the detail under the title; markdown is fine."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
},
"prediction": {
"anyOf": [
{
"type": "object",
"properties": {
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"source"
],
"properties": {
"hold": {
"type": "object",
"required": [
"kind"
],
"properties": {
"days": {
"type": "integer",
"default": 28,
"maximum": 365,
"minimum": 1
},
"kind": {
"type": "string",
"const": "pre_landing"
},
"maxDrop": {
"type": "number",
"default": 0,
"maximum": 1,
"minimum": 0
},
"maxRise": {
"type": "number",
"maximum": 1,
"minimum": 0
}
}
},
"unit": {
"type": "string",
"maxLength": 50
},
"slice": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1
}
},
"watch": {
"type": "boolean"
},
"evalId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"source": {
"enum": [
"caliper_eval",
"metric",
"manual"
],
"type": "string"
},
"target": {
"type": "number"
},
"metricId": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"comparator": {
"enum": [
">=",
"<=",
">",
"<",
"="
],
"type": "string"
}
}
},
"default": [],
"maxItems": 10
},
"deadline": {
"type": "string",
"maxLength": 40
},
"freeform": {
"type": "string",
"maxLength": 2000
}
}
},
{
"type": "null"
}
],
"description": "Replacement expectation (claims + deadline, or freeform), or null to clear it. Correcting a misrecorded expectation is fine; rewriting one to match what happened is not."
}
}
}| How far back each run looks. Sensible per-cadence default. |
| integrationId* | string | From ledger_feed_sources_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metric",
"integrationId",
"toolName",
"mapping",
"schedule"
],
"properties": {
"label": {
"type": "string",
"maxLength": 120,
"description": "Short name for the feed, e.g. \"Weekly signups\"."
},
"metric": {
"type": "string",
"description": "Metric id, or a snake_case slug to start tracking."
},
"mapping": {
"type": "object",
"required": [
"shape",
"valuePath"
],
"properties": {
"shape": {
"enum": [
"scalar",
"series"
],
"type": "string"
},
"atPath": {
"type": "string",
"maxLength": 200
},
"valuePath": {
"type": "string",
"maxLength": 200
},
"seriesPath": {
"type": "string",
"maxLength": 200
}
}
},
"schedule": {
"type": "object",
"required": [
"interval"
],
"properties": {
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"interval": {
"enum": [
"hourly",
"daily",
"weekly"
],
"type": "string"
},
"timezone": {
"type": "string",
"maxLength": 64
},
"dayOfWeek": {
"type": "integer",
"maximum": 6,
"minimum": 0
}
}
},
"toolArgs": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"toolName": {
"type": "string",
"description": "The tool's own name on that server."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
},
"windowHours": {
"type": "integer",
"maximum": 9600,
"minimum": 1,
"description": "How far back each run looks. Sensible per-cadence default."
},
"integrationId": {
"type": "string",
"description": "From ledger_feed_sources_list."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"integrationId",
"toolName"
],
"properties": {
"mapping": {
"type": "object",
"required": [
"shape",
"valuePath"
],
"properties": {
"shape": {
"enum": [
"scalar",
"series"
],
"type": "string"
},
"atPath": {
"type": "string",
"maxLength": 200
},
"valuePath": {
"type": "string",
"maxLength": 200
},
"seriesPath": {
"type": "string",
"maxLength": 200
}
},
"description": "How to read the number. Omit on the first look."
},
"toolArgs": {
"type": "object",
"description": "Arguments, exactly as the tool wants them. Use {{from}} / {{to}} (ISO instants) or {{date}} (YYYY-MM-DD) where a time range goes — those are substituted per run, and are what let one feed also backfill.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"toolName": {
"type": "string",
"description": "The tool's own name on that server — NOT the ext__ namespaced form you call it by."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
},
"windowHours": {
"type": "integer",
"maximum": 9600,
"minimum": 1,
"description": "How far back the preview's window reaches. Default 24."
},
"integrationId": {
"type": "string",
"description": "From ledger_feed_sources_list."
}
}
}| integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Feed id, from ledger_feeds_list."
},
"label": {
"type": "string",
"maxLength": 120
},
"enabled": {
"type": "boolean",
"description": "false pauses it; the definition and history are kept."
},
"mapping": {
"type": "object",
"required": [
"shape",
"valuePath"
],
"properties": {
"shape": {
"enum": [
"scalar",
"series"
],
"type": "string"
},
"atPath": {
"type": "string",
"maxLength": 200
},
"valuePath": {
"type": "string",
"maxLength": 200
},
"seriesPath": {
"type": "string",
"maxLength": 200
}
}
},
"schedule": {
"type": "object",
"required": [
"interval"
],
"properties": {
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"interval": {
"enum": [
"hourly",
"daily",
"weekly"
],
"type": "string"
},
"timezone": {
"type": "string",
"maxLength": 64
},
"dayOfWeek": {
"type": "integer",
"maximum": 6,
"minimum": 0
}
}
},
"toolArgs": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"toolName": {
"type": "string"
},
"workspace": {
"type": "string",
"description": "Workspace slug. Omit to use the pinned workspace."
},
"approvalId": {
"type": "string"
},
"windowHours": {
"type": "integer",
"maximum": 9600,
"minimum": 1
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"icon": {
"enum": [
"chart-line",
"dollar-sign",
"banknote",
"landmark",
"piggy-bank",
"wallet",
"coins",
"receipt",
"percent",
"badge-percent",
"calculator",
"chart-pie",
"trending-up",
"trending-down",
"users",
"user-plus",
"user-minus",
"user-check",
"contact",
"phone",
"handshake",
"target",
"trophy",
"magnet",
"megaphone",
"mail",
"search",
"globe",
"share-2",
"mouse-pointer-click",
"store",
"tag",
"calendar",
"clock",
"timer",
"hourglass",
"activity",
"server",
"bug",
"rocket",
"package",
"boxes",
"truck",
"undo-2",
"inbox",
"headphones",
"life-buoy",
"repeat",
"list-checks",
"clipboard-check",
"shield",
"shield-alert",
"lock",
"file-text",
"scale",
"briefcase",
"graduation-cap",
"smile",
"heart",
"star",
"message-circle",
"cpu",
"bot",
"wrench",
"layers",
"link",
"crosshair"
],
"type": "string",
"description": "The thing the number counts, e.g. phone for calls, landmark for profit."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "e.g. \"Triage time\"."
},
"unit": {
"type": "string",
"maxLength": 50,
"description": "Display unit — \"min\", \"%\", \"$\", \"tickets/day\"."
},
"level": {
"enum": [
"outcome",
"driver",
"activity"
],
"type": "string",
"description": "outcome = what the business is judged on; driver = moves an outcome; activity = daily work."
},
"drives": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Ids of existing metrics this one moves."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "What the number means and where it comes from."
}
}
}| string |
| Metric id or slug (from ledger_metrics_list). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string |
| createIfMissing | boolean | Mint the metric when the slug is unknown. Default false — an unknown slug is an error, so a typo can't quietly start a second series. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metricId"
],
"properties": {
"at": {
"type": "string",
"description": "ISO timestamp the reading is for. Defaults to now; set it when backfilling an earlier reading."
},
"key": {
"type": "string",
"maxLength": 120,
"description": "Idempotency key (e.g. \"2026-w32\") — a repeat write with the same key returns the original reading instead of doubling the series. Use for scheduled/recurring recordings. The key is per set of labels, so one key per day can cover every country."
},
"note": {
"type": "string",
"maxLength": 1000,
"description": "Where the number came from, if worth recording."
},
"value": {
"type": "number",
"description": "The observed value, in the metric's unit. Omit for event-kind metrics to record one occurrence."
},
"labels": {
"type": "object",
"description": "Event metrics only. What this count is broken down by, e.g. { country: \"DE\", plan: \"pro\" } — snake_case names, string values. Lets the metric be read and claimed by slice later. Refused on a measure.",
"propertyNames": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"additionalProperties": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
},
"metricId": {
"type": "string",
"description": "Metric id or slug (from ledger_metrics_list)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string"
},
"createIfMissing": {
"type": "boolean",
"description": "Mint the metric when the slug is unknown. Default false — an unknown slug is an error, so a typo can't quietly start a second series."
}
}
}| cadence |
| string |
| How often a reading is expected. |
| metricId* | string | Metric id (from ledger_metrics_list). |
| direction | string | up = higher is better, down = lower is better, none. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
| description | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metricId"
],
"properties": {
"icon": {
"anyOf": [
{
"enum": [
"chart-line",
"dollar-sign",
"banknote",
"landmark",
"piggy-bank",
"wallet",
"coins",
"receipt",
"percent",
"badge-percent",
"calculator",
"chart-pie",
"trending-up",
"trending-down",
"users",
"user-plus",
"user-minus",
"user-check",
"contact",
"phone",
"handshake",
"target",
"trophy",
"magnet",
"megaphone",
"mail",
"search",
"globe",
"share-2",
"mouse-pointer-click",
"store",
"tag",
"calendar",
"clock",
"timer",
"hourglass",
"activity",
"server",
"bug",
"rocket",
"package",
"boxes",
"truck",
"undo-2",
"inbox",
"headphones",
"life-buoy",
"repeat",
"list-checks",
"clipboard-check",
"shield",
"shield-alert",
"lock",
"file-text",
"scale",
"briefcase",
"graduation-cap",
"smile",
"heart",
"star",
"message-circle",
"cpu",
"bot",
"wrench",
"layers",
"link",
"crosshair"
],
"type": "string"
},
{
"type": "string",
"const": ""
}
],
"description": "The mark the metric wears in every tool: the thing it counts (phone for calls, landmark for profit). \"\" goes back to the catalog's icon."
},
"kind": {
"enum": [
"measure",
"event"
],
"type": "string",
"description": "measure = a value each reading; event = a count of occurrences."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"unit": {
"type": "string",
"maxLength": 50,
"description": "\"min\", \"%\", \"$\", \"tickets/day\"."
},
"level": {
"anyOf": [
{
"enum": [
"outcome",
"driver",
"activity"
],
"type": "string"
},
{
"type": "string",
"const": ""
}
],
"description": "outcome = what the business is judged on; driver = a number that moves an outcome; activity = daily work. \"\" unplaces it."
},
"drives": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Ids of the metrics this one moves. Replaces the current set; pass the full list. Loops are refused."
},
"target": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Goal value in the metric's unit; null clears."
},
"cadence": {
"enum": [
"",
"daily",
"weekly",
"monthly",
"quarterly"
],
"type": "string",
"description": "How often a reading is expected."
},
"metricId": {
"type": "string",
"description": "Metric id (from ledger_metrics_list)."
},
"direction": {
"enum": [
"up",
"down",
"none"
],
"type": "string",
"description": "up = higher is better, down = lower is better, none."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
},
"description": {
"type": "string",
"maxLength": 2000
}
}
}| IANA zone the time is in (America/Chicago). Required with startTime; use the user's own zone. |
| startTime | string | Omit for an all-day item. 24-hour HH:MM in timeZone. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
| ownerUserId | string | A workspace member's user id. |
| repeatWeeklyUntil | string | Also add a copy every 7 days through this day. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title",
"dueOn"
],
"properties": {
"url": {
"type": "string",
"description": "Where the work lives (draft, deck, published post)."
},
"note": {
"type": "string",
"maxLength": 2000
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "What kind of work it is: blog, video, social, event… Reuse the workspace's existing tags (see ledger_plan_list)."
},
"dueOn": {
"type": "string",
"description": "A calendar day, YYYY-MM-DD."
},
"title": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"endTime": {
"type": "string",
"description": "Same-day end, after startTime."
},
"entryId": {
"type": "string",
"description": "The open decision this carries out."
},
"timeZone": {
"type": "string",
"description": "IANA zone the time is in (America/Chicago). Required with startTime; use the user's own zone."
},
"startTime": {
"type": "string",
"description": "Omit for an all-day item. 24-hour HH:MM in timeZone."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
},
"ownerUserId": {
"type": "string",
"description": "A workspace member's user id."
},
"repeatWeeklyUntil": {
"type": "string",
"description": "Also add a copy every 7 days through this day."
}
}
}| null makes it all-day again. |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| approvalId | string | Approval id from a prior needs_confirmation envelope. |
| ownerUserId | any |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"itemId"
],
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"note": {
"type": "string",
"maxLength": 2000
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Replaces the item's tags."
},
"dueOn": {
"type": "string",
"description": "A calendar day, YYYY-MM-DD."
},
"title": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"itemId": {
"type": "string"
},
"status": {
"enum": [
"planned",
"done",
"skipped"
],
"type": "string"
},
"endTime": {
"anyOf": [
{
"type": "string",
"description": "Wall-clock time, 24-hour HH:MM."
},
{
"type": "null"
}
]
},
"timeZone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Required when setting startTime."
},
"startTime": {
"anyOf": [
{
"type": "string",
"description": "Wall-clock time, 24-hour HH:MM."
},
{
"type": "null"
}
],
"description": "null makes it all-day again."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
},
"approvalId": {
"type": "string",
"description": "Approval id from a prior needs_confirmation envelope."
},
"ownerUserId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
}| Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit). |
| workspace | string | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Words, any order, case-insensitive. Fewer words find more."
},
"kinds": {
"type": "array",
"items": {
"enum": [
"flow",
"page",
"dataset",
"eval",
"entry",
"board",
"file",
"shim",
"knowledge_base",
"task",
"rubric",
"review",
"spec",
"source",
"doc",
"sheet",
"diagram",
"interface",
"change",
"field",
"study",
"metric",
"folder"
],
"type": "string"
},
"minItems": 1,
"description": "Restrict to these kinds (file, folder, flow, page, doc, dataset, …). Omit to search everything."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1
},
"folderId": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit)."
},
"workspace": {
"type": "string",
"description": "Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys."
}
}
}