FinStat
Server Details
Documents in, reconciled double-entry books out. Statements, invoices, receipts, matched and posted.
- Status
- Healthy
- Uptime
- 1.8% over 81 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 59 tools
Most tools target distinct lifecycle stages and distinct resource types, and the descriptions repeatedly clarify boundaries. However, with 59 tools there are several overlapping clusters—workspace status and monitoring tools, book audit/report/compare/invert tools, and multiple guidance/diagnostic tools—that an agent could reasonably confuse.
Names are overwhelmingly snake_case and usually follow an action_resource pattern such as create_standard_chart, list_review_items, or generate_trial_balance. There are noticeable deviations—bare verbs like register and submit, noun-first names like workspace_overview and service_status, and tasks_get—but the convention remains mostly readable.
At 59 tools the surface is far beyond the typical 3-15 well-scoped range and creates substantial selection burden for an agent. The domain is broad and some tools are clearly distinct, but the sheer number of create/list/report/guidance/status operations makes the surface excessively heavy.
The server covers an end-to-end lifecycle: workspace creation, upload/download, statement/book/chart/declaration authoring, registration, submission, posting, reporting, audit/comparison/inversion, snapshots, review, tasks, and support. Minor gaps exist around direct detail/download access for some installed artifacts such as charts and book snapshots, but the core workflows are well covered.
Available Tools
59 toolsaudit_standard_bookAudit Standard BookARead-onlyInspect
Audits one Standard Books document — a set of books: chart, journal, registers, parties and recorded documents — for bookkeeping errors. Supply the book by transfer handle (a sealed book package, a book body, or {book, annotations}), or a small one inline as book. The book is authenticated when sealed and admitted under book law before anything is spent; a book sealed under an older format is refused and must be resealed.
Exact controls are computed in arithmetic with no model: unbalanced entries, entries outside the period, balances opened with nothing stating them or against equity (alone or in a multi-account opening), income debited by purchases, credits beyond the charge. Findings are model judgments over the whole book at once, laid out as a bookkeeper reads it, and each finding quotes the entries and documents it rests on, in ASCII, checked against the book before it is accepted: a purchase posted to income, an opening bill expensed again, a refund or credit that does not match its sale, conflicting dates, entries that need support, and more. Every finding is a question for the bookkeeper with its evidence; certainty says whether it is a confirmed discrepancy, a suspected error or missing information.
Nothing is changed: not the book, not the workspace. The result is a summary with the exact controls inline and the whole report — every finding, citation and question — behind a multi-read download handle; analysed_book_handle names the book with this audit written on it as its analysis, sealed. A book already carrying its own audit, or already audited in this workspace, is answered with no model run; a call for a book whose audit is running attaches to that run, so after a timeout call again with the same book. status is reviewed, needs_information, or incomplete when a request could not be answered (incomplete names which). Findings vary between runs and do not certify that problems are absent. Model-backed and metered; typically three to five minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | A small book inline: a sealed book package, a book body, or {book, annotations}. Exclusive with handle. | |
| handle | No | Workspace-scoped transfer handle (upload:N or download:N) naming the book: a sealed book package, a book body, or {book, annotations}. The usual path; a book is hundreds of kilobytes. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Scopes the call and its metered usage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| book | Yes | Which book was audited: identity, chart_identity, name, reporting_currency and its counts, as verify_standard_document reports them. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| handle | Yes | Multi-read download:N handle naming the whole report: status, controls, findings (kind, certainty, summary, accountIds, entryIds, citations, questions), questions, incomplete and limitations. |
| status | Yes | reviewed (nothing found), needs_information (controls or findings to answer), or incomplete (a request could not be answered). |
| controls | Yes | The exact controls: code, message, question, postings, reports and evidence. |
| retained | Yes | Download descriptor for the report: session_id, handle, file_name, media_type, byte_count, sha256, expires_at, download_program. |
| incomplete | Yes | Requests that could not be answered: scope (the chart accounts) and message. Empty unless status is incomplete. |
| analysed_book | No | Download descriptor for the analysed book. |
| control_count | Yes | Exact arithmetic controls that fired. |
| finding_count | Yes | Findings in the report; one problem reported from several accounts counts once. |
| finding_kinds | Yes | Findings per kind: opening_balance_gap, expense_in_revenue, opening_liability_expense, refund_mismatch, credit_mismatch, date_conflict, missing_support, other_book_issue. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| question_count | Yes | Questions for the bookkeeper across controls and findings. |
| analysed_book_handle | No | Multi-read download:N handle naming the book with this audit written on it as its analysis, sealed: the book again, not a new one (its identity is unchanged). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: nothing is mutated, the call is model-backed and metered, takes three to five minutes, refuses books sealed under an older format, and findings vary between runs so absence of problems is not certified. The no-model-run and attach-to-running-audit semantics are exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, authentication rule and input routes are front-loaded, and the dense sentences each carry real information about determinism, output shape and retry behavior. It is long, and the enumeration of book package forms duplicates the schema description, costing some tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully characterizes the return: a summary with exact controls inline, the full report behind a multi-read download handle, an analysed_book_handle, and the reviewed/needs_information/incomplete status values. Nothing an agent needs to call or interpret this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so handle, book and workspace_tag are already documented, including the upload:N/download:N form and the size rationale. The description mostly restates the accepted book shapes and adds only the resealing constraint, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (audits one Standard Books document) and defines what a book comprises: chart, journal, registers, parties and recorded documents. That scoping distinguishes it from siblings like compare_standard_books, report_standard_book and verify_standard_document without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two input routes (handle as the usual path for large books, inline book for small ones) and gives concrete operational guidance: a book already audited is answered with no model run, a call during a running audit attaches to that run, and timeouts should be retried with the same book. It does not explicitly compare against the closest audit/report siblings, which keeps it below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_data_channelCheck data channelARead-onlyIdempotentInspect
Proves whether this host can execute FinStat's signed HTTPS upload program. Call with workspace_tag and an idempotency_key to start: the result carries a short-lived nonce, an opaque check_id, and a PUT program for the host to execute with that exact nonce. Call again with the check_id to read the verdict; exact replay of the start is safe and returns the same probe.
pending means proof may still arrive; capable means the upload was verified; incapable is declared only after expiry without proof. A transfer-service failure reports data_channel_unavailable, never incapable. The probe is temporary and never admitted. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: short-lived nonce, opaque check_id, the probe never being admitted, not metered, and the crucial rule that a transfer-service failure reports data_channel_unavailable rather than incapable. That last point prevents a serious misread of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the call protocol, then the status/error semantics. Dense but every sentence carries information an agent needs to interpret a verdict correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema covers return shape, and the description supplies the state machine (pending/capable/incapable) plus the error carve-out. Nothing an agent needs in order to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the oneOf branches are structural, but the description adds the semantic role of each mode (start vs. verdict read) and that idempotency_key replays return the same probe. It doesn't explain format bounds (8-128 chars), which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: proving whether the host can execute FinStat's signed HTTPS upload program. The framing as a capability probe (temporary, never admitted) distinguishes it from sibling tools like create_upload_sessions, which do real transfers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit two-mode call contract: start with workspace_tag + idempotency_key, then call again with check_id to read the verdict. It also states that exact replay of the start is safe, so the agent knows how to poll without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_standard_booksCompare Standard BooksARead-onlyIdempotentInspect
Where two Standard Books documents say different things, compared by what they say rather than by their ids, which two systems need not share: for example a book made from an export and the book a workspace holds after its documents were submitted. An entry is its date and what it does to each account (by label, debit and credit; lines to one account summed, in any order), and entries are compared as a set, so order does not matter; accounts by label and kind; parties by name; registers by account, kind and number; documents by kind, reference and date; and the two trial balances per account as of the later book's last day.
Supply each book by transfer handle or inline (first_handle or first_book, second_handle or second_book). status is same_content or different; same_identity says whether they are the very same book. The counts and the trial balance differences are inline; the handle names every differing entry, account, party, register and document. Nothing is changed and no model runs.
| Name | Required | Description | Default |
|---|---|---|---|
| first_book | No | The first book inline. Exclusive with first_handle. | |
| second_book | No | The second book inline. Exclusive with second_handle. | |
| first_handle | No | Transfer handle naming the first book. Exclusive with first_book. | |
| second_handle | No | Transfer handle naming the second book. Exclusive with second_book. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Scopes the call and the handle it returns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| first | Yes | The first book: identity, chart_identity, name and its counts. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| handle | Yes | Multi-read download:N handle naming every difference: per category onlyInFirst and onlyInSecond, and trialBalance. |
| second | Yes | The second book: identity, chart_identity, name and its counts. |
| status | Yes | same_content or different. |
| retained | Yes | Download descriptor for the comparison. |
| same_identity | Yes | Whether the two are the very same book. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| difference_counts | Yes | Per category (entries, accounts, parties, registers, documents): only_in_first and only_in_second. |
| trial_balance_differences | Yes | Accounts whose net differs: account (label), first, second, difference, in minor units, debit positive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, and the description stays consistent while adding real behavioral context beyond them: 'Nothing is changed and no model runs' signals no side effects and no LLM cost, and it discloses the output split between inline counts/trial-balance diffs and a handle enumerating every differing record. It stops short of noting limits such as book size or performance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and no sentence is pure filler, but the middle is a single long semicolon-chained sentence enumerating matching keys for entries, accounts, parties, registers, documents and trial balances, which is hard to parse. That rule set is genuinely needed, yet it would read far better as a list, and some detail could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity comparison tool with nested object inputs, five parameters and an output schema, the description covers input modes, grouping/matching semantics, order-insensitivity, and the shape of the return (inline counts plus a handle). With annotations carrying the safety profile and the output schema carrying return-value detail, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the handle/inline exclusivity pairs and workspace_tag scoping are already documented in structured fields. The description restates the handle-or-inline choice in prose but adds no syntax, format, or constraint details beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('compare two Standard Books documents') and pins the comparison basis precisely: semantic content rather than shared ids. The 'same_identity' vs 'same_content' framing makes the tool's role distinctive among siblings like report_standard_book or invert_standard_book, though no sibling is named directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the selection between the two input modes ('Supply each book by transfer handle or inline (first_handle or first_book, second_handle or second_book)') and gives a concrete motivating case (an export versus a workspace book after submission). It does not state when to prefer this over alternative reporting/inspection tools, so no exclusions are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_book_snapshotCreate book snapshotAInspect
Seals one set of books as it stands through a date and keeps it, never changed: official results, such as a quarter close. The snapshot is the workspace's book for chart_id (as create_standard_book reads it): its chart and every current entry dated on or before as_of (every current entry when as_of is absent), sealed by this server. Corrections made later to that period are not in it; take another snapshot to capture them. Each call adds a snapshot; none is ever altered or removed. Open one with create_view_link and its snapshot_id; list them with list_book_snapshots. Durable mutation; no model and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | YYYY-MM-DD: the last day the snapshot covers, e.g. a quarter's end. Every current entry when absent. | |
| label | Yes | What the snapshot is, as people will know it, e.g. "Q2 2026 close". At most 200 characters. | |
| chart_id | Yes | The chart whose books to seal (list_charts). | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| book | Yes | Which book was sealed: identity, chart_identity, name, reporting_currency and its counts, as verify_standard_document reports them. |
| as_of | No | The last day it covers; null for every current entry. |
| label | Yes | The snapshot's label. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | book_snapshot_created on success. |
| chart_id | Yes | The chart sealed. |
| created_at | Yes | When it was sealed. |
| snapshot_id | Yes | The snapshot: create_view_link takes it. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the key behaviors: each call appends a new snapshot, none is ever altered or removed, and the sealed content is frozen at as_of. It also clarifies operational traits (durable mutation, no model, not metered) that the annotations cannot express, and its 'nothing destroyed' framing is consistent with destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition before the mechanics and every sentence carries information. There is mild redundancy between 'keeps it, never changed' and 'none is ever altered or removed', and the trailing 'Durable mutation; no model and not metered' is terse to the point of being cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with an output schema, the description covers the mutation semantics, immutability guarantee, cutoff behavior, and downstream retrieval path. Return values are covered by the output schema, so nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-field descriptions already carry the basics; the description adds the interaction between chart_id and as_of (the chart whose books are sealed, cut off at as_of) and the default when as_of is absent. It does not add format or edge-case detail beyond that, so it sits just above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (seals) and resource (a set of books through a date) with concrete scope: chart plus every current entry dated on or before as_of. It explicitly distinguishes itself from create_view_link (read/open) and list_book_snapshots (list), so the agent can place it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the trigger scenario (quarter close / official results), the exclusion (later corrections are not captured; take another snapshot), and the follow-up alternatives by name (create_view_link with snapshot_id, list_book_snapshots). Nothing is left to inference about when this is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_download_sessionsCreate download sessionsARead-onlyIdempotentInspect
Creates single-use, expiring download programs for one or more authorized immutable artifacts. Each item names exactly one subject - a retained handle, an admitted source_document_id, or an admitted chart_id or declaration_id (the exact sealed Standard Chart or Standard Declaration bytes that admission opened) - and the result carries a signed GET program per item. Exact replay of the required idempotency_key returns the same sessions and programs; bytes are never returned inline.
Verify every download against the returned SHA-256. A failed or consumed GET needs a new session - mint again rather than retrying the signed URL; reminting never mutates the artifact. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| workspace_tag | Yes | ||
| idempotency_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing single-use semantics, expiry, that 'bytes are never returned inline,' that exact idempotency_key replay returns identical sessions, and that 'reminting never mutates the artifact' - resolving the apparent tension between 'Creates' and readOnlyHint=true. It also states the tool is 'Not metered,' which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and result, then a second paragraph of operational cautions. Dense but every sentence carries information; the nested parenthetical defining chart_id/declaration_id is the only slightly heavy passage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't document the returned programs or hashes. Given that, it covers purpose, lifecycle (single-use, expiring), idempotent replay, integrity verification, and non-mutation - the main gaps are the undocumented workspace_tag and expires_in_seconds semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to compensate. It explains the items subjects well ('a retained handle, an admitted source_document_id, or an admitted chart_id or declaration_id') and the idempotency_key replay contract, but workspace_tag, client_item_id, and expires_in_seconds (default 3600, max 86400) are never mentioned anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Creates single-use, expiring download programs for one or more authorized immutable artifacts,' with a signed GET program per item. It doesn't explicitly name the sibling it differs from (create_view_link / create_upload_sessions), so an agent must infer the download-vs-upload-vs-view distinction from 'signed GET program' alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: 'Verify every download against the returned SHA-256' and 'A failed or consumed GET needs a new session - mint again rather than retrying the signed URL.' It also warns not to retry signed URLs, which prevents a common failure mode. It stops short of naming alternative tools for cases where a persistent or non-force-download link is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_standard_bookCreate Standard BookARead-onlyInspect
Makes one Standard Books document — a whole set of books: chart, journal, registers, parties and recorded documents — from one of two sources, and returns it sealed.
From a QuickBooks Online export: supply export_handle, the transfer handle of the export zip (add any report files exported beside it inside the zip; a bare workbook or CSV is refused), and currency, which an export never states. The book is built from the export's journal in code; judgment writes each account's description and instructions from the entries that post to it, and kinds any account nothing in the export places. No judgment sets or changes an amount, a date, an account or a link. The book is then proved against the export's own tables and reports: the result carries the export's trial balance and general ledger beside the book's, and every difference and question as an error with its evidence. Model-backed and metered; typically under a minute.
From a workspace chart: supply chart_id, and the book is the one this workspace holds for that chart — its chart, parties, registers and every posted entry — read from the workspace. No model.
The sealed book is behind a multi-read download handle; hand it to audit_standard_book, or keep it. For an export, report_handle names the rest: trial balances, general ledgers, errors, the account review and the proof against the export.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | No | A chart this workspace holds (list_charts); the book is the workspace's for that chart. Exclusive with export_handle. | |
| currency | No | ISO 4217 code the export is kept in, e.g. USD. Required with export_handle: an export never states it. | |
| export_handle | No | Workspace-scoped transfer handle (upload:N) naming a QuickBooks Online export zip. Add any report files exported beside it (deposit detail, invoice list, aging) inside the zip. Exclusive with chart_id. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Scopes the call and its metered usage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| book | Yes | Which book was made: identity, chart_identity, name, reporting_currency and its counts, as verify_standard_document reports them. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| handle | Yes | Multi-read download:N handle naming the sealed book package. |
| report | No | Download descriptor for the conversion report (qbo_export). |
| source | Yes | qbo_export or workspace_chart. |
| status | Yes | book_created (from a workspace chart); for an export, reviewed, needs_information (errors or questions to answer) or unproved (the book differs from the export in a way it does not account for). |
| chart_id | No | The chart the book was read for (workspace_chart). |
| retained | Yes | Download descriptor for the sealed book: session_id, handle, file_name, media_type, byte_count, sha256, expires_at, download_program. |
| error_codes | No | Errors per code (qbo_export). |
| error_count | No | Errors and questions the book raises without a model (qbo_export). |
| report_handle | No | Multi-read download:N handle naming the conversion report: status, reports (export and book trial balance and general ledger, and their differences), errors, chartAnalysis, chartImprovements, roundTrip (qbo_export). |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| round_trip_proved | No | Whether the book reproduces the export's tables and reports (qbo_export). |
| trial_balance_differences | No | Accounts where the export's trial balance and the book's differ (qbo_export). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the export path is model-backed and metered, typically under a minute, judgment only writes account descriptions/instructions and kinds unplaced accounts, and never sets amounts, dates, accounts or links. It also discloses the self-proving step (book proved against the export's own tables, differences surfaced as errors with evidence) and that the result sits behind a multi-read download handle. The only residual tension is that a 'makes a document' tool carries readOnlyHint=true; the description frames it as derived output rather than mutation of existing records, so this reads as generation rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome and the two source modes, then details per mode — a sensible structure. It is long (four dense paragraphs) and repeats some schema facts such as currency being required with export_handle, but nearly every sentence carries decision-relevant information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metered, model-backed generation tool with an output schema, the description covers what an agent needs: which source to supply, what gets refused, what the model does and does not decide, latency, and what the sealed result contains. Return-value detail is a bonus rather than a necessity given the output schema, and the pointer to report_handle closes the loop on follow-up retrieval.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: currency is required because 'an export never states it', report files must be added inside the zip, and the two source parameters are exclusive. These restate and reinforce the schema rather than introduce new syntax, so it lands just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Makes one Standard Books document') and immediately defines the artifact as a whole set of books — chart, journal, registers, parties, recorded documents — which separates it from create_standard_chart and create_standard_statements. It also names the two mutually exclusive sources up front, so the agent knows exactly what the tool produces before reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly branches on source: export_handle for a QuickBooks Online export (with the requirement that report files go inside the zip and that a bare workbook or CSV is refused) versus chart_id for a workspace-held chart. It also routes the output onward — 'hand it to audit_standard_book, or keep it' — giving the agent the natural next step and the alternative consumer of the result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_standard_chartCreate Standard ChartARead-onlyInspect
Seals one Standard Chart from canonical chart JSON, exactly as written and with no model: the chart_of_accounts object (guide_canonical_schema, species chart) as document, or a retained UTF-8 handle holding it. CSV, notes and Markdown are not accepted; write the chart JSON first. What is not a fact is fixed up and listed in normalized: a field name in another case or with underscores, a code given as a number, an enum value in another case, the document marker, an envelope version. A fact is never fixed up: an unknown field, a missing required field, or a chart that breaks a chart law is refused with a stable code, the JSON path, what is wrong and what is needed.
Nothing installs and no party is minted. The result carries the sealed chart inline, retains the exact sealed bytes behind a multi-read download handle, and reports compatible and exceptions against the workspace data. Review it, then register the handle. A claim binds an account a submitted register statement is about; one that binds nothing yet shows as claim_unbound when registered: submit the statements, then post_chart_accounts installs and checks the chart, and if exceptions remain, update_standard_chart proposes the repair to register and post. Journal entries post to accounts (role account in list_chart_accounts), never to a category. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | Workspace-scoped transfer handle naming UTF-8 bytes of that same canonical chart JSON. Exclusive with document. | |
| document | No | The canonical chart_of_accounts JSON object (guide_canonical_schema, species chart), sealed exactly as written. Exclusive with handle. | |
| source_name | No | Optional label for where the chart came from, such as books.chart.json. Defaults to user.chart.json. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| chart | Yes | Sealed standard chart_of_accounts JSON document. This is the reusable artifact. |
| owner | No | Read-only preview of the FIRST owner: name and type, plus party_id/display when a live party already answers that mention, and on_submit reuse|found. Submit founds; this call does not. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| handle | No | Multi-read download:N handle naming the retained sealed chart bytes — save them locally and pass to verify, open, or submit. |
| owners | Yes | Whose books: the chart's owner set, each a party mention (name, type) resolved at submit. |
| status | Yes | chart_created on success. |
| retained | No | Download descriptor for the retained sealed bytes: session_id, handle, file_name, media_type, byte_count, sha256, expires_at, download_program. |
| file_name | Yes | Suggested <entity>.chart.json file name. |
| resources | No | Related workspace resource links. |
| chart_name | Yes | Name asserted by the chart document. |
| llm_called | Yes | Always false: the chart is sealed exactly as given, with no model. |
| normalized | No | What was fixed up on the way, when anything was: each with path and change (a field renamed, a code written as a string, an enum value recased, the document marker added, an envelope version removed). Facts are never fixed up. |
| owner_match | Yes | Which account owner sets these books accept: any | all | exact | subset. |
| source_name | Yes | Source label used for authoring context. |
| content_hash | Yes | Canonical SHA-256 identity of the chart document. |
| workspace_tag | Yes | Workspace that scopes authoring and metered usage. |
| accounting_basis | Yes | cash or accrual. |
| preview_markdown | Yes | Human-readable rendering only; never validate, submit, or install this field. |
| chart_account_count | Yes | Number of chart-account definitions. |
| postable_chart_account_count | Yes | Number of non-summary chart accounts. |
| claimed_workspace_account_identifiers | Yes | Workspace-account designators claimed by chart accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the side-effect profile ("Nothing installs and no party is minted"), the normalization list of auto-fixed non-facts, the refusal contract with stable codes plus JSON path and remedy, the multi-read download handle, and "Not metered". One caveat: sealing and retaining bytes is a state-producing behavior alongside readOnlyHint=true, though "nothing installs" keeps it from being a true contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, but the body is a dense run-on block that chains normalization cases, refusal semantics, workflow, and claim semantics into long comma-spliced clauses. Most content earns its place, yet readability and scanability suffer noticeably.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested oneOf input and an output schema, this covers the missing pieces: input format restrictions, normalization versus refusal boundary, handle lifecycle, and the follow-on workflow. The remaining gap is that it explains return contents the output schema already provides, while never naming the nearest structural siblings for disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds meaning the schema does not: the document must be a canonical chart_of_accounts per guide_canonical_schema, and the normalization rules (codes as numbers, enum case, underscore field names) tell the caller the document may be loosely formatted rather than strictly. source_name is left undocumented but is optional and self-describing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: sealing one Standard Chart from canonical chart JSON, sealed exactly as written. It also carves out a boundary against siblings by stating "Nothing installs and no party is minted", which separates it from post_chart_accounts and update_standard_chart. The jargon-dense phrasing ("species chart", "retained UTF-8 handle") costs some immediate clarity, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit input constraints ("CSV, notes and Markdown are not accepted; write the chart JSON first") and an explicit next-step sequence: review the result, register the handle, then post_chart_accounts installs and checks, and update_standard_chart repairs residual exceptions. What it lacks is a direct comparison against create_standard_book or create_standard_declaration_chart, which are plausible confusable siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_standard_declaration_chartCreate chart-scoped Standard DeclarationARead-onlyInspect
Authors one sealed declaration whose meaning belongs to exactly one chart, selected by chart_id. Choose journal_entry, journal_entry_void, or retirement, and state the accountable assertion in ordinary language — account codes are not needed, because the chart's accounts are supplied to the model. The result is validated with the exact parser register uses: dates, balance, references, attribution, chart account codes, and that the document's "chart" is this chart's name (chart_mismatch otherwise).
When the description is genuinely ambiguous the result is clarification_needed with one specific question — answer it and call again. Nothing changes the books; review the returned document and register it when ready. A journal entry, a void or a retirement changes the books only when post_chart_accounts posts its chart. Lines post to accounts (role account in list_chart_accounts), never to a category. Model-backed and metered.
| Name | Required | Description | Default |
|---|---|---|---|
| author | No | Accountable author of the declaration. | |
| chart_id | Yes | The one chart this declaration belongs to. Required so duplicate chart names cannot be selected by label. | |
| document | No | The document arm: a complete declaration JSON document of the named kind (what get_declaration or open_standard_document returns, or a reviewed hand-authored body) to validate against this chart and seal exactly as given. Its "chart" must be this chart's name, not its chart_id (chart_mismatch). No model call; llm_called is false. Exclusive with description. | |
| approved_by | No | Optional approver. | |
| declaration | Yes | Which kind to write. | |
| description | No | The accountable assertion in ordinary language. Account codes are not needed — the chart's accounts are supplied to the model. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | declaration_created, or clarification_needed when the request was ambiguous and the model asked instead of guessing. |
| file_name | No | Suggested file name for keeping the document durably. Absent on clarification_needed. |
| llm_called | No | True when a model authored it (one metered pass); false when the document arm sealed the caller's own document. |
| declaration | No | The declaration document to review, keep, and submit. Absent on clarification_needed. |
| next_action | Yes | How to admit the document, or how to resolve the clarification. |
| content_hash | No | Canonical content hash — the declaration's durable identity. Absent on clarification_needed. |
| clarification | No | The one specific question blocking authorship. Present only on clarification_needed; answer it and call again. |
| declaration_kind | Yes | The kind that was written (or asked about). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=true and the description reconciles that precisely: authoring/sealing does not change the books, only post_chart_accounts does. It adds the validation contract (the exact parser register uses, including chart_mismatch on the document's 'chart' name), the clarification_needed recovery loop, and the cost signal 'model-backed and metered'. That is substantial behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb, scope, and kind choices before the validation and clarification details. It is fairly dense and has some redundancy with the schema's own property text, but each paragraph carries a distinct idea (what it does, how it validates, what happens when ambiguous, what state changes) rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, nested-schema tool with an output schema, the description covers what an agent needs before calling: scope, kind selection, the two mutually exclusive input arms, validation failure modes, the ambiguity recovery path, and the fact that no books move. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the property descriptions already carry 'account codes are not needed', the description/document exclusivity, the chart-name-not-chart_id rule, and the model-call distinction. The description restates these, which is useful corroboration but adds little meaning beyond the schema; the only genuine addition is tying validation to register's parser, which is not per-parameter semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Authors one sealed declaration' — and pins its scope ('whose meaning belongs to exactly one chart, selected by chart_id'), which is exactly what separates it from create_standard_declaration_workspace. It also enumerates the three declaration kinds, so an agent knows both what it makes and which variants exist without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context: choose one of three declaration kinds, supply ordinary-language description, then review and register the result. It also explains the handoff — nothing changes the books until post_chart_accounts posts the chart — which routes the agent to the posting tool for the actual write. It never explicitly contrasts the two arms (description vs document) as a usage decision, or names the workspace-scoped sibling, which keeps it off a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_standard_declaration_workspaceCreate workspace-scoped Standard DeclarationARead-onlyInspect
Authors one sealed declaration that is true in shared workspace reality and names no chart. Choose account_identity, parties, party_profiles, workspace_correction, or source_assessment and state the accountable assertion in ordinary language. One account_identity identifies one account; one parties declaration may assert a set of parties with aliases — canonical partyType values are individual, business, trust, nonprofit, government, or unknown. Parties support name, partyType and aliases only: email, addresses belong in a separate party_profiles declaration. Profile declarations preserve contacts, addresses and scoped roles without changing who a party is or posting money. source_assessment records non-posting discrepancies or acknowledgments; prefer its exact document arm with the original finding and a reason. The document arm performs no model call and seals the validated document without rewriting it. The result is validated with the exact parser register uses.
When the description is genuinely ambiguous the result is clarification_needed with one specific question — answer it and call again. Nothing changes the books; review the returned document and register it when ready as an inline item, then submit it (this door returns the sealed document by value; create_standard_chart returns a handle). Advisory filename .declaration.json. Model-backed and metered.
| Name | Required | Description | Default |
|---|---|---|---|
| author | No | Accountable author of the declaration. Defaults to 'user'. | |
| document | No | The document arm: a complete declaration JSON document of the named kind (what get_declaration or open_standard_document returns, or a reviewed hand-authored body) to validate and seal exactly as given. No model call; llm_called is false. Exclusive with description. | |
| approved_by | No | Optional approver; defaults to the author. | |
| declaration | Yes | Which kind to write. | |
| description | No | What the declaration should say, in your own words. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | declaration_created, or clarification_needed when the request was ambiguous and the model asked instead of guessing. |
| file_name | No | Suggested file name for keeping the document durably. Absent on clarification_needed. |
| llm_called | No | True when a model authored it (one metered pass); false when the document arm sealed the caller's own document. |
| declaration | No | The declaration document to review, keep, and submit. Absent on clarification_needed. |
| next_action | Yes | How to admit the document, or how to resolve the clarification. |
| content_hash | No | Canonical content hash — the declaration's durable identity. Absent on clarification_needed. |
| clarification | No | The one specific question blocking authorship. Present only on clarification_needed; answer it and call again. |
| declaration_kind | Yes | The kind that was written (or asked about). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations, it discloses cost/model behavior ('Model-backed and metered', the document arm performs 'no model call' with llm_called false), the failure mode for ambiguity (returns clarification_needed with one specific question and can be re-called), and lifecycle ('Nothing changes the books... returns the sealed document by value'). This reconciles the apparently contradictory create/readOnly combination: nothing persists until register/submit. Minor gap: it doesn't say what authorization or workspace state is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the enum choice are front-loaded, which is correct, but the prose is padded with ornamental phrasing ('true in shared workspace reality', 'accountable assertion') that costs tokens without adding precision. Some sentences are load-bearing (document arm, clarification_needed, metering), but the paragraph is denser than a 6-parameter tool with full schema coverage requires.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and the description still covers the hard parts: the two authoring arms and their exclusivity, the ambiguity/retry path, metering, the advisory filename, and the downstream register/submit step. What's left implicit is the relationship to sibling declaration tools and any preconditions on workspace_tag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: the canonical partyType value set (individual, business, trust, nonprofit, government, unknown), the constraint that parties carry only name/partyType/aliases, that one account_identity identifies one account, and that one parties declaration may assert a set with aliases. The mutual exclusivity of description vs document is reinforced in prose as well as schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource — 'Authors one sealed declaration' — scoped to a workspace, and explicitly contrasts the return shape with create_standard_chart ('this door returns the sealed document by value; create_standard_chart returns a handle'). The phrase 'true in shared workspace reality and names no chart' is opaque jargon, but the follow-up enumeration of the five declaration kinds makes the actual purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent which of the five declaration kinds to select and gives routing rules for the tricky cases: contacts and addresses must go in party_profiles rather than parties, and source_assessment should prefer 'its exact document arm with the original finding and a reason.' It also states the follow-on workflow (review, register, submit). It never states when NOT to use this tool versus create_standard_declaration_chart or open_standard_document, so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_standard_statementsCreate Standard StatementsARead-onlyIdempotentInspect
Retain one exact financial source and create its complete ordered set of Standard Statements as one durable FinStat Task. Supply exactly one byte-bearing source: an authorized handle or bounded content_base64; file_name and mime_type may name it either way (a handle otherwise carries its own). The transfer program is the reliable intake: create_upload_sessions, PUT the bytes, pass the returned handle. Inline content_base64 is for small sources only — many MCP clients cap tool arguments in the tens of KB regardless of this schema's bound; if an inline call fails to leave your client, switch to the transfer program rather than shrinking the source. For a statement your agent builds (from a CSV or bank export, say), pass it as statement; the shape is this parameter's schema and guide_canonical_schema. For example: {"type": "checking", "account": {"institution": {"name": "River Bank"}, "number": "1001", "currency": "USD"}, "period": {"start": "2025-01-01", "end": "2025-01-31"}, "controls": {"beginningCents": 200000, "endingCents": 350000}, "transactions": [{"date": "2025-01-15", "description": "PAYROLL", "amountCents": 150000}]}. PDF is the normal case; canonical statement JSON bytes are accepted (exact-byte, no model), as one bare statement or several in the optional {accounts: [{statement}], sourceLabel} envelope: guide_canonical_schema gives the shape, each type's required controls and an example, and with topic csv how to build one from a CSV or bank export. What is not a fact is fixed up and listed in the result's normalized; a missing balance or rows that do not add up are refused, saying what to fix. One source may yield several Standard Statements. Persist taskId. Native clients poll tasks/get; ordinary clients poll tasks_get. Completion returns fresh expiring handles. The source bytes remain unchanged and are not returned. Exact-byte replay recovers the existing creation without another interpretation charge. Register the returned Standard Statements; nothing reaches the workspace until submit. Metered only when new interpretation runs.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | A transfer handle naming the source bytes: the upload session's handle after the PUT, or a handle another tool returned. | |
| file_name | No | The source's file name, e.g. statement.pdf or march.json; .json reads it as canonical statement JSON. | |
| mime_type | No | The source's media type, e.g. application/pdf or application/json. | |
| statement | No | A statement your agent built (from a CSV or bank export, say), as an object: the canonical statement, exactly the shape guide_canonical_schema returns. Exclusive with handle and content_base64; read like canonical JSON bytes, fix-ups and refusals alike. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| content_base64 | No | The source bytes inline, base64, for small files: a PDF, or canonical statement JSON (guide_canonical_schema). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says this tool retains a source, creates a durable FinStat Task, registers returned Standard Statements, persists taskId, and is metered when new interpretation runs. Those are side-effectful creation behaviors, but the annotations declare readOnlyHint=true and idempotentHint=true. The description therefore contradicts the read-only annotation and fails behavioral transparency despite otherwise rich operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and follows a logical sequence from source selection to task handling and errors. It is dense and appropriate for a complex tool, though some operational details are repeated and the example adds length. It remains readable and mostly earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested schema, output schema, and complex task semantics, the description is complete enough for an agent to call the tool correctly. It covers source exclusivity, transfer-program flow, inline limits, statement shape, normalization and refusal behavior, task polling, expiring handles, exact-byte replay, and metering. Nothing essential about invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all six parameters in detail. The description still adds meaningful constraints beyond the schema: exactly one byte-bearing source must be supplied, file_name and mime_type may name it either way, and inline content_base64 is practically limited by MCP client argument caps. It also points to guide_canonical_schema for agent-built statement JSON.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retaining one exact financial source and creating its complete ordered set of Standard Statements as a durable FinStat Task. It also distinguishes the statement-creation role from helper flows like create_upload_sessions and submit. An agent can tell what this tool produces without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear source-path guidance: use the transfer program as the reliable intake, use inline content_base64 only for small sources, and switch to transfer rather than shrinking the source if an inline call fails. It also says to pass agent-built statements via the statement parameter. However, it does not explicitly compare this tool against sibling creation tools such as create_standard_book or create_standard_chart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_sessionsCreate upload sessionsARead-onlyIdempotentInspect
Creates bounded, expiring upload programs for one or more files the host holds — one item per file. The result carries a signed PUT program per item. Exact replay of the required idempotency_key returns the same sessions and programs; reuse with changed inputs is idempotency_conflict.
After the PUT, FinStat checks the declared size and optional SHA-256 and retains the exact bytes behind the handle, never inspecting or interpreting them. Uploading admits nothing and authors nothing — the handle feeds create_standard_statements or create_standard_book. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| workspace_tag | Yes | ||
| idempotency_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description carries genuinely valuable behavior the annotations do not: exact replay of the idempotency_key returns identical sessions, changed inputs yield idempotency_conflict, size and optional SHA-256 are verified after PUT, bytes are retained unexamined, and the call is not metered. However, it opens with "Creates ... upload programs" while annotations declare readOnlyHint=true and destructiveHint=false — a mismatch an agent may act on when deciding whether a retry is safe. The "uploading admits nothing and authors nothing" clause partly reconciles this, but the verb/annotation tension should not be silently passed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the result shape ("signed PUT program per item"), then the idempotency contract, then the downstream consumer. Dense but every sentence adds distinct information; the only soft spot is that the read-only framing is buried mid-paragraph rather than stated up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still usefully characterizes the return (a signed PUT program per item), and it covers expiry bounds, post-upload validation, and the downstream handoff. Gaps remain on authorization/workspace_tag semantics and on the read-only claim, which matter for a creation-style tool with a 50-item batch limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it only partly does: it explains items as one-per-file, idempotency_key semantics (replay vs. idempotency_conflict), declared size / SHA-256 (max_bytes, sha256), and expiry (expires_in_seconds). It says nothing about workspace_tag, client_item_id, file_name, or media_type, leaving half the parameters undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: "Creates bounded, expiring upload programs for one or more files the host holds — one item per file." It also positions the result relative to sibling tools ("the handle feeds create_standard_statements or create_standard_book"), so an agent can distinguish this from the download-session and statement-authoring siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage flow explicit: this tool produces a handle that is then consumed by create_standard_statements or create_standard_book, and it notes the operation is "not metered." It stops short of naming exclusions or the sibling it replaces (e.g., create_download_sessions for the reverse direction), so there is clear context but no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_view_linkCreate view linkARead-onlyIdempotentInspect
Gives the user a link to see this workspace in the FinStat console's viewer: the whole workspace (workspace_tag alone), one set of books (chart_id, from list_charts), or a book snapshot (snapshot_id, from list_book_snapshots). The viewer shows the workspace as it is and follows changes as they land; a snapshot shows its sealed book, which never changes. Hand the url to the user to open. It carries no credential: it opens only for this workspace's owner, signed in to the console, and gives nobody else access. Writes nothing. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | No | A chart this workspace holds (list_charts): the link opens those books. Exclusive with snapshot_id. | |
| snapshot_id | No | A book snapshot of this workspace (list_book_snapshots): the link opens the snapshot. Exclusive with chart_id. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Alone, the link opens the whole workspace. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The console link to open. |
| opens | Yes | What the user will see. |
| access | Yes | Who it opens for. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | view_link_created on success. |
| target | Yes | What it opens: kind (workspace, book or snapshot), with chart_id or snapshot_id. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description goes further with the access model (no credential, opens only for the workspace owner signed in to the console, grants nobody else access) and the live-vs-sealed distinction between workspace and snapshot views. 'Not metered' is extra operational context beyond the annotations; the 'Writes nothing. Read-only' clause is redundant repetition of readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the modes, then the security caveat, then the safety tail. Dense but every clause carries information; the only waste is the 'Writes nothing. Read-only and not metered' tail, where the first half restates the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape need not be explained, and the description still tells the agent the payload is a URL to hand to the user. For a three-parameter, read-only link generator the coverage of modes, provenance, and access semantics is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains the mutual exclusivity as a mode choice and clarifies that passing workspace_tag alone yields the whole-workspace view. It also documents where each id comes from, reinforcing the schema's provenance hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Gives the user a link to see this workspace') and immediately enumerates the three scopes the link can take. It names the sibling tools that supply the ids (list_charts, list_book_snapshots), so an agent can place it precisely among the many create_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent which parameter combination selects which view (workspace_tag alone vs chart_id vs snapshot_id) and what to do with the result ('Hand the url to the user to open'). It does not spell out a when-not-to-use case, but the mode-selection guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workspaceCreate workspaceAIdempotentInspect
Creates the workspace that scopes admitted documents, shared reality, optional charts, review work, and reports. The authenticated caller becomes its owner, and metered work in it bills that owner. Creation asserts no accounting entity and admits nothing — a workspace with statements and no chart is a complete outcome.
Idempotent by owner plus exact active name: a retry returns the existing workspace as workspace_reused. Persist workspace_tag — the name is not a unique id. Next: gather source documents, create_standard_statements, then register, submit and post. Durable mutation; not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workspace display name. Exact active name is the idempotency key for this principal. | |
| actor | No | Optional audit display for this call. It is not the owner and not an accounting party. | |
| description | No | Optional display prose. Stored and echoed when supplied. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Workspace name. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_created or workspace_reused. |
| created_at | Yes | Workspace creation time (ISO-8601). |
| description | No | Optional display prose, present only when stored. |
| next_actions | No | Callable next steps. |
| workspace_tag | Yes | Workspace tag. Persist this; the name is not a unique id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: ownership transfer to the caller, billing attribution for metered work, the exact idempotency key (owner plus exact active name) with the workspace_reused return on retry, and the warning that workspace_tag must be persisted because the name is not a unique id. It also flags durability and that creation itself is unmetered, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then idempotency, then next steps — a sensible ordering with no filler sentences. It is dense with domain jargon ('shared reality', 'admitted documents') that costs some readability but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers ownership, billing, idempotency, the returned reuse signal, and the required follow-up sequence; an output schema exists so return-shape detail is unnecessary. An agent has everything needed to call this correctly and know what to do next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic weight: it explains that name is the idempotency key for the principal, that actor is audit display only and is neither owner nor accounting party, and that description is stored and echoed. That reinforces and extends the schema's own notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and immediately scopes what the workspace contains (documents, charts, review work, reports). It also distinguishes itself from adjacent creation tools by declaring that creation asserts no accounting entity and admits nothing, which separates it from create_standard_declaration_workspace and create_standard_book.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit downstream sequencing ('Next: gather source documents, create_standard_statements, then register, submit and post') and a retry rule. It does not explicitly name sibling alternatives such as list_workspaces or workspace_overview for read paths, so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
demoDemoARead-onlyIdempotentInspect
Returns the demonstration playbook: a prompt instructing the agent to author a small synthetic bank statement itself, run it through the real pipeline in a scratch workspace — create, register, submit — and present what FinStat derives to the user. FinStat invents no evidence; the agent does, visibly. The calls the playbook makes are ordinary metered work inside the account's allowance. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| prompt | Yes | The demonstration playbook for the agent to follow. |
| status | Yes | demo_ready. |
| next_action | No | Follow the prompt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real context beyond the annotations: it says the playbook drives downstream create/register/submit calls that are ordinary metered work drawn from the account's allowance, and it stresses that FinStat invents no evidence. However, 'Read-only and not metered' restates readOnlyHint and adds little, and it omits what happens to the scratch workspace afterward (cleanup, persistence, cost visibility).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key fact — that this returns a prompt, not results — is front-loaded in the first clause, and the four sentences stay free of repetition. The 'FinStat invents no evidence; the agent does, visibly' line is somewhat rhetorical, but it carries real meaning about trust and provenance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema is present and rich annotations apply, so the description does not need to explain return fields; it still conveys the pipeline shape, the metering consequence, and the demonstration's purpose. The remaining gap — the scratch workspace's lifecycle and how the agent should present results — is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters, there is nothing for the description to disambiguate, so the baseline is 4; however, the description spends words on the downstream pipeline instead of the one thing an agent needs from a zero-arg tool — that it takes no input and returns a prompt rather than running the demo itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: it returns the demonstration playbook, and it spells out what that playbook instructs the agent to do (author a small synthetic bank statement, run it through the real pipeline in a scratch workspace: create, register, submit). That specificity separates it from generic guide tools, but it never names the nearby siblings (examples, get_started, guide_tasks) that an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intent — demonstrate FinStat without FinStat fabricating data — is implied clearly enough that an agent can infer when this tool is appropriate. However, there is no explicit 'use this instead of X' statement, no exclusion, and no guidance on when to reach for examples or guide_tasks instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
examplesExamplesARead-onlyIdempotentInspect
Serves curated example bundles — each a small zip whose README is the runbook: unpack it beside your work, create a workspace, and follow the README with the ordinary public tools. Call with no arguments for the catalog (keys, sizes, hashes). Fetch one with example_key; delivery url returns a stable public link and base64 returns the zip inline for small bundles. All content is synthetic. Nothing here admits anything or touches a workspace. Read-only and not metered.
FinStat reads bank, card, wallet, line of credit, loan and brokerage statements; invoices, bills, credit and debit notes; receipts, settlements and payroll. Before creating, check a file's first page: a trial balance, ledger report or tax form is not a statement; tell the user what it is. A QuickBooks Online export zip goes to create_standard_book, a chart of accounts to create_standard_chart.
| Name | Required | Description | Default |
|---|---|---|---|
| delivery | No | url (default when available): a stable public zip link. base64: the zip inline, small bundles only. | |
| example_key | No | Bundle to fetch (see the no-argument catalog). Omit for the catalog. |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | No | Zip file name (fetch only). |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| sha256 | No | Zip content hash — verify after download (fetch only). |
| status | Yes | examples_catalog or example_ready. |
| zip_url | No | Stable public URL (delivery url). |
| examples | No | Catalog rows: example_key, version, title, summary, byte_count, sha256, deliveries. |
| byte_count | No | Zip size in bytes (fetch delivery only). |
| example_key | No | The fetched bundle (fetch only). |
| next_action | No | What to do with the result. |
| content_base64 | No | The zip inline (delivery base64). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/closed-world, and the description adds genuinely new facts beyond them: content is synthetic, it does not admit anything or touch a workspace, and it is not metered. Delivery behavior (stable link vs inline zip, small bundles only) is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first paragraph is tight and front-loaded. The second paragraph, however, is about FinStat's document classification and routing to create_standard_book/create_standard_chart — useful context for the platform but not for invoking this tool, and it dilutes an otherwise clean two-parameter definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the definition still covers the catalog-vs-fetch mode split, both delivery modes, and the nature of the content, so an agent can call it correctly on the first try. The trailing classification/routing material is out of scope for this tool and adds noise rather than needed context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum description for delivery already states 'url (default when available)... base64: the zip inline, small bundles only.' The description largely restates this, adding only the coupling of example_key omission to catalog mode, which the schema also documents. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Serves curated example bundles — each a small zip whose README is the runbook.' It also distinguishes itself from plausible siblings by defining the bundle as a runbook to follow with 'the ordinary public tools,' which separates it from demo/get_started/create_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit operational guidance: no arguments returns the catalog, example_key fetches one, then unpack → create workspace → follow README. That is a clear when/how-to-use path. It stops short of stating when NOT to use it (e.g., vs. demo or get_started), so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_standard_statementExport Standard StatementARead-onlyInspect
Converts one authenticated Standard Statement into one interchange file. Provide an authorized transfer handle and the closed format: qbo (one QuickBooks Web Connect file), ofx (one generic OFX file), or csv — and when format is csv, also target from the closed column contract quickbooks, xero, sage, or finstat. OFX/QBO support checking, savings, and credit-card registers; other register kinds require CSV. Supply bank_id (the actual routing identifier) for checking/savings; QBO also requires intu_bid (the Intuit institution identifier). Optional fid is the institution's OFX identifier. These are never inferred from account numbers. CSV columns vary by target; finstat includes resolution fields. All formats use bank-feed polarity (credit-family charges are negative). Original references are preserved separately from generated FITIDs.
The handle authenticates through the same membrane as open_standard_document; admission is neither required nor performed, and workspace books are never read or changed. The result is an expiring download handle with format, size, and SHA-256. A non-statement Standard Document is rejected. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| fid | No | Optional OFX financial institution identifier; separate from bank_id and intu_bid. | |
| format | Yes | Closed interchange format. csv additionally requires target. | |
| handle | Yes | Transfer handle naming the Standard Statement. | |
| target | No | Required when format is csv. | |
| bank_id | No | Actual bank routing identifier, required for checking/savings OFX/QBO. Never an account number. | |
| intu_bid | No | Intuit financial institution identifier, required for QBO. Obtain from the target institution; never guess. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return) — authorization and transfer storage only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| format | Yes | qbo, ofx, or csv. |
| handle | Yes | Download handle (download:N) for the export file. |
| sha256 | Yes | Export SHA-256 digest. |
| status | Yes | standard_statement_exported on success. |
| target | No | CSV only: the selected target format (quickbooks, xero, sage, or finstat). |
| file_name | Yes | Export file name. |
| byte_count | Yes | Export byte count. |
| expires_at | Yes | Download session expiry. |
| media_type | Yes | Export media type. |
| session_id | Yes | Opaque transfer-session identity for recovery through list_transfer_sessions. |
| artifact_kind | Yes | Public transfer artifact classification. |
| source_handle | Yes | The converted standard statement document's transfer handle, echoed. |
| workspace_tag | Yes | Workspace used for authorization and transfer storage. |
| sign_convention | Yes | bank_feed: positive inflow, negative outflow. |
| download_program | Yes | |
| transaction_count | Yes | Number of register transactions in the export file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, non-destructive, closed-world); the description adds substantial context on top: admission is neither required nor performed, workspace books are never read or changed, non-statement documents are rejected, the call is not metered, and the result is an expiring download handle with format, size and SHA-256. It also discloses polarity behavior and that original references are preserved separately from generated FITIDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the paragraph structure separates format rules from side-effect/authorization behavior. Slightly verbose, with the format enumeration in prose partly duplicating the enum in the schema, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still summarizes the meaningful return (expiring download handle, format, size, SHA-256). For a 7-parameter tool with conditional requirements, all the information an agent needs to invoke it correctly — authorization path, rejection case, billing, polarity — is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description still adds value by spelling out conditional requirements the schema encodes only structurally: bank_id for checking/savings, intu_bid additionally for QBO, fid as the separate OFX institution identifier, and that none of these are inferred from account numbers. This is above the baseline-3 case where the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Converts one authenticated Standard Statement into one interchange file' — and immediately enumerates the closed format set. This is clearly distinguishable from siblings like render_standard_statement or create_download_sessions, which do not produce interchange files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection rules: OFX/QBO support checking, savings, and credit-card registers while 'other register kinds require CSV', and csv additionally requires a target. It stops short of naming an alternative sibling (e.g., render_standard_statement) and the condition that would select it, so routing versus siblings is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_balance_sheetGenerate balance sheetARead-onlyIdempotentInspect
Generates a standard balance sheet for one chart as of one date: assets, liabilities, and equity by account with totals, and the Assets = Liabilities + Equity verdict. chart_id is required only when the workspace has more than one active chart; as_of_date is an inclusive cutoff, and omitting it means all posted activity; include_zero_accounts defaults to true. Amounts are summed as posted. completeness says what the books lack: a chart_exception (nothing posted since the data changed), open requests, notices. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | No | Optional chart id. Required when the workspace has more than one active chart; may be omitted when exactly one exists. | |
| as_of_date | No | Optional inclusive cutoff date in YYYY-MM-DD format. Omitted means all posted activity. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_zero_accounts | No | Include chart accounts with no posting activity. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| assets | Yes | Asset rows. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| equity | Yes | Equity rows: ending equity without current earnings; those sit in net_income. |
| status | Yes | balance_sheet_generated on success. |
| balanced | Yes | True when total_assets equals total_liabilities plus total_equity. |
| chart_id | Yes | The one chart this report covers. |
| as_of_date | Yes | Inclusive cutoff; null means all posted activity. |
| chart_name | Yes | The chart's name. |
| net_income | Yes | Current earnings through the date, not yet closed to equity; included in total_equity — the standard Net Income row. |
| liabilities | Yes | Liability rows. |
| completeness | Yes | What these books lack. complete is true only with no chart_exception and no open request. A chart with an exception has posted nothing since the data changed, so the numbers predate it; open requests (list_review_items, level request) leave the books short or provisional; notices change nothing. |
| total_assets | Yes | Sum of detail asset amounts. |
| total_equity | Yes | Detail equity plus net_income. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| total_liabilities | Yes | Sum of detail liability amounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the annotations: amounts are summed as posted (no adjustments), the completeness field reports chart_exception, open requests, and notices, and the tool is not metered. 'Read-only' merely restates readOnlyHint, but the aggregation semantics and completeness semantics are genuinely new information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded paragraph: the core action and scope come first, then parameter nuances, then behavioral notes. It is dense with semicolon-chained clauses and could be split for readability, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes needn't be spelled out, and the description still explains the notable completeness/ chart_exception field and the lack of metering. For a read-only, idempotent report generator this covers what an agent needs, though cross-tool routing guidance is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description largely restates the schema's own wording for chart_id conditionality, the inclusive YYYY-MM-DD cutoff, and the include_zero_accounts default. The baseline 3 applies because the schema already carries these semantics with no added nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generates a standard balance sheet') plus the exact scope ('for one chart as of one date') and the contents it returns (assets, liabilities, equity by account with totals, and the A = L + E verdict). This clearly distinguishes it from siblings like generate_trial_balance and generate_profit_and_loss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance: chart_id is needed only when the workspace has more than one active chart, and omitting as_of_date means all posted activity. It does not, however, say when to prefer this over generate_trial_balance or generate_profit_and_loss, so sibling selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_profit_and_lossGenerate profit and lossARead-onlyIdempotentInspect
Generates a standard profit and loss statement for one chart over an optional inclusive date range: revenue and expense accounts with totals and net income. chart_id is required only when the workspace has more than one active chart; omitted bounds are open-ended; include_zero_accounts defaults to true. Amounts are summed as posted. completeness says what the books lack: a chart_exception (nothing posted since the data changed), open requests, notices. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | No | Optional inclusive end date in YYYY-MM-DD format. Omitted is open-ended. | |
| chart_id | No | Optional chart id. Required when the workspace has more than one active chart; may be omitted when exactly one exists. | |
| date_from | No | Optional inclusive start date in YYYY-MM-DD format. Omitted is open-ended. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_zero_accounts | No | Include chart accounts with no posting activity. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | profit_and_loss_generated on success. |
| date_to | Yes | Inclusive end; null is open-ended. |
| revenue | Yes | Revenue rows. |
| chart_id | Yes | The one chart this report covers. |
| expenses | Yes | Expense rows. |
| date_from | Yes | Inclusive start; null is open-ended. |
| row_count | Yes | Number of returned rows. |
| chart_name | Yes | The chart's name. |
| net_income | Yes | total_revenue minus total_expenses. |
| completeness | Yes | What these books lack. complete is true only with no chart_exception and no open request. A chart with an exception has posted nothing since the data changed, so the numbers predate it; open requests (list_review_items, level request) leave the books short or provisional; notices change nothing. |
| total_revenue | Yes | Sum of detail revenue amounts. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| total_expenses | Yes | Sum of detail expense amounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered; the description adds genuinely new behavior: amounts are summed as posted, and the completeness field reports gaps (chart_exception, open requests, notices). 'Not metered' also adds cost/quota context absent from annotations, though 'Read-only' merely restates them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the statement type and contents come first, then input conditions, then result semantics. Nearly every clause carries information, though the trailing 'Read-only and not metered' half-duplicates the annotations and the run-on phrasing packs five distinct rules into one block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description need not explain return structures, and it still covers aggregation basis, chart disambiguation, open-ended dates, and the meaning of the completeness field. Minor gaps remain around accounting basis and whether comparative periods are included, but nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description largely mirrors the schema on chart_id, date bounds, and include_zero_accounts. It earns above baseline only through 'Amounts are summed as posted', which conveys the aggregation basis rather than restating parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generates a standard profit and loss statement for one chart') and defines the output contents (revenue and expense accounts, totals, net income), which implicitly separates it from generate_balance_sheet and generate_trial_balance. It never names those siblings, so routing still requires the agent to infer from accounting knowledge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives useful conditional guidance on inputs ('chart_id is required only when the workspace has more than one active chart', omitted bounds are open-ended), but says nothing about when to choose this statement over generate_balance_sheet, generate_trial_balance, or generate_report, and no exclusions are stated. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_reportGenerate workspace reportARead-onlyIdempotentInspect
Generates one complete, unfiltered machine view of the workspace — the audit tier, as JSON, so the full evidence chain behind the books can be extracted and inspected. report_type is the closed six: transaction_space, event_crosswalk, chart_requests, chart_accounts, chart_journal_entries, chart_journal_entry_lines.
For human-shaped questions use the dedicated tools instead: list_workspace_accounts and list_workspace_account_activity for workspace accounts, list_chart_accounts for a chart's tree, and generate_trial_balance, generate_balance_sheet, and generate_profit_and_loss for financial statements. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| report_type | Yes | Which audit view to generate. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Report rows when tabular. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | report_generated or report-specific status. |
| resources | No | Workspace resource links. |
| row_count | No | Report row count when tabular. |
| report_type | No | Generated report type. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds 'not metered' and 'unfiltered/complete' beyond the readOnlyHint/idempotentHint annotations, telling the agent the payload is full-fidelity and safe to call repeatedly at no cost. It does not warn about payload size or latency for what is clearly a bulk dump, which is the only meaningful gap given annotations already carry the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and the alternative-tool routing follows immediately. The enumerated list of six report_type values duplicates the schema enum and is the one clearly redundant sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, and it supplies what the structured fields cannot: the audit-tier framing, the unfiltered scope, and the routing to human-facing alternatives. Nothing needed to select or invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the six constants already has a detailed description, so the schema does the heavy lifting. The description's 'closed six' enumeration largely restates the oneOf and adds only the framing that these are audit-tier views rather than user reports.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and artifact: 'Generates one complete, unfiltered machine view of the workspace — the audit tier, as JSON.' It also states what the output enables (extracting the evidence chain behind the books), which separates it from every reporting sibling in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent away for human-shaped questions and names the exact alternatives by task: list_workspace_accounts/list_workspace_account_activity for accounts, list_chart_accounts for chart trees, and the three generate_* statements for financials. This is a clear when-to-use/when-not-to-use with named siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_trial_balanceGenerate trial balanceARead-onlyIdempotentInspect
Generates a standard trial balance for one chart as of one date: chart-account debit and credit balances with totals, the difference, and the balance verdict — the check is Assets + Expenses = Liabilities + Equity + Revenue. chart_id is required only when the workspace has more than one active chart; as_of_date is an inclusive cutoff, and omitting it means all posted activity; include_zero_accounts defaults to true. Amounts are summed as posted. completeness says what the books lack: a chart_exception (nothing posted since the data changed), open requests, notices. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | No | Optional chart id. Required when the workspace has more than one active chart; may be omitted when exactly one exists. | |
| as_of_date | No | Optional inclusive cutoff date in YYYY-MM-DD format. Omitted means all posted activity. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_zero_accounts | No | Include chart accounts with no posting activity. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | Chart-account rows. Summary accounts display and are excluded from totals. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | trial_balance_generated on success. |
| balanced | Yes | True when the difference is zero. |
| chart_id | Yes | The one chart this report covers. |
| row_count | Yes | Number of returned rows. |
| as_of_date | Yes | Inclusive cutoff; null means all posted activity. |
| chart_name | Yes | The chart's name. |
| difference | Yes | total_debits minus total_credits. |
| completeness | Yes | What these books lack. complete is true only with no chart_exception and no open request. A chart with an exception has posted nothing since the data changed, so the numbers predate it; open requests (list_review_items, level request) leave the books short or provisional; notices change nothing. |
| total_debits | Yes | Sum of detail-account debit balances. |
| total_credits | Yes | Sum of detail-account credit balances. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses that amounts are summed as posted, states the exact accounting-identity check, explains what the completeness field reports (chart_exception, open requests, notices), and notes the tool is not metered. These are genuine behavioral traits an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads what the report contains, then parameter rules, then behavioral notes. Efficient with no filler, though the run of semicolon-clauses makes it slightly dense to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be spelled out, yet the description still clarifies the verdict logic and the completeness field's semantics. For a read-only, four-parameter report tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions already state the conditional chart_id rule, the inclusive YYYY-MM-DD cutoff, and include_zero_accounts defaulting to true. The description restates these faithfully but adds little syntax or semantics beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generates a standard trial balance for one chart as of one date') and enumerates the payload (debit/credit balances, totals, difference, verdict). This clearly separates it from sibling report generators like generate_balance_sheet and generate_profit_and_loss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance for parameters (chart_id required only when multiple active charts; omitting as_of_date means all posted activity). It does not explicitly say when to prefer this over generate_balance_sheet or generate_report, but the 'as of one date / one chart' scoping implies the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_declarationGet declarationARead-onlyIdempotentInspect
Returns one authorized declaration's complete canonical body plus its admission and application history. Select by exactly one of declaration_id — a local id, stable within this workspace — or content_hash, the document's own name: computed from its canonical content, identical wherever the document travels. Kind is one of the eight authorable kinds; historical non-authorable kinds return object_unavailable rather than a body. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| content_hash | No | Portable content hash. Supply exactly one of declaration_id or content_hash. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| declaration_id | No | Local declaration id. Supply exactly one of declaration_id or content_hash. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | declaration_retrieved on success. |
| history | No | Admission and application history. |
| summary | Yes | Declaration summary. |
| declaration | Yes | Canonical declaration body. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| authorable_now | Yes | True for every served live kind. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavioral facts: it is 'not metered' and returns object_unavailable instead of a body for historical non-authorable kinds. It also flags the 'authorized' scoping constraint. Missing only latency/pagination-style details, which the output schema may cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return payload, then the selection rule, then edge-case behavior. Dense and purposeful, though the gloss on content_hash ('the document's own name: computed from its canonical content, identical wherever the document travels') is slightly verbose for the value it adds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter read tool with full schema coverage and an output schema, everything an agent needs is present: how to select the record, which identifier to prefer, what the body contains, and what happens for non-authorable kinds. Return-value detail is correctly delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond it: declaration_id is characterized as a workspace-local, stable id and content_hash as the document's own canonical name that is identical wherever the document travels. That portability framing is not in the schema's terse 'Portable content hash' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with precise scope: returns one authorized declaration's canonical body plus its admission and application history. The singular 'one' plus the explicit body/history payload separates it from list_declarations without needing to name the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection rule ('exactly one of declaration_id or content_hash') and explains the failure mode for historical kinds (object_unavailable). It does not explicitly state when to prefer this over list_declarations or open_standard_document, so it stops short of naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_party_profileGet party profileARead-onlyIdempotentInspect
Looks up a workspace party by party_id (from list_parties). Returns the current non-posting profile, source assertions, hashes and conflicts. Missing profiles are empty, not errors. Missing or foreign-workspace IDs are party_not_found. Restricted-content references are withheld. Profile facts never change who a party is and never post.
| Name | Required | Description | Default |
|---|---|---|---|
| party_id | Yes | Positive party ID from list_parties. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | party_profile |
| profile | Yes | Current union of non-posting profile observations; conflicting scalars are not silently selected. |
| party_id | Yes | Resolved party id. |
| conflicts | Yes | |
| assertions | Yes | |
| workspace_tag | Yes | Resolved workspace id. |
| assertion_count | Yes | Number of current distinct assertions. |
| requested_party_id | Yes | Requested id, possibly an alias. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the description clears the lower bar easily by adding real edge-case semantics: a missing profile yields an empty result rather than an error, while missing or foreign-workspace IDs produce a distinct 'party_not_found'. It also discloses that restricted-content references are withheld and that profile facts never post, which an agent could not infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb, resource and identifier provenance, followed by return contents and then failure modes. Dense but nearly every clause carries information; the closing 'Profile facts never change who a party is and never post' is slightly cryptic phrasing for what is really a no-side-effects guarantee.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return shapes, and it correctly focuses on the things structured data cannot express: empty-vs-error semantics, the party_not_found case, and content withholding. Coverage is strong for a two-parameter read tool; only explicit guidance on when not to use it is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents both the party_id and workspace_tag semantics. The description only repeats that party_id originates from list_parties, adding nothing about format or validation beyond the structured fields, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Looks up a workspace party by party_id') and enumerates what comes back: current non-posting profile, source assertions, hashes and conflicts. It also anchors the identifier to the sibling that produces it ('from list_parties'), so the agent can tell it apart from the list tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'by party_id (from list_parties)' phrasing establishes the natural call sequence: list first, then fetch details. It gives clear context for when this tool is the right one, but names no explicit exclusion or alternative for retrieving party data in bulk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_startedGet startedBRead-onlyIdempotentInspect
Returns the FinStat workflow: create or recover a workspace, turn source PDFs into Standard Documents, keep those files locally, register them and submit them in sets as the accounting basis, use the workspace without a chart, optionally install charts as projections, and share documents across a group so any FinStat system can reproduce the books.
The guide is the same every time. Transfer sessions move file bytes — a handle from a session or a producing tool passes straight to the next tool; never download and re-upload. If workspace_tag is supplied and authorized, callable steps include it; missing host values stay host steps, never placeholder calls. Charts are optional. Read-only and not metered.
FinStat reads bank, card, wallet, line of credit, loan and brokerage statements; invoices, bills, credit and debit notes; receipts, settlements and payroll. Before creating, check a file's first page: a trial balance, ledger report or tax form is not a statement; tell the user what it is. A QuickBooks Online export zip goes to create_standard_book, a chart of accounts to create_standard_chart.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | No | Optional. When supplied and authorized, callable steps include this tag. It does not change the guide. |
Output Schema
| Name | Required | Description |
|---|---|---|
| steps | Yes | Ordered workflow steps: {kind:tool, action} or {kind:host, label, instruction}. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | getting_started. |
| sections | Yes | Fixed FinStat workflow sections. |
| workspace_tag | No | Echoed when a tag was supplied and authorized. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description's "same every time / read-only / not metered" largely restates those. It does add genuinely useful behavioral context — transfer-session handles pass directly between tools with no re-upload, and workspace_tag makes steps callable rather than placeholder — but this describes the guide's contents more than the call's own behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
For a zero-required-parameter, read-only guide fetch, roughly 170 words across three dense paragraphs is heavy, and much of it summarizes the guide's payload rather than helping select or invoke the tool. The lead sentence is well front-loaded, but the middle and closing material on statement types and file-format routing is only tangentially about this call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema is trivial, annotations cover the safety profile, and an output schema exists, so little is required; the description nonetheless conveys the workflow scope, the transfer-handle convention, and the optionality of charts. An agent can call this correctly and knows what class of content it receives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is fully documented in the schema (100% coverage), so the baseline applies. The description does add one meaningful nuance the schema omits: an unauthorized or missing workspace_tag leaves host steps as host steps rather than producing placeholder calls, which tells the agent what happens on the failure path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource — "Returns the FinStat workflow" — and the rest of the paragraph enumerates the workflow's subject matter, so an agent knows exactly what comes back. However, it makes no attempt to distinguish itself from the many sibling guide tools (guide_tasks, guide_glossary, examples, demo), which is the main thing an agent needs when several tools look like entry points.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"The guide is the same every time" and "Read-only and not metered" imply it can be fetched freely and repeatedly, but there is no explicit when-to-call framing or statement of how it relates to guide_tasks or examples. The routing advice present ("A QuickBooks Online export zip goes to create_standard_book", "a trial balance ... is not a statement") guides the agent on downstream steps rather than on selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_job_summaryGet workspace processing summaryARead-onlyIdempotentInspect
Returns a non-blocking summary of the workspace's processing: counts by public domain and state, unresolved failures, and the public Tasks that can be inspected. enqueued and processing are current-state counts, not lifetime totals; completed is how many effects have finished. The read wakes nothing and is safe to poll.
For one public Task use tasks_get or tasks/get; for a bounded workspace barrier use wait_for_workspace_idle. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| idle | No | True when no processing is queued or running and no submission Task is still working (processing_effects_active is 0). |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_processing_summary on success. |
| totals | No | Current-state enqueued and processing, lifetime completed, and unresolved failures. processing is never a lifetime job total. |
| domains | No | Per public domain: statement_adaptation, identity_resolution, event_derivation, declaration_application, chart_posting. Same count grain as totals. |
| failures | No | Unresolved processing blockers. |
| active_tasks | No | Public TaskIds still working. |
| failed_tasks | No | Public TaskIds with unresolved failures. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| processing_effects_active | No | Processing queued or running, plus submission Tasks still working. |
| processing_effects_failed | No | Processing chains that ended in failure. A failure that did not end its chain is counted in totals.failed_unresolved and listed in failures. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds genuinely new behavior: it is non-blocking, 'wakes nothing', is safe to poll, is not metered, and — critically — that enqueued/processing are current-state counts rather than lifetime totals while completed counts finished effects. That counter semantics note prevents a real misreading of the output and is not in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents, then the count semantics, then routing to alternatives — a sensible order with little waste. Minor redundancy in restating 'Read-only' when readOnlyHint already declares it, though 'not metered' is new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be restated, yet the description still resolves the ambiguity an agent would hit — what each count means and whether polling is safe. For a single-parameter read tool with full annotation coverage, nothing needed is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single workspace_tag parameter is fully documented in the schema as the active workspace id. The description adds nothing about the parameter, so the baseline 3 applies — the schema does all the work here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns a non-blocking summary of the workspace's processing') and enumerates the payload: counts by public domain and state, unresolved failures, and inspectable public Tasks. It distinguishes itself from tasks_get and wait_for_workspace_idle by explicitly routing those use cases elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives with the conditions that select them: 'For one public Task use tasks_get or tasks/get; for a bounded workspace barrier use wait_for_workspace_idle.' It also tells the agent this is safe to poll, which is direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_canonical_schemaGuide to canonical schemasARead-onlyIdempotentInspect
Returns the exact machine schema for one canonical species: statement (default), the shape create_standard_statements accepts; chart, the shape create_standard_chart seals; or authorable declaration, the shape the declaration tools' document arm seals. For statement it is canonical JSON: one bare statement (schema, with each type's required controls, and an example), or several in the optional envelope (envelope_schema); topic csv adds how to build one from a CSV or bank export. Laws JSON Schema cannot express are listed in authoring_notes. Read-only, no workspace, and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Statement only: csv adds how to build a canonical statement from a CSV or bank export, with two worked examples. | |
| species | No | statement (default) | chart | declaration | |
| body_version | No | Chart only: 4, the current body (default), or 3, the body of charts sealed before node namespaces. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | |
| schema | Yes | |
| status | Yes | |
| example | No | |
| species | Yes | |
| csv_guide | No | |
| csv_examples | No | |
| schema_version | Yes | |
| authoring_notes | Yes | |
| envelope_schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description still adds real context: 'no workspace, and not metered,' plus what the payload contains (statement vs envelope_schema, authoring_notes for constraints JSON Schema cannot express). That is useful behavior beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense run-on with heavy jargon ('the shape the declaration tools' document arm seals') and drifts from the enum value 'declaration' to 'authorable declaration.' It is informative yet harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, yet the description still explains the two statement payload shapes and authoring_notes. Coverage is strong; only the naming mismatch on 'declaration' leaves a small ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all three params are enums, so the schema already carries most semantics; the description still adds the meaningful mapping from each species value to its consuming tool and flags 'statement' as the default. body_version is left to the schema, which is fine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the exact machine schema for one canonical species') and then disambiguates all three species by naming the sibling each shape serves (create_standard_statements, create_standard_chart, the declaration tools). An agent can tell exactly what it gets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for each mode: use 'statement' for the default statement shape, 'chart' for charts, 'declaration' for authorable declarations, plus 'topic csv' for CSV/bank-export construction. It does not say when NOT to use this versus guide_glossary or examples, so it stops short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_glossaryGuide to FinStat vocabularyARead-onlyIdempotentInspect
Returns the FinStat glossary: the closed vocabulary this surface uses — documents, statements, declarations, charts, the statement forms and types, the double-entry equation, and the supported interchange formats. Optional terms selects a subset; a statement type key such as checking or invoice returns that type's form. Omit terms for the full pack. Read-only, no workspace, and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| terms | No | Optional subset of current terms or known aliases. Omit for the full pack. Unknown values are invalid_arguments. | |
| detail | No | summary (default): term + meaning. full: also common_misuse, see_also, related_tools. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | |
| status | Yes | |
| entries | Yes | |
| retired | Yes | Retired vocabulary: term and why. The conformance denylist. |
| glossary_hash | Yes | |
| glossary_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent. The description adds two operational facts the annotations lack: no workspace is required and calls are not metered. It also notes that a statement type key returns that type's form, which is non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, with the purpose front-loaded. Each sentence carries distinct information: purpose and scope, subset selection, the default, and the operational profile.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a simple read-only lookup with two optional parameters, the description covers scope, parameter usage, prerequisites and cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description still adds meaning beyond it: statement type keys such as 'checking' or 'invoice' are valid terms and return forms. That clarifies what values terms accepts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource: it returns the FinStat glossary. It also lists what the vocabulary covers (documents, statements, declarations, charts, statement forms/types, the double-entry equation, interchange formats). That scope sets it apart from guide_canonical_schema and guide_tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to use the terms parameter: omit it for the full pack, or pass a statement type key to get that type's form. It never says when to call this tool instead of guide_canonical_schema, guide_tasks or get_started, so the reason to choose it has to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_tasksGuide to FinStat TasksARead-onlyIdempotentInspect
Returns the FinStat Task guide: how durable Tasks work on this surface — the official MCP Tasks extension io.modelcontextprotocol/tasks (SEP-2663) for hosts that advertise it, the ordinary-client parallel for hosts that do not, and the submit / create_standard_statements workflow both profiles share. The ordinary tasks_get poll is FinStat's own and is not part of the extension. The guide is the same every time. Read-only, no workspace, and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | summary (default): sections, dual path, references, and flex. full: also the workflow steps. |
Output Schema
| Name | Required | Description |
|---|---|---|
| flex | Yes | |
| status | Yes | |
| sections | Yes | |
| workflow | No | |
| dual_path | Yes | |
| references | Yes | |
| profile_on_this_request | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered and the redundant "same every time" / "read-only" restatements add little. What does add value beyond the annotations is "no workspace" and "not metered" — operational facts an agent needs to know before spending a call that are nowhere in the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and the trailing operational constraints (read-only, no workspace, not metered) are efficiently packed. The middle em-dash enumeration is dense and jargon-heavy (SEP-2663, io.modelcontextprotocol/tasks) and slightly obscures the core message, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the description correctly focuses on what the guide covers and the dual-host model. It omits any mention of the detail parameter's effect, but that gap is fully absorbed by the schema, leaving little an agent needs that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single enum parameter (detail: summary/full) is fully documented in the schema, so the description need not restate it. The description never mentions the summary-vs-full distinction or when to prefer full, so it adds no parameter-level meaning beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Returns the FinStat Task guide") and then enumerates the guide's contents: the MCP Tasks extension (io.modelcontextprotocol/tasks, SEP-2663), the ordinary-client parallel, and the shared submit / create_standard_statements workflow. It also distinguishes itself from the similarly named sibling tasks_get by noting the ordinary poll is FinStat's own and not part of the extension, so an agent won't confuse the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conditions the guide's applicability on host capability ("for hosts that advertise it" vs "hosts that do not"), which tells an agent which path applies to it. It does not, however, state an explicit trigger such as "call this before using submit" or differentiate from other onboarding siblings like get_started or demo, so exclusions are only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_mcp_connectionInspect MCP connectionARead-onlyIdempotentInspect
Reports what the server observes on this request: client name and version when supplied, User-Agent, the resolved protocol revision, whether this client advertised the Tasks extension, authorization shape without the credential, and transport. The banner is a paste-ready card citing the MCP specification and, when this build implements it, the official Tasks extension io.modelcontextprotocol/tasks (SEP-2663), followed by the facts of this request. history.available says whether per-client request history is included on this connection. Read-only, no workspace, and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| banner | Yes | Paste-ready one-line summary of the connection as the server observes it. |
| client | Yes | What THIS request carried: user agent, claimed revision and its source, auth shape, stale-session flag. |
| server | Yes | This server's engine build, session mode, and supported protocol revisions. |
| status | Yes | |
| history | Yes | This client's trailing-hour request history from the wire access ledger, when readable. |
| specification | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely non-structured context: it operates without a workspace, is not metered, and reports 'history.available' to indicate whether per-client request history is included — details an agent could not get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the useful facts, but the middle sentence about a 'paste-ready card citing the MCP specification' and the SEP-2663 citation is presentation detail that does not help tool selection, and return-value description is partly redundant given an output schema exists. Trimming that would sharpen it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and zero parameters, the description need not document return shape, and the annotations cover the safety profile. What it adds — no workspace, no metering, history flag — is sufficient for an agent to call it correctly; only the missing sibling routing keeps it below 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly spends no space on arguments and instead frames the call as argument-free introspection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — it reports what the server observes about the current request — and enumerates the exact fields surfaced (client name/version, User-Agent, protocol revision, Tasks-extension advertisement, auth shape, transport). That is clearly distinct from diagnostic siblings like service_status (server health) or guide_tasks (documentation), so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The diagnostic intent is implied by 'what the server observes on this request' and the closing 'Read-only, no workspace, and not metered' tells the agent it is safe and cheap to call, but there is no explicit when-to-use framing and no named alternative (e.g., versus service_status) for related questions. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invert_standard_bookInvert Standard BookARead-onlyInspect
Turns one Standard Books document back into the standard documents a workspace ingests to reproduce it: the chart; a statement for each bank, card or cash register, made from the entries that post to it; the invoices, bills, receipts and credits it records; and a declaration for each entry no document carries. Supply the book by transfer handle (a sealed book package, a book body, or {book, annotations}), or a small one inline as book; it is authenticated when sealed and admitted under book law first.
Every document comes back sealed, each behind its own multi-read handle, in submit_batches: pass each batch to register as its items, the chart first, then submit and post. Nothing is registered here and no model runs. An entry the inversion can neither document nor declare is named in unresolved_entries; a statement submit would refuse — an identity the book does not hold (an account with no institution or number, or one the book filled in itself, which the chart then does not claim), or a document whose own law fails (a receipt whose items do not sum to its amount) — is named in withheld with the reason and left out of the batches, which submit would otherwise refuse whole. Either way the documents do not reproduce the book, and status is needs_information. report_handle names the whole inversion: how each entry was routed, and every finding with its evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | A small book inline: a sealed book package, a book body, or {book, annotations}. Exclusive with handle. | |
| handle | No | Workspace-scoped transfer handle (upload:N or download:N) naming the book: a sealed book package, a book body, or {book, annotations}. The usual path, e.g. create_standard_book's handle. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Scopes the call and the handles it returns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| book | Yes | Which book was inverted: identity, chart_identity, name, reporting_currency and its counts, as verify_standard_document reports them. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| report | Yes | Download descriptor for the inversion report. |
| status | Yes | inverted (every entry is documented or declared and every document can be submitted) or needs_information (unresolved_entries or withheld name what the batches do not carry). |
| withheld | Yes | Statements left out of the batches because submit would refuse them: statement, reason (why, as submit words it: an incomplete identity or a violated document law), missing (the identity fields the book does not hold; empty when the reason is the law), entries (the journal entries they carry). |
| entry_routes | Yes | Journal entries per route: registers, obligation, chart_residual (declared), unresolved. |
| finding_codes | Yes | The inversion's findings per code; each is in the report with its evidence. |
| report_handle | Yes | Multi-read download:N handle naming the whole inversion: each entry's route and outputs, the documents' traces, and every finding. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| submit_batches | Yes | Batches of at most 100 register items, each {kind: handle, handle}; the chart is first. |
| document_counts | Yes | Sealed documents made: charts, statements (registers and obligations), itemizations (receipts and refunds), declarations. |
| unresolved_entries | Yes | Journal entry ids the documents do not carry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It goes significantly beyond annotations by detailing critical failure modes like 'unresolved_entries' and 'withheld' documents, specifying the output status is 'needs_information,' and describing the reporting mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely dense and verbose. While every sentence contains crucial information, the sheer length and technical density make it unwieldy for quick agent parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the domain and the legal/technical nature of the process, the description is exhaustive, covering input, process flow, failure handling, and output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides vital semantic context to the inputs—differentiating between a 'handle' and an 'inline book' object—which is crucial for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a unique and complex transformation: turning a compiled Standard Books document back into its constituent parts (charts, statements, invoices, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly defines input methods (handle or inline book) and provides strict operational constraints, such as only registering charts first and noting that nothing is registered or modeled in this process.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_book_snapshotsList book snapshotsARead-onlyIdempotentInspect
Lists the workspace's book snapshots, oldest first: each one's snapshot_id (which create_view_link takes), chart_id, label, as_of, the sealed book's identity and entry count, and when it was sealed. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | book_snapshots_listed on success. |
| row_count | Yes | How many snapshots. |
| snapshots | Yes | Each snapshot: snapshot_id, chart_id, label, as_of, book_identity, entry_count, created_at. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the bar is lower; the description still adds real value with the ordering guarantee ("oldest first") and the metering note ("not metered"), which annotations do not cover. It omits any pagination or result-size behavior, which is the main remaining gap for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the verb first, no filler, and every clause carrying information (ordering, field list, cross-tool link, metering). Nothing could be removed without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the field enumeration is partly redundant, but it usefully highlights snapshot_id as the handoff value for create_view_link. An agent has everything needed to call this correctly; only pagination/result limits are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single workspace_tag parameter is already documented as the active workspace id returned by create_workspace and list_workspaces. The description adds no further parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lists the workspace's book snapshots") with scope and ordering ("oldest first") plus the fields returned. An agent can immediately distinguish it from create_book_snapshot or list_charts without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical "each one's snapshot_id (which create_view_link takes)" gives a concrete downstream reason to call this tool, effectively naming the follow-up tool. It stops short of explicit when-not guidance or naming list_events/list_review_items as alternatives, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chart_accountsList chart accountsARead-onlyIdempotentInspect
Lists chart accounts with their current balances, for one chart or for every active chart when chart_id is omitted. Each row reports chart_account_id, chart_id, chart_account_code, chart_account_name, chart_account_type, base_number, parent, role (account, which takes postings, or category, which sums the accounts under it), control, policy description, and total — the signed sum of unvoided journal lines. include_zero_accounts defaults to true. An unknown chart_id is chart_not_found, not a widened query. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | No | Optional chart id (active or retired). An unknown or cross-workspace chart_id returns chart_not_found. Defaults to all active charts in the workspace. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_zero_accounts | No | Include accounts with no posted balance. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | chart_accounts_listed on success. |
| accounts | Yes | Chart-account rows. |
| chart_id | Yes | Chart filter, when supplied. |
| row_count | Yes | Number of chart-account rows. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds genuinely new behavior: the not-metered property and, importantly, that an unknown chart_id is an error instead of a silent widening. It also explains what 'total' means (signed sum of unvoided journal lines), which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and every sentence carries information. The long enumeration of row fields is the weakest part, since an output schema exists and already conveys those names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with full schema coverage and an output schema, this is essentially complete: scope, error behavior, defaults, and cost profile are all covered. The row-field enumeration is redundant given the output schema, so it falls just short of full marks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameters already document defaults and the chart_not_found behavior, so the description largely restates the schema. It does clarify that chart_id may be active or retired only in the schema, not the description. Baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists chart accounts with their current balances') plus the scoping rule for chart_id. It does not explicitly distinguish itself from near-siblings such as list_charts or list_workspace_accounts, so an agent must infer the boundary from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: pass chart_id for one chart, omit it for every active chart, and an unknown chart_id yields chart_not_found rather than an empty or widened result. No explicit alternative tool is named for the 'I want flat accounts, not chart rows' case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chartsList chartsARead-onlyIdempotentInspect
Lists the workspace's charts, active and retired alike — lifecycle says which. Several charts may coexist, each asserting one owner set, accounting basis, and classification policy over shared events. A sealed chart names its owners, and admission founds each owner party when the name is new; owners[] and owner_match (any, all, exact, subset) say whose books these are and which events count as theirs. version is the installed version; post_chart_accounts installs the next, which update_standard_chart proposes, under the same chart_id. account_count is the POSTABLE accounts; node_count the categories. owner_disagreement_count counts bound instruments whose followed owner fails the chart's rule. posting is ready, chart_exception (exceptions says why; update_standard_chart proposes the repair) or retired. Every row exposes chart_id, the selector the other chart tools take. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| charts | Yes | One row per chart. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | charts_listed on success. |
| row_count | Yes | Number of charts returned. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's 'Read-only and not metered' corroborates rather than contradicts them while adding the non-obvious metering detail. It also discloses meaningful behavioral context beyond annotations — chief among them that posting can be 'chart_exception' with a repairs path and that a sealed chart founds owner parties on new names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the bulk of the text is a dense run of field-by-field definitions (account_count, node_count, owner_disagreement_count, posting) that restate what the output schema already declares. Every sentence is informative, but several are redundant given the existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema and read-only annotations, the description is more than complete — it covers lifecycle, posting states, owner semantics, and the chart_id linkage to other tools. The only shortfall is that field-level explanations duplicate the output schema rather than adding new guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter, workspace_tag, and schema coverage is 100% — the schema already explains it as the active workspace id returned by create_workspace/list_workspaces. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Lists the workspace's charts, active and retired alike,' and clarifies that lifecycle status distinguishes them. It never explicitly contrasts with siblings like list_chart_accounts or create_standard_chart, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Every row exposes chart_id, the selector the other chart tools take' implicitly tells the agent this is the entry point for chart workflows, and lifecycle/posting states hint at filtering. However, there is no explicit when-to-use vs. when-not guidance or named alternative for retrieving chart details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_declarationsList declarationsARead-onlyIdempotentInspect
Lists admitted Standard Declarations as summaries: identity, scope, kind, attribution, admission time, and application state with its reason. Full bodies stay with get_declaration. kind optionally narrows to one of the eight authorable kinds. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional filter to one authorable kind. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | declarations_listed on success. |
| row_count | Yes | Number of declarations returned. |
| declarations | Yes | Admitted declaration summaries. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the 'read-only' restatement in the description adds little. However, 'not metered' is genuinely new behavioral information (no quota/cost impact) and the note that results are summaries with full bodies elsewhere sets expectations about result weight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, followed by the get_declaration routing hint and the filter note. Every clause carries information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail needn't be spelled out, and the description still summarizes the returned fields. It covers scope (admitted only), filtering, the alternative for full bodies, and cost behavior — enough for correct selection and invocation of a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the 8-value enum for kind. The description reinforces the enum by characterizing it as 'one of the eight authorable kinds' and framing the filter as optional narrowing, but adds no format or value-level detail beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists admitted Standard Declarations as summaries') and enumerates exactly which fields are returned (identity, scope, kind, attribution, admission time, application state with reason). It also distinguishes itself from get_declaration by noting that full bodies stay there, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_declaration when full bodies are needed, and explains that the optional kind filter narrows results to a single authorable kind. It gives clear positive usage context but no explicit 'when not to use this' beyond the get_declaration split, and doesn't distinguish itself from other list_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList eventsARead-onlyIdempotentInspect
Lists the events derived from admitted evidence — movements, claims, and itemizations. Select by kind, endpoint account, owning party, reviewing chart, or an inclusive date window against the event's derived date; page with limit and cursor and read next_cursor while more remain. Each row carries the event's identity, its member evidence, and each chart's latest judgment of it. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional event kind. | |
| limit | No | Page size, 1..200; defaults to 100. | |
| cursor | No | Opaque continuation from the previous page's next_cursor. | |
| date_to | No | Optional inclusive end date, YYYY-MM-DD, against the event's derived date. | |
| chart_id | No | Optional filter: events this chart has judged. | |
| party_id | No | Optional filter: events touching an account this party owns (owner is whose instrument, not the fiduciary). | |
| date_from | No | Optional inclusive start date, YYYY-MM-DD, against the event's derived date. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_retired | No | Include retired events. Defaults to false. | |
| workspace_account_id | No | Optional filter: events with this workspace account as either endpoint. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| events | Yes | One row per event. |
| status | Yes | events_listed on success. |
| row_count | Yes | Number of events returned. |
| next_cursor | Yes | Continuation when more events match; pass back as cursor. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the bar is lower; the description adds real value beyond them by disclosing that results are "not metered," that paging requires reading next_cursor "while more remain," and that each row carries member evidence plus each chart's latest judgment. It does not mention any auth/permission prerequisite or how retired events behave beyond the schema's default, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose then filter surface then return shape; no filler. The middle sentence is dense and packs several concepts (five filter axes plus paging) into one clause, which is efficient but slightly crowded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema (so return-shape detail is optional) and rich annotations, the description still covers filters, pagination, and per-row content, leaving little ambiguity about how to call it. Minor gaps remain around what happens when no events match or whether pending evidence is excluded, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description largely restates what the schema already documents (kinds, filters, date window semantics, cursor paging). The one addition beyond the schema — the next_cursor read pattern — is also already implied by the cursor property's description, so no genuine lift over structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lists the events") and immediately qualifies the resource's provenance and subtypes ("derived from admitted evidence — movements, claims, and itemizations"). This is enough to distinguish it from siblings like list_review_items, list_chart_accounts, or list_workspace_account_activity without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates exactly what can be selected on (kind, endpoint account, owning party, reviewing chart, inclusive date window) plus pagination behavior, which gives an agent concrete selection criteria. It stops short of naming an alternative or a when-not case (e.g., use review items instead when you want unreviewed judgments), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_partiesList partiesARead-onlyIdempotentInspect
Lists the workspace's parties — the people, businesses, and institutions its documents name. Each row carries the canonical name, type, the other names it has been known by (aliases), how it was established — declared, evidenced, or judged — how many of the workspace's accounts it owns, and the cataloged institution when one is bound. party_type is individual, business, trust, nonprofit, government, or unknown. Pages of limit parties (100 by default), in party_id order: pass next_cursor back as cursor for the next page. next_cursor is always present and null on the last page. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name filter. | |
| limit | No | Page size, 1..200; defaults to 100. | |
| cursor | No | Opaque continuation from the previous page's next_cursor. | |
| party_type | No | Optional party type. person is invalid_arguments. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | parties_listed on success. |
| parties | Yes | One row per live party. |
| row_count | Yes | Number of parties returned. |
| next_cursor | Yes | Continuation when more parties match; pass back as cursor. Always present: null on the last page. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral contract: results are ordered by party_id, pages default to 100, next_cursor is always present and null on the final page, and the call is not metered. It stops short of covering error behavior or filter edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then row shape, then pagination mechanics — a logical order with little filler. The row-field enumeration is somewhat long, and it partly duplicates the output schema, but it is dense rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated list tool with full schema coverage and an output schema, the description covers what an agent needs: scope, ordering, page size, and the cursor contract. Minor gaps are the semantics of the name filter and error conditions on bad party_type values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the 1..200 limit bounds, cursor opacity, and the party_type enum. The description largely restates that (default 100, enum values, cursor round-trip) without adding new meaning about how the name filter matches.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the workspace's parties') and defines what a party actually is — 'the people, businesses, and institutions its documents name' — which removes ambiguity an agent would otherwise have. It does not explicitly contrast itself with the sibling get_party_profile, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: enumerate parties in a workspace, page through with cursor. There is no explicit statement of when to prefer this over get_party_profile for a single party, nor any precondition or exclusion beyond 'read-only and not metered'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_review_itemsList review itemsARead-onlyIdempotentInspect
Lists the findings that may need a human: chart postings flagged for attention, endpoints nobody has identified, opening balances not yet verified against the live ledger, party conflicts to declare, and submitted source-assessment discrepancies. Each item has a level. request: the books are incomplete or provisional until what it asks arrives (a posting the chart refused, an opening balance, the statement that paid a card, a discrepancy to acknowledge, a party conflict to declare). notice: the books are complete and the finding is worth a glance (a posting to confirm, an unnamed endpoint). Requests are listed first and counted in requests, notices in notices. Each item's ref (R-0033, N-0088) is the number the viewer prints, kept for good. A chart_exception is not a review item: it stops a chart, is returned by the tool that meets it and shows on list_charts. Source reviews clear only through a submitted source_assessment acknowledgment with the exact finding and an accountable reason; acknowledgment changes no posting and does not repair the source. The queue is derived from the workspace's current state on every call, and workspace_overview's open_review_items equals its length. Attention items clear through resolve_review_items (dismiss) or when the chart judges the event again; the other kinds clear when the fact they name lands (a declaration registered and submitted, a statement submitted), and each item's suggested_action says how. An opening reminder clears only when at least one active chart binds the account, and only when in each chart that binds it the account is bound to exactly one chart account (an asset, or a liability for a card or loan) that binds nothing else, and the entries on it dated before the first statement period sum to the printed opening balance in the account's currency (a declared entry in its account's; nothing converted). An empty result means no finding is visible, not assurance that the books are correct. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | review_items_listed on success. |
| notices | Yes | Items at level notice. |
| requests | Yes | Items at level request; listed first. |
| resources | No | Workspace resource links. |
| row_count | Yes | Number of review items. |
| review_items | Yes | Derived findings with a closed shape for each kind. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial non-obvious behavior: the queue is re-derived from workspace state on every call, its length equals workspace_overview's open_review_items, requests sort and count ahead of notices, refs are stable identifiers, and acknowledgment 'changes no posting and does not repair the source'. The explicit clearing semantics per item kind are exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and ordering are front-loaded well, but the body is one dense block of run-on clauses, and the extended opening-reminder clearing predicate (chart binding, single-chart-account binding, pre-statement-period entry sums, currency rules) is heavy detail for a list call. Most sentences are load-bearing, but the lack of paragraphing makes a very long definition harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described, and the description nonetheless covers derivation of the queue, ordering, stable refs, meaning of an empty result, and the full clearing path for every item kind. Nothing an agent needs in order to call this correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('Active workspace id (the workspace_tag create_workspace and list_workspaces return)'), so the schema already does the work. The description contributes nothing about workspace_tag, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the findings that may need a human') and then enumerates the concrete categories of item. It explicitly carves out what is NOT a review item ('A chart_exception is not a review item... shows on list_charts'), which lets an agent separate this from list_charts and the chart tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the conditions that select them: attention items clear via resolve_review_items (dismiss), source reviews clear only through a submitted source_assessment acknowledgment, opening reminders only when a chart binds the account under stated conditions. It also warns that an empty result means no visible finding, not correct books, which directly shapes how an agent should follow up.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_source_documentsList source documentsARead-onlyIdempotentInspect
Lists the documents admitted to a workspace — the provenance of its statements, charts and declarations, not the transfer tier's retained artifacts. Each row carries the source's immutable identity and hash, its document_kind (standard_statement, standard_chart, standard_declaration), whether the bytes are still retained, and the statements, chart or declaration admitted from it; bytes_available is false for a portable Standard Statement admitted without its original. A standard_chart or standard_declaration row holds the exact sealed document register admitted. Retained bytes download via create_download_sessions with source_document_id (or chart_id / declaration_id). Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | source_documents_listed on success. |
| row_count | Yes | Number of source documents returned. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| source_documents | Yes | Admitted source documents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'read-only' is redundant, but the description adds genuinely new behavior: 'not metered', the bytes_available=false case for a portable Standard Statement admitted without its original, and the fact that chart/declaration rows hold the exact sealed register. That is meaningful disclosure of edge-case row semantics beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope statement is front-loaded and the download routing is placed last, which is the right ordering. It is dense with domain jargon ('transfer tier's retained artifacts', 'sealed document register') and runs long, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema and complete annotations, the description covers scope, row contents, the key bytes_available caveat, and the download path. Nothing an agent needs to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100%, with the schema itself explaining that workspace_tag is the id returned by create_workspace and list_workspaces. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the documents admitted to a workspace') and immediately scopes it against a sibling concept ('not the transfer tier's retained artifacts'), which separates it from list_transfer_sessions. It also enumerates what a row contains, so an agent knows exactly what it gets back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the follow-on tool for the common next step ('Retained bytes download via create_download_sessions with source_document_id (or chart_id / declaration_id)'), which is real routing guidance. It also implicitly excludes the transfer-tier listing, but never states an explicit when-not-to-use condition or prerequisite beyond an active workspace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_statementsList statementsARead-onlyIdempotentInspect
Lists the typed statements admitted to a workspace. Each summary carries the statement's durable semantic key, its source lineage (source document and hash), form, kind — one of the fourteen catalog keys — the workspace account it reports on where applicable, its reconciliation verdict, and when it was admitted. The verdict is recorded, never gating: reconciled, violated (the document's own arithmetic fails), no_control (no printed control figures), or not_applicable. The full document is read with open_standard_document. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | statements_listed on success. |
| row_count | Yes | Number of statements returned. |
| statements | Yes | Admitted typed statements. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context: that the tool is not metered and that reconciliation verdicts are 'recorded, never gating,' which prevents an agent from wrongly treating violations as blockers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then enumerates summary fields and verdict semantics efficiently. The field enumeration is somewhat dense and overlaps with the output schema, but every clause is informative rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still enumerates summary fields such as semantic key, lineage, form, kind, verdict, and admission time. Combined with verdict semantics and the pointer to open_standard_document, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole workspace_tag parameter is documented in the schema itself, referencing create_workspace and list_workspaces. The description adds no syntax or format details for the parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the typed statements admitted to a workspace') with an explicit scoping constraint. It is clearly distinguishable from siblings like list_source_documents, list_workspaces, and open_standard_document, which serve different resources or granularity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names open_standard_document as the route to full document content, giving an explicit alternative for a related need. It stops short of a true when-not-to-use statement (e.g., when to prefer list_review_items or verify_standard_document instead), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submissionsList recent submissionsARead-onlyIdempotentInspect
Lists this principal's durable submission Tasks in one workspace, newest first — the recovery path for a lost taskId after disconnect, timeout, or restart. Filter by status; page with limit and cursor. Rows are bounded summaries; the complete receipt is tasks_get or tasks/get. create_standard_statements Tasks are recovered through list_transfer_sessions. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| status | No | ||
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds genuinely new behavioral facts: 'not metered' (cost profile) and 'Rows are bounded summaries' (return fidelity), which tells the agent not to expect the full receipt. It does not cover cursor expiry or result-volume behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each doing distinct work: identity, recovery use case, parameters, and result-fidelity plus sibling routing. Nothing is repeated from the title and no sentence could be dropped without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still warns that rows are summaries rather than receipts. With the recovery scenario, sibling routing, paging, and metering all covered for a 4-parameter read tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (only workspace_tag is documented), so the description has to carry weight, and it does: it names status as a filter and limit/cursor as the paging pair, and front-loads the newest-first ordering that governs cursor semantics. It stops short of explaining what each status value means or how long a cursor stays valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists this principal's durable submission Tasks'), plus scope ('in one workspace') and ordering ('newest first'). It also differentiates from the two nearest siblings, tasks_get (full receipt) and list_transfer_sessions (statement-creation Tasks), so an agent can pick correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the triggering situation: 'the recovery path for a lost taskId after disconnect, timeout, or restart'. It also routes the exception case away to list_transfer_sessions and points to tasks_get for full detail, covering when-to-use, when-not, and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_support_ticketsList support ticketsARead-onlyIdempotentInspect
Lists this principal's newest support tickets in one workspace — up to 50, newest first — each with its state (open, answered, closed), any answer, and the attached validation report. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | support_tickets_listed on success. |
| tickets | Yes | This principal's tickets, newest first, at most 50. |
| row_count | Yes | Number of tickets returned. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds details not in the annotations: a hard cap of 50 results, newest-first ordering, and that calls are not metered. It does not describe behavior when more than 50 tickets exist (silent truncation) or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the resource and scope, then the cap and ordering, then the returned fields. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% param coverage, the description is more than sufficient for a one-parameter read tool. The only real gap is whether the 50-item cap implies results can be silently truncated, which matters for an agent deciding whether it has seen everything.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, so the schema already fully documents workspace_tag. The phrase "in one workspace" reinforces that the parameter scopes results to a single workspace but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lists ... support tickets") along with scope ("this principal's", "in one workspace"), ordering, cap, and the fields returned. An agent can distinguish it from the write sibling submit_support_ticket without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only framing and "this principal's" scoping make the intended use clear, and "not metered" signals it is cheap to call for status checks. It never names an alternative or states when not to use it, so it stops short of explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transfer_sessionsList transfer sessionsARead-onlyIdempotentInspect
Lists or recovers authorized upload and download sessions for one workspace, newest first. Filter by session_ids, direction, or state; include_expired defaults to false; page with limit and cursor. Use it after a timeout before repeating transfer creation or metered production — listing changes nothing. A ready Standard Document handle feeds verify_standard_document, open_standard_document, and register. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | ||
| cursor | No | ||
| direction | No | ||
| session_ids | No | Recover exactly these sessions by the session_id values creation returned. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| include_expired | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds non-obvious behavior: newest-first ordering, include_expired defaulting to false, cursor+limit pagination, and the fact that the call is not metered. These are exactly the traits an agent cannot infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and scope, then filtering/paging, then usage and downstream tools; every clause carries information. It is dense rather than padded, though the final sentence bundles several distinct ideas that could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description need not describe return values; it instead supplies ordering, defaults, pagination, side-effect profile, and the recovery-after-timeout workflow. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29% (session_ids and workspace_tag), but the description compensates by explaining the filter axes (session_ids, direction, state), the include_expired default, and how paging works with limit and cursor. It still does not characterize the state enum values or the limit bounds, so it is not fully self-sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists or recovers ... upload and download sessions'), scopes it to one workspace, and specifies ordering ('newest first'). The read-only listing framing clearly separates it from the create_upload_sessions / create_download_sessions siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use it after a timeout before repeating transfer creation') and reinforces it with a no-side-effect rationale ('listing changes nothing'), plus forward pointers to verify_standard_document, open_standard_document, and register. It lacks an explicit 'do not use when…' exclusion, but the condition that selects this tool is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspace_account_activityList workspace account activityARead-onlyIdempotentInspect
Lists one account's side of each movement it touches, in deterministic date order. Exactly one of workspace_account_id or workspace_account_identifier selects the account. The same movement can appear under both endpoint accounts with opposite signed amounts, and a side names its containing event when one holds it. These are movement sides, not register rows and not journal entries. Mirrored register observations appear once per event, preferring this account's own row date/description. Positive means inflow and negative outflow even for credit cards. Ungrouped nonzero rows remain visible; retired events and zero rows are excluded. Filter by inclusive date_from and date_to; page with limit and cursor. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, 1..1000; defaults to 200. | |
| cursor | No | Opaque continuation from the previous page's next_cursor. | |
| date_to | No | Optional inclusive end date, YYYY-MM-DD; reversed ranges are rejected. | |
| date_from | No | Optional inclusive start date, YYYY-MM-DD. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| workspace_account_id | No | Selects the account (from list_workspace_accounts). Supply exactly one of workspace_account_id or workspace_account_identifier. | |
| workspace_account_identifier | No | Account identifier as printed (exact match against exactly one live account). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_account_activity_listed on success. |
| activity | Yes | This account's movement sides, in page order. |
| has_more | Yes | True when another page exists. |
| next_cursor | No | Pass back as cursor for the next page (present only when has_more). |
| display_name | Yes | The selected account's display name. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| workspace_account_id | Yes | The selected account. |
| workspace_account_identifier | Yes | The selected account's identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: retired events and zero rows are excluded, ungrouped nonzero rows remain visible, mirrored register observations appear once per event, the same movement surfaces under both endpoint accounts with opposite signs, and it is not metered. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: identity of the tool, then account selection, then data-shape caveats, then filtering/paging, then safety. Most sentences carry real information, though the signed-amount and mirroring sentences could be tightened to reduce cognitive load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return shapes, and it correctly focuses on the non-obvious semantics (sign convention, exclusions, per-event mirroring). Minor gap: it doesn't state what happens when the account selector matches zero or multiple accounts, though the schema partly implies exactly-one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the mutually exclusive account selectors and the inclusive date semantics. The description restates the one-of rule and the paging model but adds no syntax or format detail the schema lacks. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Lists one account's side of each movement it touches') and explicitly negates what it is not ('not register rows and not journal entries'), which separates it from list_events and list_workspace_accounts. The domain jargon 'movement sides' is unusual and only partially self-defining, so the purpose is clear but not instantly legible.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives operational conditions: exactly one of workspace_account_id or workspace_account_identifier, inclusive date_from/date_to filtering, and limit/cursor paging. It adds 'Read-only and not metered' as a usage signal. However, it never names a sibling alternative (e.g. list_events or list_workspace_accounts) or states when an agent should prefer one of those instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspace_accountsList workspace accountsARead-onlyIdempotentInspect
Lists every live account endpoint in a workspace: statement-backed instruments, owned or external counterparties, and explicit unidentified endpoints. An account needs no register to appear; register activity fields are present only where admitted statements report on the account. Owner is whose instrument; fiduciary is who holds or issues it. A chart's bookkeeping categories and their balances live in list_chart_accounts. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_accounts_listed on success. |
| accounts | Yes | One row per live account endpoint. |
| row_count | Yes | Number of accounts returned. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, non-open-world, so safety is covered; the description adds genuinely new context with 'not metered' and the caveat that register activity fields appear only where admitted statements report. Minor gap: no indication of result volume or ordering for a workspace that may hold many endpoints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then the domain definitions, then the sibling redirect. Every sentence carries information, though the dense jargon ('statement-backed instruments', 'explicit unidentified endpoints') and the owner/fiduciary aside make it slower to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description instead supplies the domain model needed to interpret results (owner vs fiduciary, register activity presence). It is nearly complete for a one-parameter read tool; only ordering/volume expectations are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema already explains workspace_tag as the active workspace id returned by create_workspace/list_workspaces. The description adds nothing about the parameter, which is acceptable at full coverage but no more than baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Lists every live account endpoint in a workspace') and enumerates the exact kinds returned: statement-backed instruments, owned or external counterparties, and unidentified endpoints. It explicitly differentiates from the near-named sibling list_chart_accounts by assigning chart bookkeeping categories and balances there.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a clear selection rule — an account needs no register to appear — and routes the chart-categories case to list_chart_accounts. It does not address the obvious sibling list_workspace_account_activity or explain when to prefer activity listings over the endpoint list, so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyIdempotentInspect
Lists active workspaces owned by the current principal, newest first. Use it to recover a workspace_tag when none is in hand. Optional name is an exact match after trim — the same key as create_workspace reuse. Page with limit and cursor. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional exact name after Unicode trim. | |
| limit | No | Page size, 1..200; defaults to 100. | |
| cursor | No | Opaque continuation from the previous page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the account tool result. |
| status | No | Account tool result status. |
| workspaces | No | Active workspaces owned by this principal, newest first. |
| workspace_tag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so restating 'read-only' adds nothing. It does contribute one genuinely new behavioral fact — 'not metered' — and the 'active ... owned by the current principal' filter is real scoping information, but ordering and paging are the only other additions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the operation and scope, then usage, then filter semantics, then paging. No filler and nothing repeated beyond the one redundant 'read-only' clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return shape needn't be explained, and the description covers filtering, ordering, paging, and purpose. A minor gap is what 'active' excludes (archived/deleted?) and whether cursor results are stable under new workspace creation, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining that name is an exact match after trim and shares the key semantics of create_workspace, which the schema does not say. It also groups limit and cursor under explicit paging intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope qualifiers: 'Lists active workspaces owned by the current principal, newest first.' The 'active' and 'owned by the current principal' constraints, plus the ordering, let an agent distinguish it from create_workspace and workspace_overview without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the trigger condition: 'Use it to recover a workspace_tag when none is in hand,' and ties the name filter to create_workspace's key reuse. It stops short of naming an alternative tool for the case where a tag is already known, so no true when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_standard_documentOpen Standard DocumentARead-onlyIdempotentInspect
Authenticates one Standard Document named by its transfer handle and returns its complete canonical content for review. A Standard Statement opens to its clear canonical statement; a Standard Chart or Declaration opens to its clear canonical document; a Standard Books document opens to its book and annotations. Content past the inline threshold arrives behind a fresh download handle rather than truncated. Opening changes nothing in the books. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | Server-side transfer handle (download:<id> / upload:<id>) naming the standard document. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return); scopes authorization and transfer storage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | standard_document_opened on success. |
| statements | No | The protected statement, carrying exactly one of canonical_document or canonical_document_handle (Standard Statement only). |
| document_kind | Yes | standard_statement, standard_chart, standard_declaration, or standard_books. |
| source_handle | Yes | The opened artifact's transfer handle, echoed. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| statement_count | No | Always 1 (Standard Statement only); retained for shape stability. |
| canonical_document | No | Clear canonical JSON, inline (Standard Chart, Declaration or Books). |
| canonical_document_handle | No | Download handle for clear canonical content past the inline threshold (Standard Chart, Declaration or Books). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds non-obvious behavior: 'not metered', 'Opening changes nothing in the books', and that content past the inline threshold comes back behind a fresh download handle rather than truncated. It also hints at an authentication/authorization step tied to the workspace.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then content variants, then edge behavior (truncation), then safety. Slight verbosity from repeated 'clear canonical' phrasing, but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, and it still explains the different content shapes and the threshold/download-handle behavior. Only the relationship to sibling tools (verify, export, list_source_documents) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (handle, workspace_tag) are already documented in detail. The description only reinforces that the handle names the document and that a new download handle may appear in the result; it adds no format or constraint detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Authenticates one Standard Document named by its transfer handle') and enumerates how each document type opens (statement, chart, declaration, books). An agent can distinguish it from verify_standard_document or list_source_documents without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (content review via a transfer handle) but there is no explicit when-to-use / when-not-to-use guidance and no named alternative such as verify_standard_document or export_standard_statement. The agent must infer the boundary from the phrase 'for review'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_chart_accountsPost chart accountsAIdempotentInspect
Posts the workspace's events to one chart (chart_id) or to every chart (all: true), and applies the journal-entry declarations, voids and retirements registered for it (declarations: a set of registered_document_id, or all, the default). A registered chart is installed at its first post, under the chart_id register returned, then checked. One order, every time: install, then journal entries and voids (applied before this call returns), then judge and post, then retirements last (a retirement applies once its chart's post has finished, or at once when the chart has exceptions). A chart this post retires (its retirement among the declarations posted) is not judged: its entries apply and it retires, status retiring or retired. declarations names chart-space documents only; a registered statement or workspace declaration is refused (not_postable): use submit. Each chart is first checked against the data, without a model: every owned primary account with movements must be bound by a claim, every claim must bind an account a register statement in the workspace is about, and every owner must be a party. A chart that fails returns a chart_exception naming each problem and posts nothing; repair it with update_standard_chart, register the chart it returns, and post it again: the post installs that next version under the same chart_id, add-only. A chart that passes is queued (status posting) and judges every pending event once; follow it with wait_for_workspace_idle. A row lists bank_disagreements when a declared cash line has no bank movement of its own: the author voids, corrects or keeps the entry. unmatched_declarations names registered entries whose "chart" is no chart's name here. Charts pass or fail independently. Declare all of a period's journal entries first, then post once: each post with new chart-wide entries re-judges the chart's events; each row says about how many the post's declarations re-opened. Model-backed posting is metered; the check is not.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | true installs every registered chart not yet posted, then posts every active chart. Exclusive with chart_id. | |
| chart_id | No | The chart to post: an installed chart, or one registered and not yet posted (register returned its chart_id), which this post installs. Exclusive with all. | |
| declarations | No | Registered journal-entry declarations, voids and retirements to apply with this post: an array of registered_document_id, or "all" (the default) for every one registered for the posted chart and not yet applied. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| charts | Yes | One row per chart: chart_id, chart_name, status (posting, chart_exception, retiring or retired) and exceptions (each with exception, designator, account_id, events, first_date, last_date); installed (chart or next_version) when this post installed a registered chart or version; bank_disagreements and a bank_note when the book and the bank disagree: the lines of each conflict, numbered, whose declared cash lines compete for fewer bank movements (journal_entry_id, journal_line_id, entry_date, account_id, amount, bank_rows, declared_lines, unmatched, conflict); a posting chart adds reopened_by_declarations (about how many judged events the declarations it applied re-opened) and, when any were re-opened, a note. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | chart_posting. |
| posting_count | Yes | Charts queued to post (status posting). |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| retiring_count | Yes | Charts this post retires instead of judging (status retiring or retired). |
| unmatched_note | No | With unmatched_declarations: what to do. |
| exception_count | Yes | Charts refused with a chart_exception. |
| unmatched_declarations | No | Present when any are: each registered declaration waiting for a post whose "chart" names no active or registered chart in the workspace, so no post applies it (registered_document_id, document_kind, chart, reason no_chart or retired_chart). Kept: a chart registered later under that name takes it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the install-then-entries-then-judge-then-retire order, that entries and voids are applied before return, that a retiring chart is not judged, and that model-backed posting is metered while the check is not. It also explains validation failure behavior via chart_exception and the posting queue status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then layers necessary edge cases, with little obvious filler. It is dense and could be easier to scan if split into shorter sections, but the length is largely justified by the tool's complex workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the mutation behavior, 100% schema coverage, annotations, and an output schema, the description is complete enough: it covers failure modes, recovery, sequencing, and follow-up actions. An agent has what it needs to invoke the tool correctly and interpret where to go next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters, but the description adds meaningful semantics: declarations must name chart-space documents, default to all, and registered statements or workspace declarations are refused. It also clarifies that chart_id may refer to an already-installed chart or one that this post installs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it posts the workspace's events to one chart or every chart and applies journal-entry declarations, voids and retirements. It explicitly distinguishes the chart_id and all modes and names submit for the neighboring case of statements or workspace declarations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance, including using submit for non-chart-space documents, repairing a failed chart with update_standard_chart and reposting, and following a queued post with wait_for_workspace_idle. It also advises declaring all period entries first and then posting once.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
registerRegister Standard DocumentsAIdempotentInspect
The only way a Standard Document enters a workspace: registers Standard Statements, Standard Charts and Standard Declarations, checked exactly as admission checks them, and processes nothing. One invalid item rejects the batch (registration_rejected, item-specific repair) and keeps nothing. Each document gets a registered_document_id and a step: statements and workspace declarations (parties, account identity, corrections, profiles, source assessments) wait for submit; journal-entry declarations, voids and retirements wait for post_chart_accounts on their chart; a chart gets its chart_id now and waits for its first post_chart_accounts on that id, which installs it, and reports now the chart exceptions it would raise against the data submitted so far (registered before its statements are submitted, its claims bind nothing yet and show as claim_unbound: submit the statements, then post_chart_accounts checks it again). Register installs nothing, founds no party and starts no work; the chart is not in list_charts until its post, and nothing reaches a chart's books until post_chart_accounts. Register everything, then submit in sets (say January's statements, then the declarations) and post, checking the books between steps. Registering the same document again returns its existing row. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, idempotentHint=true, openWorldHint=false, but the description adds substantial context beyond them: one invalid item rejects the entire batch and keeps nothing, rejection is reported as registration_rejected with item-specific repair, chart claims show as claim_unbound until statements are submitted, the chart is absent from list_charts until it is posted, and the call is not metered. The re-registration behavior ('returns its existing row') makes the idempotentHint concrete rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core is front-loaded and every sentence carries real information, but the body is a dense, heavily parenthesized wall of text — enumerations of declaration types and nested clauses like the claim_unbound explanation are hard to parse on first read. It is informative rather than padded, yet far from tightly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-phase workflow tool this is essentially complete: it covers admission checking, batch atomicity, the per-document registration id and waiting step, idempotent re-registration, and the handoff to submit and post_chart_accounts. An output schema exists, so not spelling out return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: workspace_tag and the handle field are documented, but the inline document object has no description anywhere. The description explains the batch-level semantics (one invalid item rejects everything, max batch behavior implied) but never explains the handle-vs-inline choice or what an inline document shape must contain, so it does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (registers) and the three specific resources (Standard Statements, Standard Charts, Standard Declarations), and immediately scopes it against the whole sibling family: 'Register installs nothing, founds no party and starts no work.' An agent can tell it apart from submit, post_chart_accounts, and create_standard_* without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the sequencing contract explicitly — 'Register everything, then submit in sets ... and post' — and names the alternatives (submit, post_chart_accounts) along with what each does that register does not. It also gives a concrete when-to-use pattern: batch register, then submit January's statements, then post, checking the books between steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_chart_numbersRender chart numbersARead-onlyIdempotentInspect
Renders a readable standard chart. Supply document, optional body_version (4, the current body, by default; 3 for an older sealed body), scheme, item_ids (posting accounts by default), and assignments keyed by stable ID (current body only). Supplied assignments override generated display codes. Does not alter, seal or install the chart. Unnumbered selected entries and collisions are errors; no aggregation or truncation occurs.
| Name | Required | Description | Default |
|---|---|---|---|
| scheme | No | ||
| document | Yes | ||
| item_ids | No | ||
| assignments | No | ||
| body_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| scheme | Yes | |
| assignments | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, and non-destructive behavior. The description adds meaningful behavior beyond that: current versus sealed body handling, assignment overrides, errors for unnumbered entries and collisions, and no aggregation or truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the details are dense but relevant. No sentence is obviously wasted, though the wording is packed enough that it takes careful reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter render tool with nested objects, enums, annotations, and an output schema, this is largely complete. The only notable omission is an explanation of the scheme choices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it largely does. It explains body_version defaults and version meanings, item_ids defaults to posting accounts, and assignments are keyed by stable ID and restricted to the current body; only scheme's values are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: renders a readable standard chart. The clause 'Does not alter, seal or install the chart' helps distinguish it from create/update-like siblings, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a rendering/preview operation rather than a mutation. It does not explicitly state when to use it instead of create_standard_chart, update_standard_chart, or list_chart_accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_standard_statementRender Standard StatementARead-onlyInspect
Renders one authenticated Standard Statement, named by its transfer handle, as a newly generated human-readable presentation PDF retained behind a fresh download handle. A document the pipeline's form law would refuse is refused whole. Each call renders and retains a new artifact; the books are untouched. Not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | Server-side transfer handle (download:<id> / upload:<id>) naming the standard document. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return); scopes authorization and transfer storage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | standard_statement_rendered on success. |
| source_handle | Yes | The rendered standard statement document's transfer handle, echoed. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| presentation_pdf | Yes | The generated PDF's transfer descriptor — session_id, handle, artifact_kind=generated_pdf, file_name, media_type, byte_count, sha256, expires_at, download_program — plus carries_protected_data=true, statement (its routing identity), and render_warnings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-idempotent, closed-world, non-destructive, and the description usefully reinforces this with 'each call renders and retains a new artifact; the books are untouched' and 'not metered'. It also discloses an all-or-nothing failure mode ('refused whole') that annotations cannot express, though it omits any timing/async behavior for a render operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the core action front-loaded and no filler. Dense domain jargon ('form law', 'the books') slightly reduces readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering the return shape, the description supplies the remaining behavioral context: artifact retention, non-metering, and atomic refusal. The notable gap is whether rendering is synchronous or must be awaited via wait_for_workspace_idle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry descriptions, so the schema does the heavy lifting. The description adds only gloss ('named by its transfer handle', 'fresh download handle') and gives no format detail or constraint beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (renders) and resource (Standard Statement) plus the produced artifact type (PDF behind a fresh download handle), which is far more than a restatement of the title. It does not differentiate itself from close siblings such as export_standard_statement or open_standard_document, so the agent must infer which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the statement must be addressed by an authenticated transfer handle and the result is a new presentation PDF. There is no explicit when-to-use versus export_standard_statement/open_standard_document, and no prerequisites such as needing the document pre-authenticated or whether rendering is synchronous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_standard_bookReport Standard BookARead-onlyIdempotentInspect
The trial balance and general ledger of one Standard Books document, derived from its journal entries: a book keeps its entries, and every balance follows from them. Supply the book by transfer handle (a sealed book package, a book body, or {book, annotations}), or a small one inline as book; it is authenticated when sealed and admitted under book law first. as_of (YYYY-MM-DD) is the day the trial balance is struck; the book's last day when absent.
The trial balance is inline, one row per account (and per register for a register's account), in minor units; the handle names it with the general ledger for the book's period to as_of: every account's opening, rows and closing. Nothing is changed and no model runs.
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | A small book inline. Exclusive with handle. | |
| as_of | No | YYYY-MM-DD: the day the trial balance is struck and the general ledger ends. The book's last day when absent. | |
| handle | No | Workspace-scoped transfer handle (upload:N or download:N) naming the book: a sealed book package, a book body, or {book, annotations}. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). Scopes the call and the handle it returns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| book | Yes | Which book: identity, chart_identity, name, reporting_currency and its counts. |
| as_of | Yes | The day the trial balance is struck. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| handle | Yes | Multi-read download:N handle naming trialBalance and generalLedger as standard book reports. |
| period | Yes | The general ledger's period: start (the book's first day) and end (as_of). |
| status | Yes | reported. |
| totals | Yes | debit and credit totals in minor units; they are equal. |
| retained | Yes | Download descriptor for the reports. |
| trial_balance | Yes | One row per account, and per register for a register's account: account, label, primary_account, debit, credit (minor units). |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the bar is lower. The description still adds real context beyond them: 'Nothing is changed and no model runs' rules out inference side-effects, and 'authenticated when sealed and admitted under book law first' discloses a validation gate that could cause rejection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Input mechanics are front-loaded in the first paragraph, which is good, but the opening clause 'a book keeps its entries, and every balance follows from them' is ornamental and the 'book law' phrasing is vague. The second paragraph re-describes the output already captured by the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the definition only needs to convey scope, inputs and safety, all of which are covered. The remaining gap is routing guidance against the many sibling reporting tools, which matters given the crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters, including the book/handle exclusivity and as_of default. The description restates accepted handle payloads (sealed package, book body, {book, annotations}) and the as_of meaning but adds little beyond the schema text, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: derives the trial balance and general ledger of one Standard Books document from its journal entries. An agent can tell this is a reporting/derivation operation, but the description never names or contrasts with near-neighbors like generate_trial_balance, generate_report, or audit_standard_book, so the sibling distinction is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives input guidance (use a transfer handle for a full book, inline `book` only for a small one) and clarifies admission rules, but never says when this tool is the right choice versus generate_trial_balance or generate_report, nor any exclusions. Usage is implied by the input shape rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_review_itemsResolve or prepare resolution for review itemsAIdempotentInspect
Resolves current review findings by their closed choices: each decision names a review_item_id (or its ref, such as R-0033) from list_review_items and one of its listed choice_ids. The only closed choice today is dismiss, on chart-posting attention items — it records the actor and reason as a dismissal beside the chart's judgment, which stays as it was, and closes the item. Findings that state a missing fact — an unidentified endpoint, an unverified opening balance, a payment whose paying account no statement shows — carry no choices: they resolve when the fact they name is fixed, and a decision naming them returns outcome not_resolvable_here. Every decision gets an outcome, and exact replay of idempotency_key returns the outcomes recorded at first execution. Durable review mutation; not metered. Not a Task.
| Name | Required | Description | Default |
|---|---|---|---|
| actor | Yes | Accountable actor for this resolution. | |
| decisions | Yes | One or more closed review decisions: each names a review_item_id from list_review_items and one of its listed choice_ids, with an optional reason. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| idempotency_key | Yes | Required. Exact replay returns the recorded outcomes; the same key with different arguments is idempotency_conflict. |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | review_items_resolved on success. |
| outcomes | Yes | One outcome per decision, in decision order. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) it discloses the actual mutation semantics: the dismissal is recorded beside the chart's judgment, 'which stays as it was,' and the item is closed — telling the agent exactly what changes and what is preserved. It also states per-decision outcomes, replay behavior for idempotency_key, and that the operation is durable and not metered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its constraints are front-loaded in the first sentences, and the closing fragments ('Durable review mutation; not metered. Not a Task.') do useful disambiguation work. The middle sentence is long and packs three parenthetical examples, which is dense but still readable and earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained; the description still covers the outcome vocabulary (not_resolvable_here, idempotency_conflict) and the mutation's effect. For a 4-parameter mutation with idempotency requirements, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: review_item_id accepts the printed id or a ref like R-0033, choice_id is limited to the item's listed choices, and reason is what gets recorded beside the actor. It does not add anything for workspace_tag or the conflict case beyond what the schema already says, keeping it just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resolves current review findings by their closed choices') and immediately grounds the resource in its source, list_review_items. An agent can tell this apart from the read-only listing sibling and from Task tools, which the description explicitly excludes ('Not a Task').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the precondition (item must carry a listed choice_id), the only currently available choice (dismiss on chart-posting items), and what to do instead for findings without choices ('they resolve when the fact they name is fixed'), including the exact failure signal not_resolvable_here. That is explicit when/when-not guidance with the alternative path spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_statusService statusARead-onlyIdempotentInspect
Returns this service's build identity, protocol posture, component and migration health, and the current public-surface hash. No workspace. Use it at startup and retain surface.surface_hash — surface.announced_surface_hash pins that descriptor hash to the newest curated release note and must match. A later result from any tool carrying a different hash or a surface_notice means the cached catalog is stale: call tools/list again. Echoing the retained hash on later calls as _meta["ai.finstat/surface-hash"] gets a precise stale or current answer. recent_changes is the current window only, in current public names. status is healthy or degraded; degraded is a successful result, not a failed call. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | Yes | Stamped engine build/version identity for the service_status result. |
| server | Yes | |
| status | Yes | degraded is a successful result, not a failed call. |
| surface | Yes | |
| protocol | Yes | |
| components | Yes | Per-component health, keyed by component name. |
| migrations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that results are unmetered, that 'degraded' is a successful result rather than an error, that recent_changes covers the current window only, and it spells out the surface-hash staleness protocol including the _meta echo key. This is exactly the behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Return values are front-loaded and each sentence carries distinct information about the hash contract or status semantics. It runs long and mixes two topics (what it returns vs. the hash-caching protocol), but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still supplies the interpretive layer an agent needs: what 'degraded' means, what the hash is for, and how staleness propagates across other tools. Nothing essential to calling or interpreting it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which sets the baseline at 4. The description even documents a protocol-level input mechanism (_meta["ai.finstat/surface-hash"]) not represented in the empty schema, adding meaning rather than duplicating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise, enumerated statement of what the call returns (build identity, protocol posture, component/migration health, public-surface hash) rather than restating the name. It also scopes it explicitly with 'No workspace', which separates it from the workspace-scoped siblings that dominate the tool list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('Use it at startup'), a follow-up action ('call tools/list again' when a hash mismatch or surface_notice appears), and the echo mechanism for later calls. It does not explicitly contrast with the closest-looking sibling, inspect_mcp_connection, so an agent must infer which diagnostics tool to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submitSubmit registered documentsAIdempotentInspect
Processes registered documents as one durable FinStat Task: the statements and workspace declarations named in documents (an array of registered_document_id, or "all", the default, for every one not yet submitted, oldest first, at most 100 per call). Processing founds the parties and accounts and derives the events; it posts to no chart: post_chart_accounts does. Submit in sets to keep control: January's statements, check, then the next set. Naming a chart, a journal-entry declaration or a retirement is refused with a pointer to post_chart_accounts (not_submittable), as is a set with nothing left to submit. A returned taskId proves admission, not settlement; persist it and poll tasks_get at pollIntervalMs. Submitting the same set again replays its outcome. list_submissions recovers a lost taskId. Metered: processing runs the workspace's identity and event work, which bills to the workspace owner.
| Name | Required | Description | Default |
|---|---|---|---|
| documents | No | Registered statements and workspace declarations to process: an array of registered_document_id, one id, or "all" (the default) for every one not yet submitted. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false) and idempotency, and the description adds value beyond them: 'A returned taskId proves admission, not settlement; persist it and poll tasks_get at pollIntervalMs' discloses the async lifecycle, and 'Submitting the same set again replays its outcome' explains the idempotent behavior rather than merely restating the hint. It also flags metering ('bills to the workspace owner') and a recovery path (list_submissions) — exactly the operational context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the post_chart_accounts exclusion, then lifecycle and billing details in descending priority. It is a single dense block with some compressed clauses (the refusal sentence in particular), but essentially every sentence carries distinct operational information rather than restating structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still covers the one return fact an agent must act on — taskId is admission, not settlement, and must be persisted and polled. Combined with refusal cases, idempotent replay, and billing, nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema alone would justify a baseline 3. The description goes further, adding selection order ('oldest first'), the batch cap ('at most 100 per call'), and the precise meaning of the 'all' default ('every one not yet submitted') — semantics an agent needs that the schema's const/enum shape does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Processes registered documents as one durable FinStat Task.' It immediately delimits what this does not do ('it posts to no chart: post_chart_accounts does'), so an agent can separate it from the sibling that actually posts to a chart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance ('Submit in sets to keep control: January's statements, check, then the next set') and explicit when-not guidance ('Naming a chart, a journal-entry declaration or a retirement is refused with a pointer to post_chart_accounts (not_submittable), as is a set with nothing left to submit'). It names the alternative tool and the exact condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_support_ticketSubmit support ticketARead-onlyIdempotentInspect
Files one durable support ticket for this workspace. A ticket can never arrive naked: attach report_id from a validation run already in hand, or omit it and FinStat runs the cheap workspace diagnostic at submit — one read, seconds, no model — and attaches that report. Reports speak public vocabulary: named checks, counts, the engine build stamp, and the surface hash, and they are yours to share. The same idempotency_key returns the ticket it already filed. Answers appear on the ticket in list_support_tickets. Durable mutation; not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The full report, at most 8000 characters: what was expected, what was observed, ids involved. | |
| summary | Yes | One line, at most 200 characters: what is wrong or what is being asked. | |
| report_id | No | Optional: a validation report already produced in this workspace (vr_...). Omitted or unknown, FinStat runs the automatic diagnostic and attaches that instead. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| idempotency_key | Yes | Required. The same key returns the ticket it already filed, whatever the other arguments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | open until answered. |
| answer | No | Present once support has answered. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| report | Yes | |
| status | Yes | support_ticket_submitted on success. |
| summary | Yes | The filed one-line summary, echoed. |
| ticket_id | Yes | Durable public ticket handle (tk_...). |
| created_at | Yes | When the ticket was filed. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly calls this a "Durable mutation" that files a ticket, while annotations declare readOnlyHint=true. That is a direct conflict about whether the call writes state, and an agent relying on the annotation would badly misjudge the operation. The otherwise useful details (idempotency, one-read diagnostic cost, no model call) cannot offset a contradiction on the core read/write character of the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence, then handles report attachment, idempotency, and where answers appear in order of decision importance. Some flavor ("can never arrive naked", "Reports speak public vocabulary") adds tone without adding facts, which keeps it just short of maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter write with an output schema, the description covers the decision-relevant unknowns: diagnostic fallback behavior, idempotency semantics, durability, and cost. The one thing it gets wrong is the read/write characterization relative to annotations, which is a correctness problem rather than a coverage gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds meaning by explaining the report_id fallback in cost terms (one read, seconds, no model) and by stating that the same idempotency_key returns the prior ticket regardless of other arguments. It does not add format or length guidance for summary/body, but those are already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource - "Files one durable support ticket for this workspace" - and immediately disambiguates the read sibling by noting answers appear on the ticket in list_support_tickets. An agent can tell what this does and where the result surfaces without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear operational rule: attach an existing report_id, or omit it and the cheap workspace diagnostic runs at submit. That is real when/how guidance for the branch the agent must decide. It stops short of naming exclusion cases (e.g., when to prefer the sibling 'submit' tool instead), so it is clear context rather than a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_getGet FinStat TaskARead-onlyIdempotentInspect
Returns the current state of a durable FinStat Task without waiting, by the taskId an accepted submit or create_standard_statements returned. A completed submission includes its receipt; completed Standard creation includes fresh expiring Standard Statement handles. A submit Task none of whose work has moved for 6 hours ends as failed; its error says why and carries the receipt, and accepted documents stay. The taskId survives disconnects and does not expire independently of the workspace. This is FinStat's ordinary-client poll; hosts with the native Tasks extension poll tasks/get instead. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful context beyond the readOnly/idempotent annotations: what a completed task returns (receipt, fresh expiring Standard Statement handles), the 6-hour inactivity timeout and its failure semantics including that accepted documents persist, and that the taskId survives disconnects. It does not describe the terminal-state set or what a still-running response looks like, leaving a small gap; the output schema carries most of the return-shape burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scoping, then layers lifecycle and failure semantics, ending with read-only/metering. Dense but each sentence earns its place; the mention of the native Tasks extension is a slightly tangential aside, though it does legitimately redirect misrouted hosts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param poll tool with an output schema and covering annotations, the description supplies everything an agent needs: how to obtain the id, what completed states return, failure timeout semantics, and where the operation sits relative to alternatives. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only constrains taskId as a 1-255 char string. The description compensates meaningfully by stating where the taskId comes from (an accepted submit or create_standard_statements) and its lifetime (survives disconnects, doesn't expire independently of the workspace), which is real added meaning. It still does not state the format or whether other task types share the id space, so baseline-plus rather than full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the current state of a durable FinStat Task'), names the non-blocking scope, and identifies the producing siblings (submit, create_standard_statements) that supply the taskId. An agent can immediately tell this is a poll-by-id tool rather than a wait tool or a list tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly distinguishes itself from two alternatives: wait_for_workspace_idle/submit-style blocking behavior is implied by 'without waiting', and the description names tasks/get for hosts with the native Tasks extension. It also names the prerequisite (taskId from an accepted submit or create_standard_statements) so the agent knows the call ordering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_standard_chartUpdate Standard ChartARead-onlyInspect
Proposes the next version of one installed chart (chart_id, required), conformed to the workspace's data: the repair for a chart_exception. It returns the version sealed, for review, like create_standard_chart, and installs and posts nothing. Register it: it keeps the chart's chart_id; post_chart_accounts on that chart_id then installs it as the next version (refused there unless add-only) and posts it. Claims that bind nothing or bind an account no register statement in the workspace is about are dropped. Each owned account with movements that no claim binds is bound to the unclaimed chart account it is, judged by the model when the chart has a candidate on that side, or to a new account beside the chart's other bank, card and loan accounts. Nothing else changes: every node and account is carried over. A chart that is already compatible is left as it is (chart_compatible). The exceptions the version would still raise (an owner that is not a party) come back with it. Posting the new version judges again only the events on the accounts it bound or unbound; every other judgment stands, with no model. Metered only when the model is asked.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_id | Yes | The installed chart to update. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| bound | Yes | Owned accounts bound: designator, account_type, chart_account_id (null when a new account was added) and how (matched or added). |
| chart | No | The proposed version's sealed chart, for review and register (chart_update_ready only). Nothing is installed. |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | chart_update_ready or chart_compatible. |
| chart_id | Yes | The chart, which keeps its id: register the version and post this chart_id. |
| exceptions | No | The chart exceptions the version would still raise (chart_update_ready only). |
| llm_called | Yes | Whether the model was asked to match accounts. |
| content_hash | No | The proposed version's content hash (chart_update_ready only). |
| next_actions | No | What to call next: register the chart, then post_chart_accounts. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| dropped_claims | Yes | Claims dropped: they bound nothing or bound an account no register statement in the workspace is about. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Rich disclosure beyond the annotations: 'installs and posts nothing', returns the version sealed for review, every node and account is carried over, unbound-movement claims are dropped, residual exceptions come back with the result, posting re-judges only accounts bound or unbound, and it is 'Metered only when the model is asked'. The one residual ambiguity is whether the proposed version is persisted anywhere, given the name says 'update' while readOnlyHint=true and the description says nothing is installed - a small gap rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in sentence one, and most sentences carry non-redundant information, so it is not padded. But it is a single unbroken block of ~9 clauses-heavy sentences with opaque constructions ('Claims that bind nothing or bind an account no register statement in the workspace is about are dropped'), which slows an agent parsing the operating rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a model-backed proposal tool with an output schema and full annotation coverage, this covers what an agent needs: what it does and does not mutate, the identity preservation, the claim-dropping rules, the compatible no-op outcome, the exceptions returned, the metering trigger, and the exact next step. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented and a 3 is the baseline. The description adds only marginal semantics: that chart_id identifies the installed chart and is preserved across versions, and that workspace refers to the active workspace. No format, constraint, or failure-mode detail for either parameter appears in the prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource with scope: 'Proposes the next version of one installed chart (chart_id, required)', and it frames the tool as the repair path for a chart_exception. It also distinguishes itself from create_standard_chart ('like create_standard_chart') and from post_chart_accounts. Clarity is only slightly undercut by domain jargon ('sealed for review', 'claims') that a new agent must decode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the triggering situation (repairing a chart_exception on an installed chart) and names the exact follow-up tool and condition: 'post_chart_accounts on that chart_id then installs it as the next version (refused there unless add-only) and posts it.' It also notes the no-op case ('A chart that is already compatible is left as it is'). There is no explicit statement of when NOT to use it or how to choose versus re-creating the chart, which keeps it short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_standard_documentVerify Standard DocumentARead-onlyIdempotentInspect
Authenticates one Standard Statement, Standard Chart, Standard Declaration, or Standard Books document named by its transfer handle, verifies content identity, re-derives its form laws, and returns bounded routing and identity facts rather than the canonical body. Invalid document bytes are a normal standard_document_rejected verdict, not a tool error; a document sealed under an older format is rejected and must be resealed. open_standard_document returns the reviewable body; register admits. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | Server-side transfer handle (download:<id> / upload:<id>) naming the standard document. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return); scopes authorization and transfer storage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| books | No | |
| chart | No | |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| errors | No | Verification errors (rejected only). |
| handle | Yes | The verified artifact's transfer handle, echoed. |
| status | Yes | standard_document_verified or standard_document_rejected — the closed verification verdict. |
| verified | Yes | True only when the artifact's integrity and authenticity checks passed. |
| error_code | No | Machine error code (rejected only). |
| statements | No | The protected statement's routing identity (verified Standard Statement only). |
| declaration | No | |
| document_kind | No | standard_statement, standard_chart, standard_declaration, or standard_books (verified only). |
| workspace_tag | Yes | Workspace scoped by the tool call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides critical operational behavior beyond annotations, detailing specific error outcomes like 'standard_document_rejected' for invalid bytes or older formats. It also includes non-functional information such as 'not metered.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and highly efficient. It front-loads the primary function while dedicating the remainder of the text to necessary caveats and comparative guidance without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% parameter coverage and robust annotations covering safety and idempotency, the description provides all necessary operational context, including failure modes and tool comparison, resulting in a complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds valuable functional context by explaining that the 'workspace_tag' scopes authorization and that the 'handle' is a server-side transfer name. This provides meaning beyond simple data types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is highly specific, naming the types of documents handled (Statement, Chart, Declaration, Books) and clearly stating the function: authenticates, verifies content identity, and re-derives form laws.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly differentiates itself from a sibling tool by contrasting the return value (bounded routing facts vs. canonical body) of 'open_standard_document,' making the usage context exceptionally clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_workspace_idleWait for workspace processing to become idleARead-onlyIdempotentInspect
Waits until one workspace has no processing queued or running and no submission Task still working, or until timeout_seconds elapses. This is a workspace-wide doorbell after one or more Tasks; it is not Task polling and does not prove that any particular submission succeeded. Another caller's work can keep the workspace busy. A timeout is a normal result — default 30 seconds, maximum 240. Hosts with shorter tool-call windows may request a smaller timeout or poll tasks_get. The tool only observes — it never wakes workers, sends notifications, or changes advisory state. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| poll_millis | No | Optional poll interval in milliseconds; default 1000, range 100..10000. | |
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). | |
| timeout_seconds | No | Optional maximum wait time in seconds; default 30, maximum 240. |
Output Schema
| Name | Required | Description |
|---|---|---|
| idle | No | True when no processing is queued or running and no submission Task is still working (processing_effects_active is 0). |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_idle or workspace_wait_timed_out. |
| blockers | No | Processing blockers, when present. |
| timed_out | No | True when the wait timed out. |
| elapsed_ms | No | Elapsed wait time in milliseconds. |
| workspace_tag | Yes | Workspace scoped by the tool call. |
| processing_effects_active | No | Processing queued or running, plus submission Tasks still working. |
| processing_effects_failed | No | Processing chains that ended in failure; get_workspace_job_summary counts a failure that did not end its chain in totals.failed_unresolved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior. The description adds important behavior beyond annotations: another caller's work can keep the workspace busy, a timeout is normal, the tool only observes, never wakes workers, sends notifications, or changes advisory state, and it is not metered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior, then layers in important caveats about timeout, alternative polling, and side-effect freedom. Despite covering several subtle points, each sentence earns its place by preventing a likely misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, 100% schema coverage, and presence of an output schema, the description provides everything an agent needs: scope, timeout expectations, non-polling distinction, side-effect profile, and alternative approach. No important calling context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already well documented in the schema, including poll interval and timeout ranges. The description reinforces timeout behavior and defaults but does not add meaningful meaning beyond the schema for workspace_tag or poll_millis; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it waits until one workspace has no queued/running processing and no submission Task working, or until timeout. It also explicitly distinguishes this from Task polling and from proving a particular submission succeeded, which an agent can use to separate it from siblings like tasks_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to use it: as a workspace-wide doorbell after one or more Tasks. It says when not to rely on it: it is not Task polling and does not prove submission success. It also names the alternative for hosts with shorter tool-call windows: request a smaller timeout or poll tasks_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_overviewWorkspace overviewARead-onlyIdempotentInspect
Returns one current snapshot of a workspace: identity, admitted documents and statements by form, parties, workspace accounts, events, charts, declarations, journal entries, registered documents waiting for submit or for a chart post, public Tasks still working, internal processing effects, open review items by level (requests leave the books incomplete; notices do not), the charts that cannot post (chart_exception), and whether processing is idle. Counts are facts; the read wakes nothing and implies no correctness verdict. next_actions offers submit when registered documents wait for it, post_chart_accounts when journal entries wait for a post, update_standard_chart for each chart with an exception, then the review queue. Read-only and not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_tag | Yes | Active workspace id (the workspace_tag create_workspace and list_workspaces return). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Workspace name. |
| counts | Yes | |
| engine | Yes | Stamped engine build/version identity for the tool result. |
| status | Yes | workspace_overview. |
| cautions | Yes | Factual cautions only. |
| created_at | Yes | Workspace creation time (ISO-8601). |
| description | No | Optional display prose, present only when stored. |
| next_actions | No | Callable next steps: submit waiting documents, post charts for waiting journal entries, repair each chart with an exception, then the review queue (present only when any applies). |
| workspace_tag | Yes | The workspace, echoed. |
| processing_idle | Yes | True when no processing is queued or running (processing_effects_active is 0). A submission Task can still be working: counts.tasks_working counts those, and wait_for_workspace_idle waits for both. |
| chart_exceptions | Yes | Each active chart that cannot post: chart_id, chart_name, exception_count. update_standard_chart proposes its repair, to register and post. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false, openWorldHint false), and the description adds genuinely new behavior facts: 'the read wakes nothing', 'not metered', and 'implies no correctness verdict' — the last being an important caveat about what the counts mean. It does not discuss cost, size limits, or staleness of the snapshot, but that is a minor residual gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then the enumeration, then behavior caveats, then next_actions — a sensible ordering. The middle enumeration is a long run-on clause; each item is defensible as scope disclosure, but the list is dense enough that it could be trimmed slightly without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-shape explanation is unnecessary, and the description still covers what is included, what the counts mean semantically, mutation/side-effect profile, and the recommended follow-up calls. A reader still has to infer ordering/consistency guarantees within the snapshot, which keeps it below top marks for a tool this broad.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (workspace_tag) and schema description coverage is 100%, with the schema itself explaining it is the active workspace id returned by create_workspace and list_workspaces. The description adds no format, validation, or error semantics for it, so this sits at the baseline 3 where the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one current snapshot of a workspace') and then enumerates exactly which resources the snapshot aggregates: documents and statements by form, parties, accounts, events, charts, declarations, journal entries, review items. That enumeration makes the aggregation scope distinguishable from the single-resource list_* siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong downstream routing via next_actions ('submit when registered documents wait', 'post_chart_accounts when journal entries wait for a post', 'update_standard_chart for each chart with an exception, then the review queue'), and the review-level note 'requests leave the books incomplete; notices do not' is real decision guidance. It stops short of explicitly saying when to prefer this aggregation over calling list_review_items / list_charts / list_parties individually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
59 tool updates
- First observed
audit_standard_book - First observed
check_data_channel - First observed
compare_standard_books - First observed
create_book_snapshot - First observed
create_download_sessions - First observed
create_standard_book - First observed
create_standard_chart - First observed
create_standard_declaration_chart - First observed
create_standard_declaration_workspace - First observed
create_standard_statements - First observed
create_upload_sessions - First observed
create_view_link - First observed
create_workspace - First observed
demo - First observed
examples - First observed
export_standard_statement - First observed
generate_balance_sheet - First observed
generate_profit_and_loss - First observed
generate_report - First observed
generate_trial_balance - First observed
get_declaration - First observed
get_party_profile - First observed
get_started - First observed
get_workspace_job_summary - First observed
guide_canonical_schema - First observed
guide_glossary - First observed
guide_tasks - First observed
inspect_mcp_connection - First observed
invert_standard_book - First observed
list_book_snapshots - First observed
list_chart_accounts - First observed
list_charts - First observed
list_declarations - First observed
list_events - First observed
list_parties - First observed
list_review_items - First observed
list_source_documents - First observed
list_statements - First observed
list_submissions - First observed
list_support_tickets - First observed
list_transfer_sessions - First observed
list_workspace_account_activity - First observed
list_workspace_accounts - First observed
list_workspaces - First observed
open_standard_document - First observed
post_chart_accounts - First observed
register - First observed
render_chart_numbers - First observed
render_standard_statement - First observed
report_standard_book - First observed
resolve_review_items - First observed
service_status - First observed
submit - First observed
submit_support_ticket - First observed
tasks_get - First observed
update_standard_chart - First observed
verify_standard_document - First observed
wait_for_workspace_idle - First observed
workspace_overview
Publisher details
- Operator
- Finstat Inc. · Publisher source
- Operator website
- https://www.finstat.ai · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://youtu.be/cN6EZu9Y9qY · Publisher source
- Trust center
- https://finstat.ai/privacy · Publisher source
- Restrictions
- Requires a free FinStat account (sign in with Google or email). First 1,000,000 tokens free, then pay per use; no subscription. Needs an AI host that can reach files on your computer (Grok Bot, Claude Code, Codex, Cursor, or Claude Desktop with Cowork).
Related MCP Connectors
Double entry accounting run by your own AI: books, VAT figures, invoices, month close (UK, DE, AT).
A double-entry ledger built from your invoices, bank lines, expenses, deposits and assets.
Turn bank statement PDFs into categorized, balance-checked transactions and reports.
Double-entry bookkeeping: accounts, journal entries, bank feeds, reconciliation, and reports.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables parsing of structured financial receipts, invoices, and bank statements, tolerance-based three-way reconciliation, detection of tax calculation drift and duplicate claims, and synthesis of double-entry bookkeeping journal entries.MIT

Ekwo OS — open sourceofficial
AlicenseNot gradedqualityAmaintenanceDouble-entry books an agent keeps as the user, on your own Postgres or Supabase: invoices, VAT returns, bank reconciliation, financial statements and 130 country packs.41AGPL 3.0- AlicenseAqualityBmaintenanceAI agents that automate bookkeeping, bank reconciliation, and month-end financial close for SMBs and CA firms.261MIT
- FlicenseBqualityBmaintenanceEnables AI assistants to perform financial reconciliation with a deterministic proof engine: intake files, match transactions, verify proofs, resolve exceptions, and sign off on balanced journals under the user's authority.21-
Glama MCP Gateway
Add one secure layer between your agents and this server.