ZeroWidth Ledger
Log decisions with expectations, add evidence, and track metrics in Ledger.
Connect it
Settings → Connectors → Add custom connector
URL: https://api.zerowidth.ai/mcp/x/ledgerSettings → Apps & Connectors → Advanced → Developer mode
Create connector with URL: https://api.zerowidth.ai/mcp/x/ledger{
"mcpServers": {
"ledger": {
"url": "https://api.zerowidth.ai/mcp/x/ledger",
"headers": {
"Authorization": "<YOUR_AUTHORIZATION>"
}
}
}
}claude mcp add --transport http ledger https://api.zerowidth.ai/mcp/x/ledger --header "Authorization: <value>"{
"servers": {
"ledger": {
"type": "http",
"url": "https://api.zerowidth.ai/mcp/x/ledger",
"headers": {
"Authorization": "<YOUR_AUTHORIZATION>"
}
}
}
}40 tools, verified live
search_docsread-onlySearch 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, zv1), an API behavior, or a policy. No authentication required â the docs corpus is public.
get_docread-onlyFetch 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.
list_docsread-onlyEnumerate 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.
ledger_entries_listread-onlyThe 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 await
ledger_entries_getread-onlyOne 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.
ledger_entries_createRecords 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` â
ledger_entries_settlecan modifyThe 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`.
ledger_metrics_listread-onlyThe 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.
ledger_metrics_createCreate 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`.
ledger_metrics_record_readingRecord 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 l
ledger_metrics_getread-onlyOne 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 firs
ledger_entries_updatecan modifyCorrects 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.
ledger_entries_retractcan modifyTakes 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.
ledger_entries_add_evidenceRecords 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 conf
ledger_metrics_updatecan modifyCorrects 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 f
ledger_metrics_archivecan modifyTakes 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`.
ledger_plan_listread-onlyPass `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 r
ledger_plan_addAdds 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 dec
ledger_plan_updatecan modifyEdits 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`.
ledger_plan_deletecan modifyRemoves 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`.
ledger_metric_presets_listread-onlyReady-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
ledger_metric_presets_adoptCreates 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. Te
ledger_metric_starters_listread-onlyStarter 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 matche
ledger_metric_starters_adoptCreates 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 (le
ledger_entries_draftWrites 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
ledger_feed_sources_listread-onlyThe 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.
ledger_feeds_listread-onlyThe 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.
ledger_feeds_previewCall 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
ledger_feeds_createFreeze 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`.
ledger_feeds_updatecan modifyChange 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`.
ledger_feeds_runRun 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`.
ledger_feeds_backfillRun 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
ledger_feeds_deletecan modifyRemove 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`.
comments_listread-onlyLists 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.
comments_createPosts 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.
comments_resolvecan modifySets 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.
search_workspaceread-onlyFinds 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 men
entity_tags_getread-onlyReturns 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.
entity_tags_browseread-onlyWithout 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.
entity_tags_setcan modifyReplaces 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.
Alternatives in Finance & Payments
Compare →
PreReasonA
Financial market context for AI agents: macro, rates, bonds, FX, commodities, companies and Bitcoin.
Beancount.ioA
Query, edit, and reconcile a hosted Beancount ledger: BQL, reports, files, and bank imports.
PAPayqrA
European payment QR — SPAYD (CZ/SK) & EPC/GiroCode (SEPA), plus text/WiFi/vCard. Local, free.
ADAdisA
Czech VAT-payer reliability (ADIS / nespolehlivý plátce DPH) + registered bank accounts by DIČ.
CNCnbA
Official ČNB exchange rates — daily & historical CZK vs EUR, USD, 30+ currencies. For accounting.
ISIsirA
Czech insolvency register (ISIR) — active/historical insolvency & bankruptcy by IČO or person.