Skip to main content
Glama

Server Details

stub

Super simple AI Native accounting platform

dext equivalent

Ownership verified
Status
Healthy
Uptime
81.6% over 81 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
stub

TDQS

B3.2/5.0

Scored across 174 tools

Disambiguation2/5

The set contains many near-overlapping tools whose boundaries depend on long prose rather than clean semantics: save_income vs create_income_expenses_bulk vs save_expense vs record_document_payment vs settle_bills, list_documents vs list_invoices, and evaluate_report vs evaluate_report_session vs evaluate_report_batch. Tax tools alone span add_entity_salestax, add_entity_salestaxes, add_salestax_to_entities, add_document_item_salestax and three update variants. The descriptions disambiguate well in text, but at 174 tools an agent will frequently pick the wrong one.

Naming Consistency3/5

Most names follow snake_case verb_noun, which is readable. However verbs are inconsistent: get_* vs list_* for reads, and both save_* and create_*/update_* for writes, with save_ meaning create-or-update depending on an id argument. A few names break pattern entirely (cortex_profile, hand_over, open_destination, set_todos).

Tool Count1/5

174 tools is far beyond the 3-15 range and far past what an agent can hold in working context, causing persistent misselection. Many near-duplicate singles/bulks exist only because the surface is so large. This is an extreme mismatch for any single purpose.

Completeness4/5

The domain is a full accounting/payroll suite and coverage is genuinely broad: documents, expenses, income, journals, payroll, leave, assets, loans, taxes, tags, files, reports, dashboards and support handoff all have read/write/lifecycle tools. Minor gaps remain (no delete_account or delete_bank_account, no list_messages), but these are workarounds rather than dead ends.

Available Tools

174 tools
add_dashboard_tileAdd dashboard tileCInspect

Add one tile to a dashboard.

NameRequiredDescriptionDefault
tileYes{type, id?, x?, y?, w?, h?, title?, …config}. Config left out takes the type's default; left without x and y, the tile goes on a new row at the bottom.
dashboardIdYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the additive, non-destructive nature is covered structurally. The description adds nothing beyond that: it doesn't say placement behavior, whether the call returns the created tile or its coordinates, or whether a duplicate tile of the same type is rejected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence with zero redundancy, so there is no padding to cut. The problem is the opposite of verbosity: the sentence is sized far below what a mutation tool with a nested payload object needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with a free-form nested `tile` object, no output schema, and only 50% parameter coverage, the definition should explain where valid tile types come from and what the call yields. None of that is present, so an agent must call it largely blind.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the `tile` property carries a genuinely rich description covering defaults and the new-row-at-bottom fallback, but `dashboardId` is documented nowhere. The description neither compensates for that gap nor adds any constraint or format hint beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Add one tile to a dashboard" gives a verb and resource, so the basic action is identifiable, and "one" signals singular-per-call. But it is essentially the tool name and title restated, and it draws no line against update_dashboard_tile, remove_dashboard_tile, create_dashboard, or list_dashboard_tile_types, all of which live in the same sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance at all: nothing says when to add versus update an existing tile, whether a tile type must first be discovered via list_dashboard_tile_types, or whether the dashboard must already exist. An agent has to infer the workflow entirely from the tool list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_document_item_salestaxAdd document item salestaxAInspect

Add a sales-tax (VAT) line to a single line item on a document (invoice, quote, credit note, debit note). Identify the document item by its id. Pairs with update_document_item_salestax.

NameRequiredDescriptionDefault
idNoSales-tax line id. On update, identifies which sales-tax to change (or pass :salestaxid); omit on add.
nameNoSales-tax name (e.g. "VAT").
rateNoSales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected.
amountNoFixed sales-tax amount, used instead of :rate when :useamount is true.
itemidNoId of the document line item this sales-tax attaches to. On update, if :id/:salestaxid are omitted and the item has exactly one sales-tax, it is resolved from here.
invoiceNoAlias for the parent document id (see :quinvoice).
parentidNoId of the business's own sales-tax definition this line applies (see get_business_profile salestaxes). On add, when omitted, the definition is matched by name, then by rate when exactly one definition has that rate. If several match, the call is refused and lists their ids; pass one as parentid. A 0 rate with no name match stays unlinked.
exclusiveNoWhether the tax is exclusive (added on top of the line amount) rather than inclusive (already contained in it).
invoiceidNoAlias for the parent document id (see :quinvoice); takes precedence when several are supplied.
quinvoiceNoId of the parent document (invoice, quote, credit/debit note). Used to reindex the correct document; aliased by :invoice / :invoiceid.
useamountNoUse the fixed :amount instead of computing tax from :rate.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
salestaxidNoId of the sales-tax to update (alternative to :id).
recoverableNoWhether this input sales tax / VAT is recoverable.
referencenumberNoSales-tax registration / reference number.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the additive, non-destructive nature is already structured. The description adds only that the line attaches to an existing document item identified by id, and repeats no permission, resolution, or failure behavior that the schema doesn't already spell out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and the attachment scoping, then the sibling relationship. No filler and every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter, zero-required mutation tool with no output schema, the description is thin: it doesn't explain what is returned or what happens when the parentid match is ambiguous (that lives only in the schema), nor does it warn that omitting the document id would fail. The rich schema and annotations carry most of the load, leaving this adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 15 parameters including the tricky resolution rules for parentid, the decimal-fraction rate, and the invoice/invoiceid/quinvoice aliases are documented in the schema. The description adds only the item-id lookup hint, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (Add) plus the resource (a sales-tax/VAT line) and the exact attachment target (a single line item on an invoice/quote/credit/debit note). It explicitly names the complementary sibling update_document_item_salestax, so an agent can separate the two 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Pairs with update_document_item_salestax" tells the agent this is the create-side of the salestax-line pair and that update is the alternative for existing lines. It gives clear context but no explicit exclusions or comparison against the other tax siblings such as add_entity_salestax.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_document_lineAdd document lineAInspect

Add ONE new line to an EXISTING document (invoice, quote, bill and so on); to create the document itself use save_document, and to change a line already on it use update_document_item.

NameRequiredDescriptionDefault
idNoLine item id. Required on update_document_item; omit on add_document_line.
costNoUnit cost (for margin / cost-of-sales), in :costcurrency.
nameNoLine item name / title.
sortNoDisplay order of the line within the document (ascending).
unitNoUnit label for the quantity (e.g. "hours", "kg").
priceNoUnit price (per-unit selling price) in the document currency.
amountNoLine total (unit price × quantity), usually derived from :price × :quantity. Accepts a number or a numeric string.
expenseNoPass "$delete" to unlink the expense this line recovers; the line keeps its name, account and amount. Rebilling is add-only, so any other value is refused.
productNoId of a catalog product to link this line to.
variantNoId of a catalog product variant to link this line to.
quantityNoNumber of units. Accepts a number or a numeric string.
accountidNoPer-line chart-of-accounts / expense-category id; bills split cost by category at accrual (see list_accounts).
expenseidNoRecover this expense's cost on a sales invoice, order or pro-forma (quinvoice or contract id). The expense is copied onto the line once: its name, its category account (the line credits that account, not Sales; an uncategorised expense books to the document's income account, Sales by default) and its amount. A VAT-registered business bills the net amount plus its own output VAT; otherwise the gross amount, untaxed. Later edits to the expense do not change the line. Recovering an expense that is already on a live document is allowed: the response's billedon lists the live documents that already recovered it before this add (this document too, when it is already on another of its lines), so the caller can warn.
quinvoiceNoId of the parent document (invoice, quote, bill, etc.) this line belongs to.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
descriptionNoLine item description.
costcurrencyNoISO 4217 currency of :cost, when it differs from the document currency.
baseupdatedatNoOptimistic-concurrency token: the line's last-known updatedat (epoch number or ISO string). A stale value is rejected; omit to skip the check.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only but non-destructive write, so the safety profile is covered. The description adds the meaningful constraint that the parent document must already exist and that only one line is added per call, but leaves the richer behavioral details (expense copying, VAT treatment, billedon warnings, optimistic concurrency) to the schema's own parameter text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the core action front-loaded followed by the two disambiguating alternatives. Every clause earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation with no required fields and no output schema, the description supplies the routing and scope an agent needs, and the schema documents every parameter. It stops just short of flagging the mutation's side effects or which parameters matter for common cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 18 parameters, so the schema already carries naming, currency, id and concurrency semantics. The description contributes no additional parameter meaning, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource (add ONE line to an EXISTING document) and names the document types it applies to. It also explicitly distinguishes itself from save_document and update_document_item, so the agent can route without inspecting sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use plus two named alternatives with the condition that selects each: save_document for creating the document, update_document_item for modifying an existing line. Nothing 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.

add_entity_salestaxAdd entity salestaxAInspect

Add a sales tax to an entity. To add several taxes at once, prefer add_entity_salestaxes.

NameRequiredDescriptionDefault
kindNo"salestax" | "levy" | "withholding"; blank means salestax.
nameNoDisplay name of the sales tax (e.g. "VAT").
rateNoSales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected.
orderNoStack position (default 0); components apply ascending.
amountNoExplicit sales tax amount; used instead of the rate when useamount is true.
entityYesEntity kind to add the sales tax to, e.g. "expense", "invoice".
compoundNoWhen true, this tax stacks on lower-order taxes' totals (default false).
entityidYesId of the entity to add the sales tax to.
parentidNoId of an existing salestax definition to link, instead of defining one inline.
exclusiveNoWhether the entity amount excludes this sales tax (tax added on top).
taxsourceNoStable locale rate-band identity, e.g. "locale:za/standard".
treatmentNo"standard" | "zeroRated" | "exempt"; blank/unknown means infer.
useamountNoWhen true, use amount as the tax figure instead of computing from the rate.
recoverableNoWhether this sales tax is recoverable (claimable as input tax).
referencenumberNoSales tax registration/reference number.

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a write operation (readOnlyHint=false, destructiveHint=false), but the description adds no behavioral context beyond the action itself. No mention of side effects, prerequisites, or how the addition affects existing tax calculations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loading the primary purpose and then providing a concise usage alternative. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-add tool with a rich schema and clear sibling distinction, the description is sufficient. It states the purpose and usage guidance; the schema covers parameters. A slightly more detailed behavioral note would be nice, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter description coverage, so the description does not need to explain parameters. The baseline of 3 applies; the description adds no extra meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action: 'Add a sales tax to an entity.' The verb 'add' and resource 'sales tax' are specific, and the mention of the plural sibling add_entity_salestaxes distinguishes it from the batch operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly guides when to use this tool vs. the alternative: 'To add several taxes at once, prefer add_entity_salestaxes.' This tells the agent to use this tool for a single tax addition, which is a clear usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_entity_salestaxesAdd entity salestaxesAInspect

Add several sales taxes to one entity by their ids, in a single transaction. Each id is copied onto the entity as a fresh tax instance; the tool does not deduplicate, so passing a tax already present (or the same id twice) adds another copy. If the target entity no longer exists it returns an {:error true} map rather than throwing. To add a single tax to one entity use add_entity_salestax; to apply one existing tax across many entities use add_salestax_to_entities.

NameRequiredDescriptionDefault
entityYesEntity kind to add sales taxes to, e.g. "expense", "invoice".
taxidsYesIds of existing salestax definitions to attach to the entity.
entityidYesId of the entity to add sales taxes to.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes non-deduplication ('does not deduplicate... adds another copy') and error behavior ('returns an {:error true} map rather than throwing'), providing useful insights not present in the sparse annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying essential information with no filler: purpose, deduplication behavior, error handling, and alternatives.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers core behavior, edge cases (duplicate ids, missing entity), and alternative routes, but does not specify the success return value; however, no output schema is provided, so this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions fully cover all three parameters (entity, entityid, taxids) with clear meanings; the tool description adds no extra parameter detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it adds multiple sales taxes to one entity by their ids, and distinguishes from sibling tools (add_entity_salestax for a single tax, add_salestax_to_entities for applying one tax across many entities).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternative tools and when to use them: 'To add a single tax to one entity use add_entity_salestax; to apply one existing tax across many entities use add_salestax_to_entities.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_journal_lineAdd journal lineAInspect

Add ONE debit or credit line to an EXISTING journal entry; to create a whole new entry use save_journal_entry, and to change a line already there use update_journal_line.

NameRequiredDescriptionDefault
idNoLine id (for updating an existing line).
roleNoOptional line role: what the amount is (e.g. sars-3601), set by the producer. Lowercase letters, digits and hyphens, at most 64 characters. Send "$delete" to clear it; omit it to leave it alone.
debitNoDebit amount for this line (0 if this is a credit line).
creditNoCredit amount for this line (0 if this is a debit line).
entryidNoId of the parent journal entry this line belongs to.
clientidNoPROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send "$delete" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.
accountidNoChart-of-accounts account id for this line (see list_accounts).
supplieridNoPROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send "$delete" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only but non-destructive mutation, and the description usefully clarifies that it appends a single line rather than replacing anything. It says nothing about preconditions an agent would care about though — whether the parent entry must be in an open/unlocked period, what happens if the entry does not exist, or whether debit/credit must balance at line level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded clause establishes the operation and its scope, then the same sentence names both alternatives — no wasted words and no burying of the key constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an eight-parameter tool with zero required parameters, the description never indicates the minimum viable call (entryid plus accountid plus one of debit/credit), which is a real risk of a malformed invocation. It is otherwise complete given full schema coverage and the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already explains all eight fields in detail, including the $delete sentinel and the clientid/supplierid mutual exclusion. The description only implies that a line carries a debit or credit amount; baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (add ONE debit or credit line) plus a hard scope constraint (to an EXISTING journal entry), which immediately separates it from entry-creation and line-editing siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to save_journal_entry for a whole new entry and update_journal_line for changing an existing line, so the when-to-use and when-not-to-use conditions are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_salestax_to_entitiesAdd salestax to entitiesAInspect

Apply one existing sales tax to several income or expense records at once, in a single transaction. Invoices/bills use line-item tax and are not supported here.

NameRequiredDescriptionDefault
entityYesEntity kind to add the sales tax to: "income" or "expense".
parentidYesId of the existing salestax definition to apply to every listed entity.
entityidsYesIds of the income/expense records to add the sales tax to.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a write operation with no destructive intent. The description adds that it works as a single transaction and applies an existing tax definition, but it does not disclose potential side effects such as overwriting existing tax assignments or partial failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, uses only two sentences, and front-loads the core purpose. Every clause adds relevant information, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple bulk update tool, the description provides sufficient context: what it does, what it applies to, and what it does not support. No output schema is present, so return-value details are not required, though a note on success/failure behavior could make it slightly more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions fully cover all three parameters with clear meanings. The tool description mostly restates the schema rather than adding new semantic detail, such as constraints on tax IDs or behavior when multiple entity IDs are invalid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action: applying one existing sales tax to several income or expense records in a single transaction. It also explicitly distinguishes this tool from invoice/bill line-item tax handling, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by specifying that invoices/bills use line-item tax and are not supported here. It implies the appropriate alternative for those cases, though it does not explicitly name a sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attach_fileAttach fileAInspect

Attach a file to an entity (invoice, expense, etc.).

NameRequiredDescriptionDefault
entityYesEntity kind to attach the file to, e.g. "expense", "income", "asset", "transaction", "entry", "client", "supplier", "product". For any document — invoice, quote, credit/debit note, purchase order, bill or goods-received note — use "contract" (its id may start with cont-, inv- or order-); the correct storage attribute is resolved from the id, so a bill (cont-… id) also resolves whether you pass "contract", "bill" or "invoice".
fileidYesId of the uploaded file to attach (see /file/upload).
entityidYesId of the entity to attach the file to.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint=false and destructiveHint=false. The description adds no behavioral details beyond the basic action, such as side effects, error conditions, or return values. It is consistent with the annotations but does not go beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that is concise and well-structured. It avoids unnecessary words and effectively communicates the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple with three required parameters, all described. However, the description omits any mention of output or success/failure feedback, which could be important for an agent to confirm the attachment process. It is adequate but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for all three parameters with clear descriptions. The tool description itself adds no additional parameter semantics, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: attaching a file to an entity, with examples like invoice and expense. It is specific and distinguishes from file-related sibling tools such as list_files or remove_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. It lacks context about prerequisites (e.g., file must be uploaded first) and does not contrast with other file operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_entity_tagsClear entity tagsA
Destructive
Inspect

Clear all tags from an entity.

NameRequiredDescriptionDefault
entityYesEntity kind whose tags to clear, e.g. "expense", "income", "invoice".
entityidYesId of the entity to clear tags from.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide destructiveHint=true, and the description adds the specific destructive scope: it clears all tags from one entity. This goes slightly beyond the annotations but does not disclose additional behaviors such as irreversibility or effects on related data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It communicates the core operation efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema, the description, full parameter descriptions, and destructive annotation are largely sufficient for an agent to select and invoke the tool correctly. It lacks only a brief mention of related set operations or consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both 'entity' and 'entityid' are described with examples. The description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Clear') and resource ('all tags from an entity'), clearly distinguishing it from sibling tools like set_entity_tags or set_entity_tags_bulk. The scope (all tags) is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as set_entity_tags, set_entity_tags_bulk, or delete_tag. The description only states what it does, not when an agent should choose it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_currencyConvert currencyA
Read-only
Inspect

Convert an amount between currencies at the OpenExchangeRates rate for a date (the same dated rate find_candidate_transactions matches with). Returns {amount, from, to, converted, rate, ratedate}; ratedate is the day the rate is for (a future date uses today's). Pass target (an amount in the to currency, e.g. a bill's outstanding balance) to also get within_tolerance: whether the converted amount lands within tolerance of it (a fraction, default and maximum 0.03 = the 3% cross-currency matching band). No rate for that date returns {error true, reason no-rate}. READ-ONLY: it converts, never records anything.

NameRequiredDescriptionDefault
toYesISO currency code to convert into (e.g. ZAR).
dateNoThe date whose rate to use (YYYY-MM-DD). Defaults to today; a future date uses today's rate.
fromYesISO currency code of the amount (e.g. GBP).
amountYesThe amount to convert, in the `from` currency.
targetNoOptional amount in the `to` currency to test the converted amount against (e.g. a bill's outstanding balance).
toleranceNoOptional band for `target`, as a fraction (0.03 = 3%). Must be above 0 and at most 0.03; defaults to 0.03, the cross-currency matching band.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description explicitly states 'READ-ONLY: it converts, never records anything' and details the exact return fields, future-date handling, and the no-rate error shape. This gives an agent a clear behavioral model without needing to call the tool or inspect external docs. There is no contradiction with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph of roughly 100 words, front-loaded with the core action and rate source before optional arguments and edge cases. Every sentence serves a purpose, and the READ-ONLY note, while echoing the annotation, is a useful reinforcement rather than fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description takes on the burden of documenting the return object, and it does so explicitly: amount, from, to, converted, rate, ratedate, and optional within_tolerance. It also covers the no-rate error case, tolerance bounds, and the connection to find_candidate_transactions, so an agent has all information needed to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameters, but the description adds meaningful semantics it does not: target is explained as an amount in the 'to' currency such as a bill's balance, tolerance is tied to the default 3% cross-currency matching band, and within_tolerance behavior is defined. This enriches the parameters beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Convert an amount between currencies at the OpenExchangeRates rate for a date', giving a specific verb, resource, and rate source. It is immediately distinct from sibling tools like find_candidate_transactions and any ambiguity about what action is performed is eliminated. It even specifies the return payload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it uses 'the same dated rate find_candidate_transactions matches with' and explains how the target and tolerance parameters are meant for checking bill balances within the 3% cross-currency matching band. It does not explicitly state when not to use the tool or name a direct alternative, but the context is sufficient for an agent to select it for conversion checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cortex_profileCortex profileA
Read-only
Inspect

Read the business's profile: concrete facts stub has no other field for, such as their accountant, B-BBEE level, CSD number or when their lease ends, each confirmed by the owner. Also lists every key the business uses, so you reuse one rather than name a new one, and common keys still empty. The VAT, registration and payroll numbers are not here: read them with get_business_profile.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds real behavioral context beyond that, notably that the facts are 'each confirmed by the owner' (a data-provenance signal) and that the key list includes 'common keys still empty'. It does not describe the return shape in any structured way, which matters since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the read action, and the exclusion is saved for last as a routing cue. The middle sentence is a run-on that tries to cover two distinct outputs (custom facts and the key list) in one breath, and 'stub has no other field for' costs the reader a re-read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries the burden of explaining what comes back, and it does list the returned content (owner-confirmed facts, all keys used, empty common keys). Naming the excluded fields and where to get them closes the main gap. What is missing is any sense of the shape or size of the fact list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter claims are made.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('Read the business's profile') and grounds it with concrete examples (accountant, B-BBEE level, CSD number, lease end) plus a second function, listing the business's keys. It distinguishes itself from the sibling get_business_profile by explicitly excluding VAT/registration/payroll numbers. The phrasing 'concrete facts stub has no other field for' is awkward jargon that slightly muddies an otherwise clear purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent elsewhere for tax identifiers ('The VAT, registration and payroll numbers are not here: read them with get_business_profile'), which is exactly the kind of alternative-naming that prevents mis-selection. It also gives a rationale for the key listing ('so you reuse one rather than name a new one'). It stops short of a full when-to-use/when-not matrix against the other profile-ish siblings such as get_business_overview.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_accountCreate accountAInspect

Create a new chart-of-accounts ledger account (an income, expense, asset, liability or equity account used to categorise transactions). Not a bank account — for that use create_bank_account.

NameRequiredDescriptionDefault
codeNoThe business's own account code (e.g. "4000"). Trimmed; blank means no code.
iconNoIcon identifier for the account (UI display).
metaNoOpaque metadata string stored on the account.
nameNoAccount name (e.g. "Consulting income", "Rent").
roleNoSemantic reporting role: "tax" (income-tax expense), "taxprovision" (tax provision/liability), or "salestax" (VAT control account). Omit for an ordinary account.
groupNoGroup label the account is organised under in the chart of accounts.
hiddenNoWhether the account is hidden from the chart-of-accounts UI.
deletedNoSoft-delete flag; true hides the account from active use.
journalNoJournal number classifying the account; maps to a standard journal name (e.g. sales, purchases, general).
premiumNoWhether the account is a premium-plan-only account.
primaryNoWhether this is the primary account of its kind.
parentidNoId of the parent account this nests under in the chart-of-accounts tree.
defaultidNoBuilt-in account id this custom account maps to: a number such as "410" or a string such as "za-coida" or "defaultvat".
baseaccountNoWhether this is a base/system account rather than a user-created one.
descriptionNoFree-text description of what the account is used for.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, and the description consistently describes a create operation. It adds useful domain context about chart-of-accounts accounts, but does not disclose validation behavior, duplicate handling, required logical fields, or authorization needs beyond what annotations and schema already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the core action and immediately followed by the sibling disambiguation. Every clause carries useful selection or scoping information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with 15 optional parameters and no output schema, the description supplies enough domain and sibling context to select the tool correctly, while the schema carries the detailed field semantics. It could be stronger with a note about duplicate or empty-account behavior, but it is largely complete for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains all 15 parameters thoroughly. The description adds no parameter-specific semantics beyond naming account categories generally, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: create a chart-of-accounts ledger account, and enumerates the account categories it covers. It also explicitly distinguishes this from create_bank_account, so an agent can select it 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly directs bank-account creation to create_bank_account, which is the most likely sibling confusion. However, it does not say when to create a new account versus update_account or list_accounts, nor does it mention prerequisites such as duplicate-code handling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_assetCreate assetAInspect

Create a new fixed asset — an item of equipment, property or similar that the business owns and depreciates over time. Use when recording a capital purchase you want to depreciate over its useful life rather than expensing outright; link it to the originating purchase via :expense (see list_expenses) so its cost basis flows from the ledger. To amend an existing asset use update_asset; to remove one use delete_asset.

NameRequiredDescriptionDefault
idNoAsset id. Required on update; omit on create.
nameNoName of the asset (e.g. "Delivery van").
notesNoFree-text notes about the asset.
amountNo(Deprecated) legacy purchase value; the asset's cost now derives from its linked expense/transaction, so this is ignored.
incomeNoId of an income record linked to this asset (e.g. proceeds from its disposal).
unlinkNo(Legacy) id of a linked transaction to detach from the asset; prefer the dedicated unlink asset-transaction endpoint.
expenseNoId of the expense record that recorded the asset's purchase (its cost basis).
disposedNoWhether the asset has been disposed of (sold or retired).
accountidNoChart-of-accounts account id categorising this asset (see list_accounts).
usefullifeNoUseful life of the asset in years.
transactionNo(Legacy) id of a bank transaction to associate with the asset; asset↔transaction links are normally managed via the dedicated link/unlink asset-transaction endpoints.
depreciationNoWhether this asset depreciates over time.
disposeddateNoDate the asset was disposed (ISO 8601); defaults to now when :disposed is set without a date.
baseaccountidNoChart-of-accounts account id for the asset's accumulated-depreciation / base account (see list_accounts).
depreciationrateNoAnnual depreciation rate as a decimal fraction (e.g. 0.2 = 20% per year); used by the diminishing-balance method.
depreciationtypeNoDepreciation method: a string containing "straight" (straight-line), "diminish" (reducing/diminishing balance), or "fifty" (50/30/20 wear-and-tear).
depreciationstartNoDate depreciation starts (ISO 8601).
usedefaultdepreciationNoWhether to use the business/category default depreciation settings instead of the values on this asset.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-destructive write, and the description adds transparency by noting that the 'amount' field is ignored and that legacy link fields should be avoided in favor of dedicated endpoints. This gives the agent a realistic expectation of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured paragraph that leads with the core purpose, then gives usage context and clarifies legacy vs. preferred fields. It avoids redundancy and is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description sufficiently covers what the tool does and key behavioral nuances (disposal, depreciation defaults, legacy fields). It doesn't enumerate every parameter, but the schema does, so the combination is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 18 parameters have descriptions in the schema, and many include additional semantic context (e.g., depreciation type examples, default for disposeddate, decimal format for rate). This goes beyond basic parameter listing, helping the agent choose correct values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new fixed asset, elaborates on what qualifies as an asset, and distinguishes it from update/delete operations. It also explains the core behavior of linking to the originating expense for cost basis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use the tool (recording a capital purchase to depreciate) and references alternative endpoints for unlink operations. It could be slightly more explicit about not using it for non-capital expenses, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_bank_accountCreate bank accountAInspect

Create a new bank account for the business (a real account money moves through — used for reconciliation and cashflow). Not a chart-of-accounts ledger account.

NameRequiredDescriptionDefault
idNoID of the bank account, required for updates
bankNoName of the bank
syncNoWhether automatic bank sync is enabled
hiddenNoWhether the account is hidden/soft-deleted (removes its card; also stops sync)
confirmNoPROD-1536: required only to save an opening date that is LATER than the account's own earliest transaction. Without it that one case is refused, unwritten, with code confirm-required plus earliesttransactiondate and transactionsbefore, so the caller can show what the date would exclude and let the user override it.
privateNoWhether this is a private account
syncingNoWhether sync is currently in progress
archivedNoWhether the account is archived
currencyNoISO 4217 code (e.g. "USD") stamped on the new ledger account. Omit for the business's base currency; an unknown code is refused with reason unknown-currency.
accountidNoThe ledger account this bank account settles into. PROD-2612: set it to one of the business's own asset accounts to use that account instead of minting a new one; it must not be a control or built-in account or another bank's, and the request must leave out the opening balance and any other currency. Refused with a link-* reason.
swiftcodeNoSWIFT/BIC code for international transfers
branchcodeNoBank branch code or routing number
accountnameNoName of the bank account
accounttypeNoType of account (e.g., checking, savings)
openingdateNoDate of the opening balance
openingrateNoPROD-2452: for an account in a currency other than the business's, the opening exchange rate as account-currency units per one base unit (21.7821 ZAR per GBP); must be above 0. Omitted, the rate feed's rate on the opening date is used. Ignored for a base-currency account.
syncenabledNoWhether this account is enabled for bank sync
accountnumberNoBank account number
creditaccountNoDefault credit account ID
creditjournalNoDefault credit journal ID
openingbalanceNoOpening balance for the account
clearopeningbalanceNoPROD-1200: when true, fully REMOVE the opening balance — retracts openingbalance, openingdate and the FX opening rate and base value (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish write semantics (readOnlyHint=false, destructiveHint=false), so the description only needs to add context. It does add the useful framing that this is a real bank account used for reconciliation and cashflow, but says nothing about what side effects creation triggers (ledger account minting, opening balance handling) or how the upsert-by-`id` behavior works.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with a disambiguating parenthetical; nothing is wasted and the most important distinction arrives before any detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter creation tool with intricate opening-balance, currency and ledger-linking behavior, the description itself is thin and leaves all of that to the schema. Because the schema is exhaustive and there is no output schema to explain, this is adequate but does nothing to help an agent anticipate the tool's real complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 22 parameters including the complex confirm, accountid, openingrate and clearopeningbalance semantics. The description adds no parameter-level meaning beyond what the schema already provides, which is the baseline 3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a new bank account for the business") and immediately disambiguates it from the nearest confusing sibling by clarifying it is a real money-movement account, not a chart-of-accounts ledger account. An agent can distinguish it from create_account 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The exclusion ("Not a chart-of-accounts ledger account") gives a clear negative-use signal that implicitly routes chart-of-accounts work to create_account. However, no alternative is named explicitly, and nothing says when to use this versus update_bank_account or update_bank_account_currency, despite the schema's `id` param mentioning updates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_clients_bulkCreate clients bulkAInspect

Create many customers from a list, such as a page of rows read with read_file_rows. Up to 100 a call; for a longer list call again with the next page. Partial success: returns {error, message, created: [{line, id, name}], matched: [{line, id, name}], errors: [{line, name, message}]}. A row whose name matches a customer already in stub is matched, not added twice, and fills only blank details. A refused row is listed in errors with the reason and the rest are saved. error is true only when no row was created or matched. Show the entrepreneur a preview and get one confirm before you call it. To change an existing customer use save_client.

NameRequiredDescriptionDefault
itemsYesUp to 100 customers to create, in file order. Partial success: a row that is refused is listed in errors and the rest are saved.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the real burden and does it well: partial success, dedup-by-name matched rather than double-added, blank-field fill-only, per-row refusals isolated in errors, and error=true only when nothing was created or matched. The only gap is that side effects on matched records (which blank details get written) are described only loosely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, batch limit, and the return shape, then behavior, then the confirm requirement, then the alternative. It is dense but every sentence carries a distinct fact; the return-object rendering makes one sentence heavier than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter bulk-write tool with no output schema, the description supplies what is missing: batch ceiling, what the returned object contains, how matched versus created versus refused rows differ, and the human confirmation step. Nothing an agent needs to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the nested row fields are already fully documented. The description adds operational meaning by framing items as file-ordered rows and by explaining that `line` is echoed into results so a refusal can be traced back — useful, but the bulk of parameter meaning already lives in the schema, so baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource plus scope: "Create many customers from a list", and immediately names the sibling workflow it pairs with (read_file_rows) and the sibling it is not (save_client for changes). An agent can distinguish it from list_clients and save_client 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use save_client to change an existing customer, call again with the next page beyond 100 rows, and show a preview plus get one confirm before calling. That is a when-to-use, a when-to-use-differently, and a prerequisite in three sentences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_dashboardCreate dashboardAInspect

Create a custom dashboard, optionally with its tiles.

NameRequiredDescriptionDefault
idNoClient-chosen id; one is made when left out. Sending the same id again replaces that dashboard.
nameYesThe dashboard's name.
tilesNoThe tiles, each {id, type, x, y, w, h, title?, …config}. Read list_dashboard_tile_types for every type's config.
descriptionNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write-but-not-destructive profile is covered. Beyond that the description adds only the optional-tiles capability; it says nothing about response contents (e.g. the created id) or about the overwrite-via-repeated-id behavior, which the schema carries instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single economical sentence with the action and the optional scope front-loaded; there is no filler, hedging, or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, an agent would benefit from knowing what comes back (the dashboard object or its id) and whether tile ids must be unique within the request. The description is accurate but thin relative to the tool's nesting and creation semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema already explains the id overwrite semantics, the name, and the tile shape with a pointer to list_dashboard_tile_types. The description contributes only the word "optionally" for tiles (tiles are indeed not required) and adds no format or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Create a custom dashboard, optionally with its tiles" states a specific verb and resource, and the word "create" cleanly separates it from update_dashboard, get_dashboard, and list_dashboards. It stops short of naming those siblings or clarifying the relationship to add_dashboard_tile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "optionally with its tiles" implies the agent may bundle tiles into creation rather than calling add_dashboard_tile afterwards, which is an implied routing hint. There is no explicit when-to-use/when-not guidance, no mention of when update_dashboard is the better call, and no stated prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_folderCreate folderAInspect

Create a new folder for organising the business's uploaded files and documents. To rename or re-parent an existing folder use update_folder instead.

NameRequiredDescriptionDefault
nameYesName for the new folder (required).
parentidNoId of the parent folder to nest this one under; omit for a top-level folder.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the basic write-but-not-destructive profile is covered. The description adds useful context about organizing uploaded files, but it does not disclose behaviors like duplicate-name handling, ID generation, or return values. That is acceptable but not exceptional given 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The primary action is front-loaded, and the second sentence provides a valuable routing pointer to update_folder without wasting words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter create tool with full schema coverage and non-destructive annotations, the description is sufficient. It clearly states the purpose, covers the main alternative, and no critical missing context blocks invocation. A small gap is the absence of return-value or duplicate-handling guidance, but this is not severe for such a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already fully documents 'name' and 'parentid'. The description adds marginal conceptual context through 're-parent' but does not meaningfully enhance parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Create a new folder') and adds purpose context ('organising the business's uploaded files and documents'). It also distinguishes itself from update_folder by explicitly reserving rename/re-parent operations for that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool (creating a new folder) and gives an explicit alternative for existing folders: 'To rename or re-parent an existing folder use update_folder instead.' This leaves no ambiguity about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_income_expenses_bulkCreate income expenses bulkAInspect

Create many income and expense records in one transaction — prefer this over repeated save_income / save_expense calls. Optional top-level transactionid links every record to that bank transaction; a per-item transactionid overrides it. An expense accountid set to a purchase document's id (cont-…) records it as a payment against that bill. All-or-nothing; per-item salestax is not supported (use save_expense). Returns the new ids.

NameRequiredDescriptionDefault
incomeNo
expensesNo
transactionidNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/destructive annotations by disclosing all-or-nothing transaction semantics, the top-level transactionid inheritance with per-item override, the special meaning of an expense accountid pointing at a cont-… purchase document, and that the new ids are returned. The only missing behavior is any bound on how many records a single call accepts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences, each carrying distinct operational information — preference, transactionid inheritance, document-payment special case, atomicity, and the salestax exclusion — with the primary use case front-loaded and zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema the description correctly closes the loop by stating it returns the new ids, and it covers atomicity and the notable id-overloading cases. What remains unstated is any batch-size limit or what happens when an array is empty, which matters for a tool whose whole premise is 'many'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is 0% (income, expenses and transactionid have no schema descriptions), though the nested item properties are documented in detail. The description compensates for the most important gap by explaining that the top-level transactionid is inherited by every record unless a per-item value overrides it, but it never explains the shape or per-entry requirements of the income and expenses arrays themselves.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope ('Create many income and expense records in one transaction') and immediately distinguishes itself from the one-at-a-time siblings save_income and save_expense. An agent can decide between bulk and single-record creation 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to prefer this over repeated save_income / save_expense calls, and names the one case where it must NOT be used ('per-item salestax is not supported (use save_expense)'), routing the agent to the correct alternative with the selecting condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_tagCreate tagCInspect

Create a tag — a coloured label for categorising transactions, entries and other records. Use when you need a new label to apply across records; to rename or recolour an existing tag use update_tag, and to remove one use delete_tag. Note this is an accounting tag applied to records, not the business's own segmentation label — for that use set_business_tag.

NameRequiredDescriptionDefault
idNoTag id. Present → update that tag; omit → create a new one.
nameNoDisplay name of the tag.
colorNoHex colour for the tag (e.g. "#8a8d82"), used for display.
groupNoFree-text group the tag belongs to. On update, passing null or "" clears an existing group; omitting the key leaves it unchanged.
archivedNoWhether the tag is archived. Omit on create to default to unarchived.

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate non-read-only, non-destructive; they don't explain side effects. The description fails to disclose that passing an id updates an existing tag, instead implying updates should go through update_tag. This hides actual behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and tightly packed: it defines the resource, states the primary use case, and differentiates from update_tag, delete_tag, and set_business_tag without extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers when to use the tool and distinguishes it from similar tools, but it omits the id-based update capability, leaving the tool's full behavior ambiguous and potentially causing an agent to misroute updates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and each parameter has a clear description. However, the description adds no extra parameter guidance and its create-only framing conflicts with the id parameter's update semantics, limiting the value it adds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states 'Create a tag,' but the id parameter description says 'Present → update that tag; omit → create a new one,' which contradicts the stated create-only purpose and the explicit guidance to use update_tag for existing tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit conditions: use for new labels, use update_tag for renames/recollors, delete_tag for removal, and set_business_tag for business segmentation. However, the schema's id-based update behavior makes the 'use update_tag' guidance misleading because create_tag also supports updates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decide_leave_requestDecide leave requestAInspect

Approve, decline or cancel a leave request by id. Approving records the leave taken against the employee's balance; declining or cancelling an approved request returns those days. The answer lists the employee's finalised payslips whose period the leave overlaps. Approving over such a payslip is refused unless force is true. This changes leave balances only and posts nothing to the ledger.

NameRequiredDescriptionDefault
idYes
forceNo
decisionYes
approveddateNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false; the description goes well beyond that. It discloses the balance side effects of each decision (recording vs returning days), the payslip-overlap refusal with the force override, and explicitly scopes the mutation to leave balances with no ledger posting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and reasonably tight; each sentence conveys a distinct behavioral fact. Slightly dense at five clauses, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully describes the return (finalised payslips overlapping the period) and the mutation's scope. The only real gap is the undocumented approveddate parameter, so the agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry parameter meaning. It explains id, the three decision values, and the role of force, but approveddate is never mentioned, leaving one of four parameters undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (approve, decline, cancel) and resource (a leave request) keyed by id, and clearly distinguishes this decision tool from the creation/list siblings like save_leave_request and list_leave_requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the operational conditions well – approving over a finalised payslip is refused unless force is true – which tells the agent when force is needed. It does not, however, explicitly route against a sibling tool or state when NOT to use this versus save_leave_request, so it stops short of full alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_clientDelete clientA
DestructiveIdempotent
Inspect

Delete one customer or many to the bin (soft-delete, restorable). Send id for one customer, which returns {error}. Or send ids (up to 1000) to delete many in one transaction, which returns {error, deleted: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own, already deleted, or still linked to quotes/invoices are skipped and listed in errors, and error is true only when nothing was deleted. By default a customer with linked (non-deleted) quotes/invoices is refused so those documents aren't orphaned. Pass force:true to override, or archive via update_client.

NameRequiredDescriptionDefault
idNoOne client id to delete.
idsNoUp to 1000 client ids to delete in one transaction. Partial success: ids this business does not own, already deleted, or still linked (unless force) are skipped and listed in errors.
forceNoDelete even when the client still has linked (non-deleted) quotes/invoices. Default false: the delete is refused when links exist, so linked documents aren't orphaned (PROD-555).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/idempotent annotations by disclosing the partial-success contract (skipped ids listed in errors, `error` true only when nothing deleted), the orphan-protection refusal, and the soft-delete/restorable semantics. This is exactly the behavioral context an agent needs before calling a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and the soft-delete qualifier, then layers parameter routing, return shapes, and the force caveat. Dense but each sentence carries distinct information; only the return-shape enumeration is slightly heavy for a description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description documents both return shapes ({error} vs {error, deleted, errors}) and the partial-success semantics, plus the link-refusal rule. Nothing an agent needs to invoke this destructive tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so `id`, `ids` (max 1000, partial success), and `force` are already documented in the schema. The description largely restates those semantics and adds return-shape detail rather than new parameter meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Delete one customer or many') and immediately qualifies scope with 'to the bin (soft-delete, restorable)'. This clearly distinguishes it from hard-delete siblings like delete_document or delete_supplier and from update_client.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes by parameter: send `id` for one customer, `ids` for many. States the default refusal behavior for linked documents, the `force:true` escape hatch, and names the alternative 'archive via update_client'. When-to-use and when-to-override are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_dashboardDelete dashboardB
DestructiveIdempotent
Inspect

Delete a custom dashboard. The Overview can't be deleted.

NameRequiredDescriptionDefault
idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is known without the description. The description adds one genuinely new behavioral fact — the Overview dashboard is protected and will fail — but says nothing about recoverability (restore_deleted exists as a sibling) or required permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler, and the protected-Overview constraint is stated immediately after the core action so the agent reads the exclusion before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with full annotation coverage and no output schema, the description is roughly adequate: action, scope and the Overview exclusion are all present. The missing pieces — how to identify a dashboard id and whether deletion is reversible — are the ones an agent would most need.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required parameter 'id', so the schema gives the agent no meaning at all. The description does not explain that this is a dashboard identifier or where to obtain one (list_dashboards, get_dashboard), leaving the only parameter undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a custom dashboard') and narrows scope with 'custom', which separates it from read/update siblings like get_dashboard and update_dashboard. It stops short of naming a sibling alternative, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'The Overview can't be deleted' gives one concrete when-not condition, which is useful guardrail guidance. However, it never says when this tool should be chosen over alternatives (e.g. hiding vs deleting, or that restore_deleted can undo it), so usage is only partially implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_documentDelete documentA
DestructiveIdempotent
Inspect

Delete a document (invoice, quote, credit note, debit note, bill, etc.) by id. Reversible — the document and the payments that settle it are moved to the bin together, where list_binned shows them and restore_deleted brings them back. Find the id yourself with list_documents (query by number or contact); never ask the user for an id.

NameRequiredDescriptionDefault
idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say destructiveHint=true and idempotentHint=true, which would lead an agent to assume hard, irreversible deletion. The description corrects this by disclosing that the operation is reversible, that the document AND the payments settling it are moved to the bin together, and that list_binned/restore_deleted are the recovery tools. This is substantial behavior disclosure beyond 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: what it deletes, what happens on deletion/recovery, and how to source the id. The core action is front-loaded in the first clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers the affected entity, side effects (payments moved too), reversibility, recovery tooling, and id sourcing. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id) with 0% schema description coverage, so the description must carry the load — and it does, explaining that the id identifies a document and how to obtain it via list_documents by number or contact. It adds real meaning, though it doesn't specify id format (UUID vs numeric).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (document), enumerates the document types covered (invoice, quote, credit note, debit note, bill), and scopes it to deletion by id. An agent can immediately distinguish it from delete_document_line, delete_expense, or delete_journal_entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete workflow instruction ('Find the id yourself with list_documents (query by number or contact); never ask the user for an id') and points to the recovery path (list_binned, restore_deleted). It does not, however, state when not to use this tool — e.g. when only a single line should be removed via delete_document_line instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_document_lineDelete document lineA
DestructiveIdempotent
Inspect

Delete a line item from a document (invoice, quote, bill, etc.). id is the line id; pass the parent document id as quinvoice so the correct document is updated. To change a line rather than remove it use update_document_item (or update_document_items_bulk for several).

NameRequiredDescriptionDefault
idYesLine item id to delete (required).
invoiceNoAlias for quinvoice (the parent document id); prefer quinvoice.
invoiceidNoAlias for quinvoice (the parent document id); prefer quinvoice.
quinvoiceNoId of the parent document (invoice, quote, bill, etc.) the line belongs to — pass this so the correct document is updated. Required in practice.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true; the description aligns with them and adds useful context by requiring the parent document id to update the right document. It doesn't elaborate on side effects like document totals, but this is acceptable given 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences cover the operation, key parameters, and alternative tool. There is no filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with annotations covering safety and a fully documented schema, this description covers the necessary call pattern, clarifies the practical requirement, and routes to the correct alternative. Nothing critical is missing for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description doesn't need to document every field. It adds value beyond the schema by emphasizing that id is the line id and quinvoice is the parent document id, and by noting quinvoice is required in practice even though it isn't in the schema's required list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Delete a line item from a document (invoice, quote, bill, etc.)'. This clearly distinguishes it from sibling tools like delete_document and update_document_item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells agents when not to use this tool: 'To change a line rather than remove it use update_document_item (or update_document_items_bulk for several)'. It also gives the key call requirement to pass quinvoice so the correct document is updated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_expenseDelete expenseA
DestructiveIdempotent
Inspect

Delete one expense or many to the bin (soft-delete, restorable). Send id for one expense, which returns {error}. Or send ids (up to 250) to delete many in one call, which returns {error, deleted: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors, and error is true only when nothing was deleted. The ledger recomputes, so linked bills and transactions stay consistent. Confirm with the user before deleting.

NameRequiredDescriptionDefault
idNoOne expense id to delete.
idsNoUp to 250 expense ids to delete in one call. Partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive=true and idempotent=true, and the description adds context annotations cannot carry: deletions are soft and restorable, the ledger recomputes so linked bills and transactions stay consistent, and partial-success semantics are spelled out precisely ('error is true only when nothing was deleted').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the delete semantics, then mode selection, then result interpretation, then a safety prompt. Dense but every sentence carries decision-relevant information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by documenting both return shapes and how to read partial failure. Confirmation guidance and ledger-consistency behavior round out what an agent needs for a destructive, restorable mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by pairing each parameter with its distinct return shape ({error} for id vs {error, deleted, errors} for ids) and clarifying the skip conditions for ids.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific verb and resource ('Delete one expense or many') plus the crucial scope qualifier that this is a soft-delete to the bin and restorable, which distinguishes it from any hard-delete interpretation and from save_expense/list_expenses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes between the two call modes ('Send `id` for one expense... Or send `ids` (up to 250)') and adds a procedural guardrail ('Confirm with the user before deleting'). It does not name restore_deleted as the undo path, only implies it with 'restorable', so a sibling pointer is the one missing piece.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_incomeDelete incomeA
DestructiveIdempotent
Inspect

Delete one income record or many to the bin (soft-delete, restorable). Send id for one record, which returns {error}. Or send ids (up to 250) to delete many in one call, which returns {error, deleted: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors, and error is true only when nothing was deleted. The ledger recomputes, so a linked invoice's outstanding is restored. Confirm with the user before deleting.

NameRequiredDescriptionDefault
idNoOne income id to delete.
idsNoUp to 250 income ids to delete in one call. Partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: deletion is soft and restorable, batch calls can partially succeed, error is true only when nothing was deleted, and the ledger recomputes so a linked invoice's outstanding balance is restored. That downstream side effect is exactly the kind of behavior an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and its soft-delete nature are front-loaded in the first clause, then the two modes, then the partial-success semantics, then the safety instruction. There is no filler; even the brace notation is there to convey return shapes that the absent output schema would otherwise leave undocumented.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the burden of documenting return values and does so for both call modes, including the tricky partial-success case. For a destructive two-parameter tool it leaves nothing material for an agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 goes further by tying each parameter to a distinct response shape (`id` returns {error}; `ids` returns {error, deleted, errors}) and by explaining the skip semantics of non-owned, already-deleted, or unknown ids. It adds real meaning beyond the schema's plain field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Delete one income record or many') and immediately qualifies the operation as a soft-delete 'to the bin (soft-delete, restorable)'. That distinguishes it from a hard delete, though it never explicitly names adjacent siblings such as unlink_income_transaction or delete_expense, leaving the agent to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly routes between the two modes: send `id` for a single record or `ids` for a batch of up to 250 in one call. It also adds a procedural guardrail, 'Confirm with the user before deleting,' but gives no explicit when-not guidance (e.g., use unlink_income_transaction when you only want to detach a bank transaction).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_journal_entryDelete journal entryA
DestructiveIdempotent
Inspect

Permanently delete a MANUAL journal entry by id. Immediate and irreversible. Only works on manually-created entries (ids like ent…). Journal entries auto-generated from a source document (invoice, bill, income, expense — ids like ent-1-inv…, ent-1-cont…, ent-1-exp…) cannot be removed this way: delete the SOURCE document instead, and its journal entry is removed with it. Confirm with the user before deleting.

NameRequiredDescriptionDefault
idYesID of the journal entry

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses irreversibility ('Immediate and irreversible') and the limitation on auto-generated entries, which complements the destructiveHint annotation. The instruction to confirm with the user adds practical behavioral context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet complete, with each sentence adding essential information: action, irreversibility, scope, alternative method, and confirmation requirement. No redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-parameter interface, the description fully covers the operation, its side effects, and the correct usage context. No output schema exists, so no return value description is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The 'id' parameter is described generically in the schema, but the tool description enriches it by explaining the id format 'ent...' for manual entries and contrasting with 'ent-1-inv...' type ids. This gives the agent a clear understanding of what value to pass.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('Permanently delete') and the target ('MANUAL journal entry by id'), distinguishing from siblings like delete_document or delete_expense. The scope is explicit and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use (manual entries only) and when not to use (auto-generated entries, delete the source document instead). Also instructs to confirm with the user, covering the decision-making process.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_messageDelete messageA
DestructiveIdempotent
Inspect

Permanently delete an in-app message / notification by id. Removes it for every user of the business (it is retracted, not just marked read — for that use mark_message_read). Immediate and irreversible — confirm with the user before deleting.

NameRequiredDescriptionDefault
idYesId of the message.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the destructiveHint annotation by explaining that deletion affects every user of the business, acts as a retraction rather than a read state, and is irreversible. This fully discloses the behavioral impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loaded with the core action. Each sentence adds useful information without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides sufficient context for safe and correct usage, including the tool's scope, irreversibility, user impact, and distinction from a related non-destructive operation. No critical contextual information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, id, is already described in the schema as 'Id of the message.' The description adds no additional semantic detail beyond restating that deletion is by id, so it does not improve on the schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (permanently delete), the resource (in-app message/notification), and the identifier (by id). It also distinguishes the tool from mark_message_read, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts this tool with mark_message_read and warns that deletion is immediate and irreversible, advising confirmation with the user. This gives clear guidance on when to use it and what caution to apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_payrunDelete payrunA
DestructiveIdempotent
Inspect

Move a pay run and its payslips to the bin. Each finalised payslip's journal leaves the books until the run is restored from the bin, and the pay run's pay-date action is turned off. Without confirm true it changes nothing and answers reason confirm-required with what it would remove; ask the user, then call again with confirm true. A pay run with a finalised payslip dated in a locked period is refused.

NameRequiredDescriptionDefault
idYes
confirmNoSend true only after the user has agreed to the change the refusal described.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description goes well beyond them by disclosing side effects that annotations cannot express — journal entries leaving the books, the pay-date action being switched off, the no-op preview behavior with reason 'confirm-required', and the locked-period refusal. This is exactly the extra context the bar asks for.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all load-bearing, with the destructive effect front-loaded and the confirm protocol second. Slightly dense phrasing ('answers reason confirm-required') but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description still tells the agent what the unconfirmed call returns (a reason and a preview of what would be removed) and what failure mode to expect. For a destructive two-parameter tool this is complete enough to drive correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% (id is undocumented), so the description must compensate, and it does for confirm: it explains the preview-then-confirm contract and that confirm true must only be sent after user agreement. The id parameter is left implicit but is unambiguous given the tool name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Move a pay run and its payslips to the bin') and immediately clarifies this is a reversible soft delete rather than a hard removal, which distinguishes it from the sibling delete_payslips. An agent can tell exactly what the call does 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit two-step protocol: call without confirm to preview, ask the user, then call with confirm true — plus the refusal condition for locked periods. It never names the nearest alternatives (delete_payslips, restore_deleted) as a routing hint, 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.

delete_payslipsDelete payslipsA
DestructiveIdempotent
Inspect

Delete payslips by id for good. A finalised payslip's journal leaves the books with it. Without confirm true it changes nothing and answers reason confirm-required with what it would delete; ask the user, then call again with confirm true. A finalised payslip dated in a locked period, or a payslip on a pay run that finalises itself on its pay date, is refused. A missing or another business's id refuses the whole batch.

NameRequiredDescriptionDefault
idsYes
confirmNoSend true only after the user has agreed to the change the refusal described.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: the journal leaving the books with a finalised payslip, the two-phase confirm protocol, the confirm-required reason response, the refusal conditions, and the whole-batch refusal for missing or foreign ids. This is exactly the destructive-side-effect context an agent needs before committing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and action, and every sentence carries operational information (journal behavior, confirm workflow, refusal rules, batch semantics). The terse telegraphese is dense but not padded, though the phrasing takes a moment to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the relevant response behavior (confirm-required reason with the would-be deletions) and all edge-case outcomes for a destructive mutation tool. Nothing an agent needs to call this correctly appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% (ids is undocumented in the schema), so the description must compensate. It does: ids is clarified as batch identifiers where a missing or another business's id refuses the whole batch, and confirm's role is detailed with the resulting behavior, adding meaning beyond the schema's one-line hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (delete payslips) with scope (by id, batch), clearly distinguishing it from sibling finalise_payslips and delete_payrun. An agent knows exactly what this does 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit procedural guidance: without confirm true nothing changes and the reason confirm-required is returned, so ask the user then call again with confirm true. It also lists when the call is refused (locked period, self-finalising pay run). It lacks explicit cross-references to alternative sibling tools, keeping it at 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_productDelete productA
DestructiveIdempotent
Inspect

Delete one product or many to the bin (soft-delete, restorable). Send id for one product, which returns {error}. Or send ids (up to 1000) to delete many in one transaction, which returns {error, deleted: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own, or already deleted, are skipped and listed in errors, and error is true only when nothing was deleted. Document lines that used a product keep their own copies of name/price.

NameRequiredDescriptionDefault
idNoOne product id to delete.
idsNoUp to 1000 product ids to delete in one transaction. Partial success: ids this business does not own are skipped and listed in errors.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover destructiveness and idempotency, and the description still adds substantial context beyond them: soft-delete is restorable, bulk runs in one transaction, partial success semantics (unowned/already-deleted ids skipped into errors), that `error` is true only when nothing was deleted, and that document lines retain their own name/price copies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each front-loaded with the decision-relevant fact (restorability, then the id-vs-ids branch, then partial-success semantics). No filler or restatement of the name/title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the entire return-contract burden and does so precisely for both modes, including the counterintuitive 'error is true only when nothing was deleted' rule and document-line snapshot behavior. Nothing an agent needs to invoke or interpret the call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning the schema lacks: it ties each parameter to a distinct return contract (`id` → {error}; `ids` → {error, deleted, errors}) and explains the partial-success behavior of `ids`. It stops short of the factual limits the schema already carries (maxItems 1000).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Delete') and resource ('product'), plus scope (one or many) and the nature of the delete ('soft-delete, restorable'). This distinguishes it from hard-delete siblings like delete_document and from restore_deleted (the inverse operation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the caller: 'Send `id` for one product... Or send `ids` (up to 1000) to delete many in one transaction.' That is clear usage context, but it never names a sibling alternative or states exclusions (e.g., when to prefer per-item delete over bulk, or that restore_deleted undoes this).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_supplierDelete supplierA
DestructiveIdempotent
Inspect

Delete one supplier or many to the bin (soft-delete, restorable). Send id for one supplier, which returns {error}. Or send ids (up to 1000) to delete many in one transaction, which returns {error, deleted: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own, already deleted, or still linked to bills/expenses are skipped and listed in errors, and error is true only when nothing was deleted. By default a supplier with linked (non-deleted) bills/expenses is refused so those expenses aren't orphaned. Pass force:true to override, or archive via save_supplier.

NameRequiredDescriptionDefault
idNoOne supplier id to delete.
idsNoUp to 1000 supplier ids to delete in one transaction. Partial success: ids this business does not own, already deleted, or still linked (unless force) are skipped and listed in errors.
forceNoDelete even when the supplier still has linked (non-deleted) bills/expenses. Default false: the delete is refused when links exist, so linked expenses aren't orphaned (PROD-663).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/idempotent/not-readOnly, and the description adds substantial context beyond them: it is a soft-delete to the bin (restorable), partial success is possible in bulk mode, error is true only when nothing was deleted, and linked bills/expenses block deletion unless forced. This is exactly the behavioral detail the 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action (soft-delete, restorable) and mode selection, and every sentence carries information. It is dense—packing return shapes and partial-success semantics into a paragraph—which slightly hurts scannability but leaves no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates fully by documenting the return shapes for both modes and the meaning of the error fields. For a destructive bulk tool, the refusal/force/link behavior is completely covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 beyond the schema: it explains the `id`/`ids` return shapes, the 1000 cap in transactional context, the partial-success error listing, and the PROD-663 rationale for `force`.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific verb+resource and immediately distinguishes the two modes (single `id` vs bulk `ids`). It also names the sibling alternative (save_supplier) for the archive case, so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance: send `id` for one, `ids` for many, use `force:true` to override the linked-expense refusal, or archive via save_supplier instead. Conditions and alternatives are spelled out rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_tagDelete tagA
DestructiveIdempotent
Inspect

Delete a tag by id. The tag moves to the bin: list_binned shows it and restore_deleted brings it back. Offer archiving with update_tag first, and confirm with the user before deleting.

NameRequiredDescriptionDefault
idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as destructive, idempotent, and not read-only, but the description adds crucial behavior beyond that: the tag moves to the bin rather than being permanently lost, and it can be restored. It also surfaces the confirmation and archiving alternatives, which are valuable behavioral details for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, with the core action and recovery behavior front-loaded. Every sentence adds useful information: what it does, how to recover, and safer alternatives.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter destructive tool with no output schema, the description covers the essential context: lookup by id, bin-based recovery, an archiving alternative, and user confirmation. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has only one parameter, 'id', with 0% description coverage, and the description adds only that deletion is 'by id'. It does not specify the id format or where to obtain it, though the single obvious required parameter keeps the gap small.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a tag') and adds the key lookup field ('by id'). This clearly distinguishes it from siblings like update_tag, list_tags, and restore_deleted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends archiving via update_tag first and asks the agent to confirm with the user before deleting. It also names the recovery path through list_binned and restore_deleted, so the agent knows both alternatives and consequences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_variantDelete variantA
DestructiveIdempotent
Inspect

Delete a product variant by id. The variant moves to the bin and restore_deleted brings it back on the same product; to create or edit a variant instead use save_variant.

NameRequiredDescriptionDefault
idNoId of the variant to delete. Required in practice.
productidYesId of the parent product the variant belongs to (required).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely non-redundant context: the delete is a soft delete ('moves to the bin') recoverable via restore_deleted, and it stays scoped to the same product. It doesn't discuss cascading effects (line items, documents referencing the variant), which keeps 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, action and recovery semantics front-loaded, alternatives trailing. No wasted clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema mutation, the agent knows what happens to the entity, that it's recoverable, and what tools to use instead. Missing only the side effects on related records, which is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with both parameters described, so baseline is 3. The description mentions 'by id' and implies the parent product context, but doesn't resolve the schema's odd signal where id is described as 'Required in practice' yet absent from the required array — that ambiguity is left to the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a product variant by id') and immediately distinguishes itself from two siblings by naming restore_deleted and save_variant. An agent can route correctly without inspecting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers the alternatives: restore_deleted for recovery and save_variant for create/edit. Both the when-to-use-this and the when-to-use-something-else cases are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_dashboardEvaluate dashboardA
Read-only
Inspect

Every tile's figure for a period, with the period before it for comparison. A tile the plan or the data can't answer comes back unavailable, never as 0.

NameRequiredDescriptionDefault
idYes
periodEndYesLast day of the period, YYYY-MM-DD.
periodStartYesFirst day of the period, YYYY-MM-DD.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers the safety profile, and the description adds real behavioral value beyond it: tiles the plan or data cannot answer return as 'unavailable' rather than 0, which prevents an agent from misreading a missing metric as zero. It also discloses that a comparison period is included in the response, which matters given there is no output schema. It stops short of explaining how the comparison period is derived.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core result and followed immediately by the most surprising behavior (unavailable, never 0). Nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description covers the essential contract: what comes back (per-tile figures plus prior-period comparison) and how failures are represented. The remaining gap is the 'id' parameter and whether the comparison period mirrors the requested span.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%: periodStart and periodEnd are documented in the schema with format and meaning, but 'id' has no description at all. The description refers to 'a period' without clarifying inclusion semantics or that the comparison window is derived from the supplied period, so it adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb-less but concrete outcome: every tile's figure for a period plus the prior period for comparison. That distinguishes it from get_dashboard (definition) and update_dashboard (mutation) well enough to choose it, though it never explicitly says it operates on the dashboard identified by 'id'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance and no sibling is named, despite close siblings like get_dashboard, evaluate_report, and evaluate_report_batch. Usage is only inferable from the fact that figures for a period are returned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_reportEvaluate reportA
Read-only
Inspect

Resolve a report template OR an insight view against a period. Templates: every field measured off the ledger or derived by its formula, each with a drilldown — name a statutory template by source (e.g. locale:za/vat201) or a stored template by templateid. Views (view: payables, receivables, profit-and-loss, balance-sheet, cash-flow, trial-balance, salestax-summary, salestax-activity, … — see the view param for the full list; e.g. payables returns every outstanding bill with supplier, amount, due date and currency, receivables the same for invoices): the data-driven insight feeds stub-web's screens render. With snapshotid the period evaluates FROZEN from the snapshot's filed listing — the filed numbers, immutable; without, LIVE from the current books.

NameRequiredDescriptionDefault
asAtNoFor as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd.
modeNotrial-balance: "cumulative" (default — closing balances as at periodEnd, opening/retained included, ties to the balance sheet) or "period"/"range" (period-movement only within [periodStart..periodEnd], for error-checking a window).
viewNoAn insight view instead of a template: account-totals, account-totals-as-at, trial-balance, profit-and-loss, balance-sheet, cash-flow, receivables, payables, customer-totals, supplier-totals, product-totals, salestax-summary, salestax-activity, income-tax-summary, inventory, clearing-residual. Provide this OR a template, not both.
basisNoincome-tax-summary: "profit" (default) or "turnover".
sourceNoA statutory template source, e.g. "locale:za/vat201". Provide this or templateid.
compareNoprofit-and-loss: true = two columns, the equal-length prior period and the current one.
filtersNoRow filters: [{"property": "tags"|"customer"|"supplier"|"product"|"account", "value": ...}]; tags value "none" means untagged.
journalNoaccount-totals and entity totals: restrict to one journal (1 income, 2 expenses, 3 assets, 4 liabilities, 5 equity).
monthlyNoViews with columns (profit-and-loss, cash-flow): true = one column per calendar month in the period.
versionNoTemplate version. Omit for the version in effect at the period end.
payrunidNoA per-pay-run return's pay run id (e.g. locale:gb/fps): only the entries that run posts are read. Refused for a template not filed per pay run.
constantsNoConstants a template's formulas name ($salesTaxRate → {"salesTaxRate": 0.15}). Undeclared here, coercion would strip them and the formula would silently evaluate with 0.
dimensionNocash-flow: "category" (default — counterpart categories) or "baseaccount" (per bank/cash account).
periodEndNo
comparisonNoprofit-and-loss: "lastYear" = two columns, the same period a year earlier and the selected one (no Total column); "yearly" = one column per financial year, clamped to the period, at most 12. Takes precedence over monthly and compare; absent = those flags decide. cash-flow: "yearly" only, because each column's opening balance chains from the column before it.
employeeidNoA per-employee certificate's employee id (e.g. locale:za/irp5): only the entries their payslips post are read. Required for such a template, refused for any other.
snapshotidNoEvaluate FROZEN against this snapshot's filed listing (the period must sit inside its window) instead of the live books.
templateidNoA stored user template id. Provide this or source.
periodStartNo
presentationNotrial-balance: "net" (default; one figure per account, Dr or Cr by sign; P&L netting to zero hidden; :profitLoss memo) or "gross" (summed Dr and Cr movements). Unknown values are refused.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, and the description adds genuinely useful behavior beyond that: with snapshotid the period evaluates FROZEN from the filed listing and the numbers are immutable, without it the evaluation is LIVE against current books. That frozen/live distinction is exactly the kind of consequence an agent needs before calling. It stops short of describing the response envelope or any size/performance characteristics of a large evaluation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core contract — resolve a template or a view against a period — is front-loaded in the first clause, and the frozen-vs-live distinction is placed last where it reads as the key caveat. The view enumeration with an ellipsis plus the parenthetical examples is somewhat redundant given it also points the reader to the `view` param for the full list. Dense but nearly every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter tool with no output schema, the description covers the decisions that matter most: which mode, which naming scheme, and whether the result is live or frozen. Given 90% schema coverage, the remaining gaps are mostly about return shape — only payables/receivables get a hint of output, and nothing tells the agent what a template evaluation returns. Adequate and well beyond minimum viable, but not fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 90%, so the schema already documents the 20 parameters thoroughly, and most of the description's parameter talk (source format, templateid, snapshotid) echoes what the schema says. The one thing the description adds is a concrete illustration of what a view such as payables returns (supplier, amount, due date, currency), which is output context rather than parameter meaning. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — "Resolve a report template OR an insight view against a period" — and immediately explains the two modes (templates measured off the ledger, views data-driven). This is far clearer than the title's bare restatement. It does not, however, distinguish itself from sibling tools like evaluate_report_batch, evaluate_report_session or open_report_session, so an agent still has to infer when this single-report tool is the right entry point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Strong internal routing guidance: templates are named via `source` or `templateid`, views via `view`, and the reader is told what each mode produces. The snapshotid paragraph clearly frames the frozen-vs-live decision, which is the main usage fork. What's missing is any exclusion relative to the sibling evaluation tools, so the agent gets no help choosing this tool over the batch/session variants.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_report_batchEvaluate report batchA
Read-only
Inspect

Evaluate up to 24 templates/views in ONE round trip from the same session dataset build — a dashboard's dozen nuggets paint together and always agree. Each requests[] item is an evaluate body ({view|source|templateid, periodStart?, periodEnd, ...}); each results[] slot is exactly what /report/session/evaluate would return for it, errors inline per slot. Requires an open session (open_report_session first); for a single view use evaluate_report_session, or evaluate_report for a one-off outside any session.

NameRequiredDescriptionDefault
requestsYesUp to 24 evaluate bodies ({view|source|templateid, periodStart?, periodEnd, ...}) answered from ONE session dataset build — one round trip paints a dashboard.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that the tool requires an open session, that errors are returned inline per slot, and that it leverages a single session dataset build to reduce round trips. These are important behavioral details not present in 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with the core capability, then parameter details, then usage guidance. It avoids unnecessary filler and communicates everything needed in a compact format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all necessary context: the batching capability, the parameter structure, the response behavior (what each results slot contains), the session prerequisite, and alternatives for single or one-off evaluations. Despite lacking an output schema, the description sufficiently explains the expected result format, making the tool fully usable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description elaborates on the 'requests' parameter, specifying the structure of each item: '{view|source|templateid, periodStart?, periodEnd, ...}'. This adds crucial semantic information that the schema alone (which only says 'items: type object') does not provide, making the parameter fully understandable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool evaluates up to 24 report templates/views in a single round trip, using specific terms like 'evaluate', 'templates/views', and 'session dataset build'. It also distinguishes itself from sibling tools by mentioning the batch nature and session requirement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use this tool versus alternatives: 'for a single view use evaluate_report_session, or evaluate_report for a one-off outside any session.' It also states the prerequisite 'Requires an open session (open_report_session first)', giving clear guidance on usage conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_report_sessionEvaluate report sessionA
Read-only
Inspect

Evaluate a template (source/templateid) or an insight view (view: payables, receivables, profit-and-loss, balance-sheet, cash-flow, salestax-summary, salestax-activity, … — see the view param for the full list) against a period from the report session's cached dataset — identical answers to /report/evaluate, tens of milliseconds instead of a full pipeline run. For interactive use: period slides, template/view switches, constant tweaks. Live books only; frozen periods evaluate via /report/evaluate with snapshotid.

NameRequiredDescriptionDefault
asAtNoFor as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd.
modeNotrial-balance: "cumulative" (default — closing balances as at periodEnd, opening/retained included, ties to the balance sheet) or "period"/"range" (period-movement only within [periodStart..periodEnd], for error-checking a window).
viewNoAn insight view instead of a template: account-totals, account-totals-as-at, trial-balance, profit-and-loss, balance-sheet, cash-flow, receivables, payables, customer-totals, supplier-totals, product-totals, salestax-summary, salestax-activity, income-tax-summary, inventory, clearing-residual. Provide this OR a template, not both.
basisNoincome-tax-summary: "profit" (default) or "turnover".
sourceNoA statutory template source, e.g. "locale:za/vat201". Provide this, templateid, or view.
compareNoprofit-and-loss: true = two columns, the equal-length prior period and the current one.
filtersNoRow filters: [{"property": "tags"|"customer"|"supplier"|"product"|"account", "value": ...}]; tags value "none" means untagged.
journalNoaccount-totals and entity totals: restrict to one journal (1 income, 2 expenses, 3 assets, 4 liabilities, 5 equity).
monthlyNoViews with columns (profit-and-loss, cash-flow): true = one column per calendar month in the period.
versionNo
payrunidNoA per-pay-run return's pay run id (e.g. locale:gb/fps): only the entries that run posts are read. Refused for a template not filed per pay run.
constantsNo
dimensionNocash-flow: "category" (default — counterpart categories) or "baseaccount" (per bank/cash account).
periodEndNoInclusive period end (YYYY-MM-DD). Required.
comparisonNoprofit-and-loss: "lastYear" = two columns, the same period a year earlier and the selected one (no Total column); "yearly" = one column per financial year, clamped to the period, at most 12. Takes precedence over monthly and compare; absent = those flags decide. cash-flow: "yearly" only, because each column's opening balance chains from the column before it.
employeeidNoA per-employee certificate's employee id (e.g. locale:za/irp5): only the entries their payslips post are read. Required for such a template, refused for any other.
templateidNo
periodStartNo
presentationNotrial-balance: "net" (default; one figure per account, Dr or Cr by sign; P&L netting to zero hidden; :profitLoss memo) or "gross" (summed Dr and Cr movements). Unknown values are refused.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already marks it non-mutating, but the description adds substantive behavior: cached dataset, tens-of-milliseconds latency, identical answers to /report/evaluate, and live-only scope. It does not explain session invalidation or error behavior, so it is not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it opens with the primary evaluate action, then the latency/cache benefit, then the interactive and live-only constraints. Every sentence adds decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter session-cached tool, the description covers the key operating constraints (live-only, frozen-period fallback, interactive use) and names the equivalent /report/evaluate behavior. It omits the session-creation prerequisite and any return-shape detail, but the core invocation context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 79%, so the schema is already the primary source for most of the 19 parameters. The description only adds that view is the full list and that source/templateid are alternatives, leaving constants, version, and other params to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Evaluate a template ... or an insight view') and names both accepted selectors, source/templateid and view. It also distinguishes the tool from the full /report/evaluate pipeline by its cached-session, low-latency behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the interactive scenarios (period slides, template/view switches, constant tweaks) and an explicit exclusion: live books only, with frozen periods routed to /report/evaluate with snapshotid. It stops short of naming open_report_session as a prerequisite or addressing evaluate_report_batch, so the routing is not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_document_pdfExport document pdfA
Read-only
Inspect

Save a document (invoice, quote, credit note or any other kind) as a PDF in the business's Files, drawn as the customer sees it. Answers the new file's id and name: cite it as a file tag so the user can open and download it. Each call saves a new copy, so call it once per request. The file is kept, not imported into the books. A missing or another business's id is refused with reason document-not-found.

NameRequiredDescriptionDefault
idYesThe invoice, quote, credit note or other document to save as a PDF, from list_invoices or get_document.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, it discloses non-obvious behavior: every call creates a duplicate file, the artifact is retained rather than imported into the books, and a missing or cross-business id fails with reason document-not-found. It also states what the call returns (the new file's id and name), which annotations do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, followed by return handling, duplication warning, retention semantics, and error behavior in that order. Every sentence carries a distinct, actionable fact with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a single-parameter input, the description carries the remaining burden and does so: it names the returned fields, explains how to surface the file to the user, warns about duplicate artifacts, and specifies the failure mode. Nothing needed 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and the schema coverage is 100%, with the schema already naming the accepted document sources (list_invoices, get_document). The description restates that the id can be an invoice, quote, credit note or other document and adds the cross-business rejection rule, but adds little beyond the schema. A 3 baseline is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource (save a document as a PDF in the business's Files) and scopes what counts as a document (invoice, quote, credit note or any other kind), plus the rendering rule 'drawn as the customer sees it'. This clearly separates it from siblings like list_files, attach_file, remove_file, and save_document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the operating condition ('each call saves a new copy, so call it once per request') and tells the agent what to do with the result (cite it as a file tag so the user can open and download it). It lacks an explicit comparison to alternatives such as list_files or send_document, so the agent must infer when another sibling is the better choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

finalise_payslipsFinalise payslipsA
Destructive
Inspect

Finalise payslips by id, so each posts its journal to the books. Sends no email and files no returns. Without confirm true it changes nothing and answers reason confirm-required with what it would post; ask the user, then call again with confirm true. A payslip dated in a locked period, or on a pay run that finalises itself on its pay date, is refused. A missing or another business's id refuses the whole batch.

NameRequiredDescriptionDefault
idsYes
confirmNoSend true only after the user has agreed to the change the refusal described.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint annotation by disclosing the dry-run/refusal contract ('answers reason confirm-required with what it would post'), the invariants that will refuse a call (locked period, self-finalising pay run), and batch atomicity ('A missing or another business's id refuses the whole batch'). This is exactly the behavioural context needed for a mutating, journal-posting operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, front-loaded with the effect and then the confirm protocol, with no filler. It is dense — the refusal conditions are packed into single clauses — but each sentence carries distinct operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive mutation with no output schema, the description covers effect, side effects avoided, confirmation flow, refusal conditions, and atomicity. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50% (ids is undocumented), and the description compensates by defining batch semantics for ids — all-or-nothing refusal on missing or cross-business ids — and by adding the confirm-required response contract beyond the schema's one-line note. It still doesn't state what an id is (payslip id) or whether duplicates/ordering matter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Finalise payslips by id') plus the concrete consequence ('each posts its journal to the books'), which distinguishes it from save_payslip (drafting) and delete_payslips in the sibling list. An agent can tell what changes in the domain 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit two-step protocol ('ask the user, then call again with confirm true') and scope exclusions ('Sends no email and files no returns'), so the agent knows this is not the tool that distributes pay slips. It doesn't compare against save_payslip/populate_payrun explicitly, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_candidate_transactionsFind candidate transactionsA
Read-only
Inspect

For an OUTSTANDING or OVERDUE invoice or bill, surface the candidate bank transactions that could settle it: OPEN (unreconciled) transactions within ±7 days of the document's due date whose amount matches its outstanding balance. Returns {documentid, direction, duedate, amount, doccurrency, basecurrency, candidates [transactions], best {transactionid, confidence 0.0-1.0, reason, proposal}} — best is the single strongest match (confidence >= 0.9 is a confident match). A bank line in another currency is offered when, converted at its own date's rate, it lands within 3% of the balance; its best never reaches 0.9 and carries requires_confirmation=true, because settling it needs the FX gain/loss the user confirms. Each candidate (and best) also carries a proposal: the adjusting line settling with it would require — {type :bank-charge|:fx-gain|:fx-loss, amount, currency, …} when the payment does not land exactly on the outstanding balance (a bank charge when the currencies match, an FX gain/loss when they differ), null for an exact match, or {type :indeterminate} when the dated FX rate is unavailable. READ-ONLY: it suggests a match and the adjusting line, never records either (settle bills via settle_bills; the adjusting line is for the user to confirm). To settle an invoice, first check whether the candidate's bank line already has its own income: list_transactions shows it in that line's $incomeids. If it does, settle with save_income, id = that income and accountid = the invoice id. Use record_document_payment only when the line has no income, because it always creates a new income and would count the money twice. Pass the document id (cont-… or inv-…). Run this whenever you report an overdue/outstanding invoice or bill so the likely payment is offered alongside it.

NameRequiredDescriptionDefault
documentidYesThe invoice / bill / purchase document id (cont-… or inv-…) to find candidate settling bank transactions for.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the readOnlyHint annotation: it discloses the ±7 day window, 3% FX tolerance, confidence >= 0.9 threshold, requires_confirmation flag for cross-currency matches, and the exact shape of the proposal/adjusting line. It also states explicitly what it never does (record a match or adjusting line).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very dense and front-loaded — the core behavior and window lead, routing guidance follows. It is long and the proposal/currency explanation is somewhat repetitive, but nearly every sentence carries operational information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden itself and does so fully: it enumerates the returned fields, the candidates/best structure, and confidence semantics. Combined with the routing guidance, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and fully documents the single documentid parameter (cont-… or inv-…). The description only restates the same id format, adding no syntax or semantics beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('surface the candidate bank transactions') scoped precisely to an OUTSTANDING or OVERDUE invoice or bill. An agent can distinguish it from settle_bills, record_document_payment, and match_transactions 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('Run this whenever you report an overdue/outstanding invoice or bill'), names alternatives (settle_bills, save_income, record_document_payment) and the exact conditions that select each. It even supplies a decision branch (check list_transactions for $incomeids first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_candidate_transactions_bulkFind candidate transactions bulkA
Read-only
Inspect

BULK / multi-document version of find_candidate_transactions: for MANY outstanding documents at once, return each document alongside its candidate settling bank transactions + best match, in ONE read-only call — so reconciling a large AP/AR backlog needs one call, not one round-trip per bill. Select the document set EITHER by passing an explicit documentids list, OR with the same filters as list_documents (type, direction in/out, contact, status e.g. overdue, from/to due-date range, unpaid, min_outstanding) — e.g. type=bill + unpaid + status=overdue to pull candidates for every overdue bill. Capped at limit documents (default 50, hard max 200); when more match, truncated is true and matched reports the full count, so narrow the filter or page. Returns {results [{document {...}, candidates [transactions], best {transactionid, confidence, reason}}], count, matched, truncated, limit}. READ-ONLY: it suggests matches, never records them (settle bills via settle_bills). To settle an invoice, first check whether the candidate's bank line already has its own income: list_transactions shows it in that line's $incomeids. If it does, settle with save_income, id = that income and accountid = the invoice id. Use record_document_payment only when the line has no income, because it always creates a new income and would count the money twice.

NameRequiredDescriptionDefault
toNoOnly documents with a due date on/before this date (inclusive, ISO 8601). Documents with no due date are kept.
fromNoOnly documents with a due date on/after this date (inclusive, ISO 8601). Documents with no due date are kept.
typeNoFilter the document set by kind (invoice, bill, …). Ignored when :documentids is given.
limitNoMax documents to process this call (default 50, hard max 200). If more match, :truncated is true and :matched reports the full count — narrow the filter or page.
statusNoFilter to documents whose computed status matches (case-insensitive), e.g. "overdue", "due", "partiallypaid".
unpaidNoWhen true, only documents with an outstanding balance (excludes fully paid rows). Recommended for reconciliation.
contactNoFilter to documents for this contact id (a client or supplier).
directionNoFilter by money direction: "in" (invoices, quotes, credit notes) or "out" (bills, purchase orders, debit notes).
documentidsNoExplicit list of document ids (cont-… or inv-…) to fetch candidates for. When given, the filter fields below are ignored. Foreign/missing ids are silently dropped.
min_outstandingNoOnly documents whose outstanding balance is at least this amount (inclusive).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description goes far beyond: it states matches are suggested and never recorded, discloses the limit cap (default 50, hard max 200) and the truncated/matched semantics when more rows match, and spells out the double-counting hazard of record_document_payment. This is rich behavioral context an agent genuinely needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but front-loaded and dense: the bulk purpose, selection modes, cap behavior, return shape, and settlement routing each earn their place. The settlement-routing sentences at the end are arguably tangential to *this* tool, but they prevent a costly double-payment mistake, so the length is justified rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description documents the return shape (results/document/candidates/best, count, matched, truncated, limit), the caps, and the null-vs-partial behavior. For a read-only, 10-param, no-required-param 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.

Parameters4/5

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, but the description adds real meaning beyond the schema: it explains the either/or semantics (filter fields are ignored when documentids is passed), the combination logic for filters, and the paging behavior tied to limit/truncated. It does not restate every param, but the additive value is clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find/return candidates) and resource (transactions for documents), and immediately frames itself as the 'BULK / multi-document version of find_candidate_transactions', distinguishing it from its closest sibling. An agent can tell exactly what it gets back (each document + candidates + best match) 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('reconciling a large AP/AR backlog needs one call, not one round-trip per bill'), the two selection modes, and a concrete filter example (type=bill + unpaid + status=overdue). It also routes away to alternatives: settle_bills for settling, save_income vs record_document_payment depending on whether a bank line already has income, and list_transactions to check $incomeids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flag_missing_receiptsFlag missing receiptsAInspect

Flag every expense with no slip attached in a period (default: last month), skipping duplicates and anything under a threshold, and tell the owner once with a single notification. A second run over the same period flags again but sends no repeat notice.

NameRequiredDescriptionDefault
toNoLast day, YYYY-MM-DD. Defaults to the last day of last month.
fromNoFirst day, YYYY-MM-DD. Defaults to the first day of last month.
thresholdNoSmallest total to chase, in the business's currency. Leave it out for every expense (R0); 5000 is the R5,000 preset — only the large ones.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses non-obvious behavior annotations cannot: duplicates and below-threshold items are skipped, the owner is notified exactly once, and crucially a second run over the same period re-flags but suppresses a repeat notification. This idempotent-notification semantics is exactly the context an agent needs before re-running.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the core action and period default. The second sentence on repeat-run behavior is slightly awkward but earns its place by covering an important edge case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no annotations beyond safety hints and no output schema, the description covers action, scope, threshold, notification, and re-run semantics well. It omits what the returned result or 'flag' state looks like, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear per-parameter descriptions (date defaults, threshold with R5,000 preset). The description reinforces threshold/duplicate behavior but adds no syntax or format detail beyond the schema, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (flag) and resource (expenses with no slip/receipt attached), plus scope (a period). No sibling tool overlaps this action, so an agent can identify it immediately from name and description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose (chase expenses missing receipts) and the description gives a sensible default period, but it never states when to prefer this over another approach or any preconditions. Adequate but no explicit guidance or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_action_usageGet action usageA
Read-only
Inspect

This billing period's action usage (for the plan's Stripe billing line items use get_subscription): actions used against the plan allowance plus purchased actions (limit, left), when the allowance resets, the prepaid balance in cents and actions, whether the plan allowance is spent or the business is out, usage by kind of work, and the hours saved. When sponsored is true the business is not metered, so limit, left and out? are not a real cap; when trial is true it has no paid plan yet. plan-label is the plan by the name the customer sees; legacy true means a grandfathered plan whose allowance differs from the pricing page.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds real interpretive context beyond that: under 'sponsored' the business is not metered so limit/left/out are not a real cap, under 'trial' there is no paid plan yet, and 'legacy'/'plan-label' change how the allowance should be read. It does not discuss freshness/latency or auth, but the disclosed caveats meaningfully shape how the returned numbers must be interpreted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the subject ('this billing period's action usage') and densely information-bearing, with no filler sentences. The structure is a near-run-on enumeration of fields and flags that is hard to scan, costing it a point despite the absence of waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the return-value burden and explains each notable field and its caveats, so an agent can interpret the response without external docs. It could be slightly more complete on cadence (e.g. whether values are real-time vs. end-of-day), but for a parameterless read tool it is largely self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is nothing parameter-side for the schema to cover. The description instead spends its budget on return-field semantics, which is the right use here, though that belongs to contextual completeness rather than parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('this billing period's action usage') and enumerates exactly what the payload contains (used vs allowance, reset time, prepaid balance, spend/out status, usage by kind, hours saved). It also names the sibling get_subscription as the route for Stripe billing line items, so an agent can distinguish the two 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one explicit routing rule ('for the plan's Stripe billing line items use get_subscription'), which is genuine when-not guidance. It does not, however, frame the broader context of when an agent should reach for this tool versus other account-level tools like get_business_overview or get_financial_summary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bank_profile_statusGet bank profile statusA
Read-only
Inspect

Report the business's bank-connection profile without pulling any transactions. Returns :providers (live Yodlee provider-link + per-dataset refresh health) AND :bankfeeds (per-provider connection status for every other linked bank feed — Capitec, GoCardless, Investec, Stripe and the other bank-connection apps — derived from stored install state, no live external call). A business with no Yodlee link still gets its :bankfeeds; only a business with no bank connection at all returns an explanatory :message, NOT an error.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the readOnlyHint annotation by explicitly stating the tool does not pull transactions, does not make live external calls for bankfeeds, and returns an explanatory message rather than an error when no bank connection exists. This fully sets expectations for side effects and error behavior, making the tool's behavior transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single detailed sentence but includes some redundancy (e.g., listing providers and bankfeeds twice with similar wording). It is not overly long, but the repetition of 'bank feed' variants could be trimmed. Overall, it is clear and front-loaded with the core purpose, but slightly redundant in the specifics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema provided, the description must convey all necessary context. It does so thoroughly: it names the two return fields, explains their sources (live vs. derived), clarifies the no-transaction/no-live-call behavior, and explicitly states the edge-case outcome (message, not error) when no bank connection exists. This is fully complete for an agent to know when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, matching the empty schema with full coverage. The description correctly implies no input is required by explaining what the tool returns with no configuration. Since there are no parameters to document, the baseline of 4 is exceeded by the clear statement that no input is needed and that the tool operates on the business's existing profile.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports the business's bank-connection profile and explicitly excludes pulling transactions. It specifies the two return categories (providers and bankfeeds) and their distinct characteristics, making the tool's purpose unambiguous. The name 'get_bank_profile_status' is descriptive and the description reinforces its role as a status-only reporter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful guidance by indicating no transactions are pulled and that bankfeeds are derived from stored state with no live external call. This hints at when to use the tool (e.g., for a lightweight status check). However, it does not explicitly compare to sibling tools like refresh_business_data or other getters, so it's slightly less explicit than ideal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_business_overviewGet business overviewA
Read-only
Inspect

One-call business overview: profile + financial summary + feature/usage context. This bundles get_business_profile and get_financial_summary — call those individually if you need only one part.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, covering the safety profile. The description adds useful behavioral context by revealing that this is a bundling call rather than a distinct data source, but it does not describe response shape, pagination, or any aggregation caveats. The added value is moderate but not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The core bundling behavior is front-loaded, and the alternative usage is stated efficiently in the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only composite tool, the description sufficiently captures what the call returns and when to use it. The absence of an output schema means a bit more detail about the financial summary or usage context could be helpful, but the current level is adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is no parameter semantics gap to fill. The description accurately reflects the no-input nature; no additional parameter explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a composite overview: profile + financial summary + feature/usage context. It also explicitly names the two sibling tools it bundles, so an agent can immediately distinguish it from get_business_profile and get_financial_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: call this tool when you need the combined overview, and call the individual sibling tools when only one part is needed. This directly answers the when-to-use-versus-alternatives question.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_business_profileGet business profileA
Read-only
Inspect

The business's own profile: name, contact details, industry, currency, tax rate, plan, financial year, entity type, and its income tax, VAT, company registration and payroll (PAYE/UIF/SDL) numbers. Financials are not included — use get_financial_summary for those, or get_business_overview for profile and financials in one call.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safe-read profile, and the description is consistent with it. It adds genuine behavioral context by scoping what is and is not returned (profile fields yes, financials no), which is the key decision input. It stops short of describing freshness/caching of the profile data, so it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and its contents, followed by the disambiguation. The field enumeration is long but earns its place because there is no output schema to carry that information; it is dense rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema in the definition, the description carries the burden of telling the agent what comes back, and it does so field-by-field, plus states the exclusion and the two alternatives. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document; the baseline for this case is 4. Nothing misleading is said about inputs, and the description correctly implies no arguments are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the business's own profile) and enumerates the exact fields returned, which is the operative content for a zero-param getter. The second sentence names the two sibling tools it is not, so an agent can distinguish it from get_financial_summary and get_business_overview 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: financials are excluded, use get_financial_summary for those, or get_business_overview for profile plus financials in one call. Both the when-not and the two alternatives are named with the condition that selects each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboardGet dashboardA
Read-only
Inspect

Read one dashboard with its tiles. An Overview still on its preset comes back resolved: true, its tiles built for this business.

NameRequiredDescriptionDefault
idYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description usefully adds that tiles are returned inline and that a preset Overview comes back with resolved: true and business-specific tiles. That is genuine behavioral context beyond the annotation, though the second sentence is compressed enough that an agent may not parse the resolved flag's meaning confidently.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the read behavior front-loaded and no filler. The trailing clause about the Overview preset is dense but still earns its place by disclosing resolution behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description covers the shape loosely (dashboard plus tiles, plus the resolved flag). It leaves out where to get a valid id and whether tile content is returned raw or evaluated — relevant given the many dashboard-tile siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single id parameter has no description, only min/max length. The description implies the id identifies a dashboard, but it does not say whether it is an id, a slug, or a name, nor how to obtain one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Read one dashboard with its tiles" gives a specific verb and resource, and the singular "one" distinguishes it from list_dashboards. It does not explicitly name evaluate_dashboard or get_business_overview as alternatives, so sibling differentiation is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by "Read one dashboard" plus the required id, but there is no explicit statement of when to pick this over list_dashboards or evaluate_dashboard. A single clause like "use evaluate_dashboard to render values" would have lifted this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_documentGet documentA
Read-only
Inspect

Get one document by id, with totals, status, line items, contact and money direction. Accepts any document id this business owns — including the invoice, quote and credit-note ids returned by list_documents and list_invoices. Find the id yourself with list_documents (query by number or contact); never ask the user for an id. A document's totals are its header $total and $vat; a line's $linetotal is before VAT and before any header discount, and its $salestaxes carry its tax, so never add lines up to quote a document's total or VAT.

NameRequiredDescriptionDefault
idYesDocument id.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds genuine context beyond that, notably scope ("any document id this business owns") and a data-interpretation pitfall: a document's totals are header $total/$vat, while $linetotal is pre-VAT and pre-discount, so lines must not be summed to quote totals. It doesn't cover failure behavior for unknown or unauthorized ids, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and return contents, then usage routing, then total semantics. Every sentence carries information, though the final sentence is dense and slightly overpacked with accounting caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description does the work of describing the return shape (totals, status, lines, contact, money direction) and the meaning of the monetary fields. What's missing is only edge-case behavior for invalid or foreign-owned ids.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one required parameter and 100% schema coverage, baseline is 3; the description earns an extra point by defining what counts as a valid id (invoice, quote, credit-note ids returned by list_documents and list_invoices), which the schema's bare "Document id." does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get one document by id") and enumerates what comes back: totals, status, line items, contact, money direction. It also distinguishes itself from list_documents/list_invoices by naming them as sources of ids, so an agent can tell the retrieval tool from the list tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operating instructions: find the id yourself via list_documents (query by number or contact) and never ask the user for an id. It also clarifies that invoice, quote and credit-note ids from list_documents and list_invoices are all valid inputs, which removes the main ambiguity in choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_emailGet emailA
Read-only
Inspect

Get one sent email's history record by id — subject, recipients, time sent, time received and why it failed if it did.

NameRequiredDescriptionDefault
idYesId of the email history record.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true and the verb 'get' make the read-only nature clear. The description also discloses that it returns failure reasons when applicable, providing transparency about the kind of data returned without suggesting side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the purpose and lists the returned fields without unnecessary detail. It is concise and well structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description compensates by enumerating the key output fields (subject, recipients, time sent, time received, and failure reason). This gives an agent sufficient context to know what to expect from the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the single id parameter as the identifier of the email history record. The description merely repeats 'by id' and adds no additional semantic detail beyond the schema, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (get one sent email's history record), the lookup method (by id), and the specific fields returned (subject, recipients, time sent, time received, failure reason). This is distinct from list_emails, which lists emails rather than fetching a single history record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a single email history record is needed by id, but it does not explicitly contrast with list_emails or other email-related tools. Guidance is present but only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_employeeGet employeeA
Read-only
Inspect

One payroll employee by id, with the same fields list_employees returns. ID and tax numbers are never returned. An id that is not this business's employee is an error.

NameRequiredDescriptionDefault
idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavior beyond the readOnlyHint annotation: sensitive fields (ID and tax numbers) are suppressed, and a non-matching id is treated as an error rather than an empty result. This clarifies privacy and failure semantics, though it doesn't cover pagination or exact error format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with no waste, and the core purpose is front-loaded ahead of the field/error caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-record getter with no output schema, the description supplies the return shape (same fields as list_employees) plus privacy and error behavior. Only the exact error/response form is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is one required id parameter, so the description carries the burden. It only restates 'by id' without giving format, type, or lookup expectations, adding marginal value over the bare schema property.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (payroll employee) scoped by id, and anchors the return shape by referencing the sibling list_employees. It is immediately clear what the tool returns, though the differentiation from list_employees is about field parity rather than use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'one payroll employee by id' and the comparison to list_employees, but there is no explicit when-to-use guidance or named alternative (e.g., use list_employees to enumerate). The agent must infer the single-record vs list routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_financial_summaryGet financial summaryA
Read-only
Inspect

Per-month financial aggregates: earnings, profit, cashflow, per-account expense/income rollups and inventory movement. Profile details are not included — use get_business_profile for those, or get_business_overview for both in one call.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, covering the safety profile. The description adds meaningful behavioral scope: it reports monthly aggregates, specifies included financial categories, and states that profile details are excluded. This goes beyond the annotation without 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first sentence front-loads the resource and key contents, and the second provides exclusions and routes to alternatives. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with no output schema, the description is complete enough: it says what data is returned, what is intentionally omitted, and which sibling tools cover the omitted data. An agent can select and invoke this tool correctly without needing more context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is no parameter documentation burden. The baseline 4 for parameterless tools applies, and the description appropriately focuses on output scope rather than parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (financial summary) and a clear verb ('get'), then enumerates the exact contents: per-month earnings, profit, cashflow, expense/income rollups, and inventory movement. It also explicitly differentiates itself from get_business_profile and get_business_overview, so an agent can distinguish it from nearby siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states what this tool does not include ('Profile details are not included') and names the alternatives: get_business_profile for profile details and get_business_overview for both in one call. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_guideGet guideA
Read-only
Inspect

Get the steps of a single guide by its id (as returned by list_guides). Read-only. A guide the business is not entitled to is NOT returned — call list_guides first and only request an id it listed.

NameRequiredDescriptionDefault
idYesThe guide id to fetch, e.g. "submit-vat-return" — exactly as returned in a list_guides row's id.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so 'Read-only' is largely redundant, but the description adds real behavioral context: the entitlement gate that suppresses non-entitled guides and the fact that the result is a set of steps. It does not describe error behavior for a non-existent or unentitled id, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with what the tool does, then the read-only note, then the precondition. Nothing is padded or restated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 an annotation covering safety and no output schema, the description is nearly complete, and 'steps of a single guide' conveys the return shape. It stops short of saying what a failed lookup yields, a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the id property already carries an example and the 'as returned in a list_guides row' note, so the schema does the heavy lifting. The description reinforces the provenance of the id but adds no new syntax or format detail beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

It states a specific verb (Get) and resource (the steps of a single guide) with a clear scope qualifier (by its id). This cleanly distinguishes it from list_guides, which enumerates rather than fetches one guide's steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to call list_guides first and to only request an id that list_guides returned, and it names the failure mode (an unentitled guide is not returned). The sequencing and exclusions are fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_help_articleGet help articleA
Read-only
Inspect

Read one help article by its slug (as returned by search_help_articles), as plain text, so you can walk the user through it. Read-only.

NameRequiredDescriptionDefault
slugYesThe article slug, exactly as returned in a search_help_articles row.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only'. Beyond that it adds genuinely useful behavior not present in structured data: the article is returned as plain text, which tells the agent how to consume the result given there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action and resource, then the provenance and output format, with no filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description covers action, input source, return format, and safety profile. The only minor gap is failure behavior for an invalid or unknown slug.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the sole parameter's provenance is already documented in the schema ('exactly as returned in a search_help_articles row'). The description echoes this constraint but adds no new syntax or format detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (one help article), keyed by slug, and explicitly distinguishes itself from the sibling search_help_articles, which returns the slug in the first place. An agent can tell this apart from search_help_articles or get_guide 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use: read a single article after search_help_articles produced the slug, in order to walk the user through it. It does not state exclusions (e.g. what to do if the slug is stale or not found), so it falls short of a full when/when-not rubric.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_payroll_setupGet payroll setupA
Read-only
Inspect

Read what this business's payroll accepts: pay frequencies, package kinds, statutory lines and whether each applies, line roles by category, reserved codes, formula names, the registrations held or missing, the payroll-liability accounts, how many templates, schedules and leave types exist, and the returns a pay run files (evaluate_report source ids). Read it before a payroll write. It reads only; nothing is changed.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the closing sentence 'It reads only; nothing is changed' largely restates that rather than adding new behavioral information. The genuinely additive part is the precondition framing ('read before a payroll write'), which tells the agent where this sits in a workflow. Nothing is said about response size, pagination, or cost, which matters given the breadth of data promised.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is a ~55-word comma-spliced list of nine-plus categories, which is hard to scan and buries the payoff categories ('registrations held or missing', 'returns a pay run files') in the middle of the run. The two short trailing sentences are tight and well-placed, and the list does carry real information, but a bulleted or shorter front-load would have been more usable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the entire burden of telling the agent what comes back, and it does so in detail across all the setup domains an agent would need before a payroll write. It is complete in coverage; it is only slightly weak in not indicating shape or scale of the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document and the baseline of 4 applies. The description correctly avoids inventing filter/scope arguments and instead frames the tool as implicitly scoped to 'this business'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Read what this business's payroll accepts') and enumerates the concrete categories returned: pay frequencies, package kinds, statutory lines, line roles, reserved codes, formula names, registrations, liability accounts, and report source ids. The mention of 'how many templates, schedules and leave types exist' implicitly separates it from the list_payslip_templates / list_leave_types / list_payrun_schedules siblings. It stops short of the 5 because the enumeration is dense enough that the core identity ('a setup/config snapshot') takes a moment to extract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one clear, actionable timing rule: 'Read it before a payroll write,' which is exactly the precondition an agent needs for save_payrun/populate_payrun flows. It does not name alternatives or state when-not to use it (e.g., versus get_business_profile or get_source_codes for a narrower lookup), so it falls short of explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_payrunGet payrunA
Read-only
Inspect

One pay run by id, with the same fields list_payruns returns. An id that is not this business's pay run is an error.

NameRequiredDescriptionDefault
idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds a genuine behavioral detail beyond that: ids are scoped to the current business and an out-of-scope id raises an error rather than returning empty/404 semantics. It still says nothing about response shape, pagination, or side effects (none expected).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the core identity ('one pay run by id') front-loaded and the constraint trailing. Nothing repeats the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-param read tool with annotations covering safety, the description covers what is needed; the 'same fields as list_payruns' note usefully compensates for the absent output schema. It does not say what happens for a malformed id, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required 'id' param, so the description must carry the load. It clarifies that id identifies a pay run belonging to this business, which adds scoping meaning beyond 'type: string', but gives no format hint (e.g. numeric vs opaque string).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource ('One pay run by id') and it explicitly relates itself to the sibling 'list_payruns' by stating it returns the same fields. An agent can tell it fetches a single pay run rather than enumerating them, though it does not spell out the single-vs-list choice as a routing rule.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: fetch one pay run when you already hold its id. There is no explicit 'use this instead of list_payruns when...' guidance, but the error note about non-owned ids gives the agent a usable precondition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_payslipGet payslipA
Read-only
Inspect

One payslip by id, with the same fields list_payslips returns. An id that is not this business's payslip is an error.

NameRequiredDescriptionDefault
idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior: the returned field set matches list_payslips (compensating for the absent output schema) and a tenant-scoping rule that a foreign id is an error. It stops short of describing the not-found error explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and followed by the return-shape and error-scope facts. No filler; every clause adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description covers return shape (same as list_payslips) and the tenancy error condition. It is nearly complete; the only gap is the precise not-found error semantics and any pagination/adjacent concerns, which do not apply here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single 'id' parameter, so the description carries the burden. It partially compensates by declaring the id is scoped to this business's payslip (an out-of-scope id is an error), but gives no format or type detail, which is typical for an id field but still a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('One payslip by id') and explicitly contrasts with the sibling list_payslips by noting field parity. An agent can distinguish single-fetch from list without opening the schema, though it does not distinguish itself from the other payslip siblings (save_payslip, delete_payslips).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'one payslip by id' suggests a single-record fetch versus list_payslips, but there is no explicit when-to-use/when-not guidance or named alternative beyond the implicit contrast. Adequate but leaves routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sales_tax_classificationsGet sales tax classificationsA
Read-only
Inspect

Per-entry sales-tax classifications for a period — the single feed every tax report reads: bucket, direction, capital, per-treatment and per-band splits, signed net/gross/tax. Live books through the flow filter, or a snapshot's frozen window with snapshotid.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.
periodEndNoPeriod end (YYYY-MM-DD), inclusive. Required for live classifications; defaults to the snapshot's as-of date when snapshotid is given.
snapshotidNoEvaluate FROZEN: read the period from this snapshot's filed listing with capture-time classification, instead of the live books.
periodStartNoPeriod start (YYYY-MM-DD), inclusive. Omit for no lower bound (or the snapshot's window start).

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation declares readOnlyHint=true, and the description does not contradict this. It mentions reading from live or snapshot sources, but does not add additional behavioral details like rate limits or side effects, which is acceptable given the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the primary purpose, and uses precise domain terminology. It is concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lists the expected data fields (bucket, direction, capital, etc.) and mentions pagination implicitly via the schema's cursor/limit parameters. It does not describe the output format explicitly, but given the tool's simplicity and the schema coverage, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions already thoroughly explain each parameter (e.g., periodEnd is required for live, defaults for snapshot). The tool description adds little beyond a conceptual 'flow filter' reference, but does not improve on the schema's clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states it returns per-entry sales-tax classifications for a period, and emphasizes it is the single feed every tax report reads. It also distinguishes live vs snapshot modes, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains that it serves as the single feed for tax reports, and clarifies when to use live books (via period filters) versus a snapshot (via snapshotid). It does not explicitly compare to sibling tools, but the guidance is sufficient for typical use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_source_codesGet source codesA
Read-only
Inspect

The statutory source codes a locale's returns print — for ZA, the ITR12: the 4000-series Other Deductions table (each box's code, section, whether the ledger can derive it, and the related carry-forward / variant / detail codes), the four PERSONAL deductions whose trade equivalents live in the business container instead (claiming both files the same expense twice), the rental container's 4210 profit / 4211 loss pair, and the trade source-code rules. Reference data: business-independent and stable, so read it once rather than per report.

NameRequiredDescriptionDefault
countryNoTwo-letter country code. Defaults to the business's own country.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint annotation by explaining what data is contained, including carry-forward/variant/detail codes, personal deduction rules, and trade source-code rules. It also reveals behavioral traits like stability and business-independence, which supports caching and repeated reuse. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that front-loads the core purpose and then enumerates the specific table contents without filler. It is longer than average, but the density is justified by the richness of the data being described; only modest restructuring would improve scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only reference lookup with one optional parameter and no output schema, the description is complete: it states what data to expect, the country scoping, the stable read-once usage guidance, and the specific sub-categories the agent will encounter. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents the single optional country parameter, including its default behavior. The description reinforces the locale-related scope with the ZA example but does not add substantial meaning beyond what the schema already states, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description defines the tool's exact resource: the statutory source codes a locale's returns print, with a concrete example (ZA ITR12) and enumerated sub-tables such as the 4000-series Other Deductions table and rental profit/loss codes. This level of specificity makes it unambiguous even among many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage guidance: this is reference data that is business-independent and stable, so it should be read once rather than per report. It does not explicitly name alternatives or describe when not to use it, but the guidance provided is actionable and relevant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_subscriptionGet subscriptionA
Read-only
Inspect

The business's stub subscription / billing line items — the plan they pay stub for; for the actions used this period and what is left, use get_action_usage. For the business's own profile use get_business_profile, and for its trading financials use get_financial_summary.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds only content scope ('line items', 'plan they pay stub for') and no behavioral context such as whether the subscription is current, whether line items are historical, or whether anything is paginated. With annotations covering the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the resource before listing the alternatives — good structure with no padding. It loses a point because the 'stub subscription / the plan they pay stub for' repetition is confusing rather than economical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no parameters, so the description is the only source for what comes back, and it only vaguely gestures at 'subscription / billing line items' without describing the shape (plan, price, line items, period). Complexity is low, but for a no-schema read tool the return scope should be pinned down better than 'stub subscription'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters (empty schema, nothing required), so there is no parameter semantics for the description to clarify. Baseline 4 applies — there is simply no gap to fill.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The resource is identifiable — the business's subscription/billing line items — and the description explicitly separates itself from three siblings (get_action_usage, get_business_profile, get_financial_summary). However, there is no verb and the phrasing 'stub subscription ... the plan they pay stub for' is muddled enough that an agent may be unsure whether this returns a plan, a billing line-item list, or both.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names three concrete alternatives and the condition that selects each (actions used this period → get_action_usage; profile → get_business_profile; financials → get_financial_summary), which is real routing guidance. It stops short of stating when this tool itself is the right call (e.g. for reviewing plan tier or seat count), so it is clear context rather than a full when/when-not spec.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_teamGet teamA
Read-only
Inspect

The business's team / members — each with their name, email, role and active status.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true already covers the read-only nature. The description adds that it returns specific member fields but does not mention any additional side effects, authentication, or rate limits. Given the annotation, the bar is lower, and this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, precise sentence with no extraneous information. It is well-structured and front-loaded with the main action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description names the key fields returned (name, email, role, active status), which is adequate for basic usage. It could optionally mention whether it returns all members or only active ones, but it is not a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to explain beyond what the schema shows. Baseline score of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the business's team or members with specific fields (name, email, role, active status). It is distinct from other tools by focusing on the team roster.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. While the name and description imply it is for fetching team information, it does not state conditions or preferences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hand_overHand overAInspect

Hand the question to the support team with the case written, so the customer never repeats themselves. Use it ONLY when a person must act, for one of these reasons: person (they asked for a person), refund (they asked for a refund or a reversal), legal-privacy (a legal, privacy, POPIA or data request), fault (something in the app is broken and needs fixing), billing-error (a charge looks wrong and money may need to move), account-security (someone else may have got into the account, or they are locked out of it because their second-factor recovery codes fail). Never to avoid a hard question. It opens a support conversation as them, with the case on it for the team, then opens the support chat. Check sent: when it is false nothing reached the team.

NameRequiredDescriptionDefault
kindNobilling, bank_feed, app, account, accounting, feature or other.
foundNoWhat you found this turn, plainly, for the team.
triedNoWhat you already told them, and why it didn't settle it.
chatidNoSet automatically — do not supply.
reasonYesWhy a person must act. One of: `person` (they asked for a person), `refund` (they asked for a refund or a reversal), `legal-privacy` (a legal, privacy, POPIA or data request), `fault` (something in the app is broken and needs fixing), `billing-error` (a charge looks wrong and money may need to move), `account-security` (someone else may have got into the account, or they are locked out of it because their second-factor recovery codes fail).
questionYesTheir question, in their own words, whole.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation flag is already conveyed. The description goes beyond that by disclosing side effects ('opens a support conversation as them', 'then opens the support chat') and a failure mode ('Check `sent`: when it is false nothing reached the team'), which is genuinely useful. It stops short of explaining permissions, rate limits, or whether the handover is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose, then usage criteria, then mechanism, then the `sent` check. Most sentences earn their place, though the six-reason enumeration duplicates the schema's `reason` description and pads the middle of the block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with no output schema, the description covers purpose, escalation criteria, side effects, and the post-call success signal (`sent`). Remaining parameter detail is fully handled by the schema's own descriptions, so 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.

Parameters3/5

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 restates the `reason` enum verbatim from the schema rather than adding new meaning, and says nothing about `kind`, `found`, `tried`, `chatid`, or `question` beyond the schema's own text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Hand the question to the support team with the case written') and immediately distinguishes from siblings (none of which escalate to humans), including the motivation ('so the customer never repeats themselves'). An agent can identify exactly what this tool accomplishes 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scoped: 'Use it ONLY when a person must act', followed by an enumerated list of six qualifying reasons, plus an explicit negative case ('Never to avoid a hard question'). This is textbook when/when-not guidance with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

include_transactions_bulkInclude transactions bulkAInspect

Include (un-ignore) many bank transactions in one atomic call — the exact inverse of excluding them. Restores the income/expense entries the exclude soft-deleted rather than creating duplicates, and only creates a fresh entry for a transaction that never had one. Safe to retry: a second call changes nothing.

NameRequiredDescriptionDefault
idsYesIds of the transactions to include (un-ignore) in the general ledger

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark this as non-read-only and non-destructive, but the description discloses meaningful behavior: it is atomic, it restores soft-deleted entries rather than duplicating them, it only creates a fresh entry when none existed, and it is idempotent on retry. This is exactly the kind of side-effect information an agent needs beyond 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences deliver the purpose, the core behavioral guarantee, and retry safety without repetition or fluff. The most important information is front-loaded in the first sentence. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter invocation with no output schema, the description covers what the tool does, what happens to existing entries, when a new entry is created, and retry semantics. An agent has enough information to decide whether to call it and to predict the outcome of doing so.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, ids, and the schema already covers it completely with a description. The tool description adds context about the bulk/atomic nature but not new detail about the parameter itself. Since schema description coverage is 100%, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Include (un-ignore) many bank transactions in one atomic call.' It further clarifies by naming its relationship to exclusion and explaining the intended effect on transactions. This makes the tool's purpose unambiguous and distinguishable from the broad sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates that this tool is for including previously excluded transactions and that it is the inverse of excluding them. It also explains safe-to-retry behavior, which gives the agent practical usage context. However, it does not explicitly name alternative tools or state when not to use it, so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_account_mappingsList account mappingsA
Read-only
Inspect

The chart-of-accounts category-to-account mapping. For the accounts themselves use list_accounts.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered, and the description adds no behavioral detail beyond that: no mention of pagination, ordering, or what the mapping entries contain. Since there is no output schema, this gap is more costly than it would otherwise be.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, and the resource definition is front-loaded ahead of the sibling routing. Nothing in the text is redundant with the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param list tool the description covers purpose and routing, but with no output schema an agent still cannot anticipate the shape of the returned mapping entries. It is minimally adequate rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to describe; baseline 4 applies. The description correctly spends its words on resource identity instead of inventing parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The noun phrase 'chart-of-accounts category-to-account mapping' names a specific resource, and the name supplies the list verb, so the intent is unambiguous. It also explicitly distinguishes itself from the closest sibling (list_accounts), though it never states outright what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'For the accounts themselves use list_accounts' is an explicit alternative with the condition that selects it, which is exactly the routing guidance an agent needs. It gives no other usage conditions, but with zero parameters there is little else to condition on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_accountsList accountsA
Read-only
Inspect

The business's chart of accounts: its own accounts, the default accounts, app and customer accounts. For the category-to-account mapping use list_account_mappings. When the full chart is slow to build, the answer is the chart without customer and uninstalled-app accounts, with partial: true and a hint; call again in a minute before concluding an account is missing.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the real behavioral burden and does so well: it discloses that a slow full-chart build yields a chart without customer and uninstalled-app accounts, flags partial: true, returns a hint, and advises a retry before treating an account as absent. That is exactly the kind of non-obvious runtime behavior 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the resource definition, then the sibling routing, then the partial-result caveat. Every sentence adds distinct value with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage and no output schema, the description supplies everything an agent needs: what it returns, which sibling to prefer, and how to interpret and recover from a partial response. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each of the five parameters (to, from, limit, query, cursor) already documented in the schema, including pagination and filter semantics. The description adds no parameter-level detail beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact resource returned (the chart of accounts) and enumerates its constituent parts: own accounts, default accounts, app and customer accounts. It also explicitly carves out the sibling list_account_mappings, so an agent can distinguish the two without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative tool and the condition that selects it ('For the category-to-account mapping use list_account_mappings'), and gives an explicit recovery instruction for the partial-result case ('call again in a minute before concluding an account is missing'). Both when-to-use and what-to-do-on-failure are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_appsList appsA
Read-only
Inspect

The catalogue of integrations (apps) a business can connect — bank feeds, payment providers, sales channels and payroll. Each entry carries the app's id, name, description, category, region and connection config. This is the public app store, not the business's installed apps.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with the readOnlyHint annotation and makes no conflicting claims; it adds context that the tool is a public store but does not describe side effects beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, focused, and front-loads the core purpose and distinction from installed apps without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It describes what the tool returns (each app's id, name, description, category, region, and connection config) and clarifies its scope, making it complete for a parameterless read-only listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, matching the schema; with no parameters there is nothing to explain, so the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists the public catalogue of integrations (apps) a business can connect, identifies the included fields, and explicitly distinguishes it from installed apps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear when-not-to-use by stating this is the public app store, not the business's installed apps, but does not explicitly name an alternative sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsList assetsA
Read-only
Inspect

List the business's fixed assets: each asset's name, purchase price, book value, accumulated depreciation, depreciation method and rate, useful life, and whether it was disposed of or sold.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the bar is lower. The description adds genuine value by naming the exact payload fields (purchase price, book value, accumulated depreciation, depreciation method/rate, useful life, disposal status), which matters because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The field enumeration is long but earns its place given the absence of an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, zero-required-parameter list tool with fully documented pagination params, the definition is nearly sufficient. The enumerated return fields compensate for the missing output schema; only usage routing is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both limit/cursor are fully documented in the schema, including pagination semantics and the next_cursor flow. The description adds nothing about parameters, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') plus a precise resource ('the business's fixed assets') and even enumerates the fields returned, so an agent knows exactly what this tool surfaces. It does not, however, contrast itself with siblings like create_asset or update_asset, so it lands just 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to use this tool versus alternatives such as get_business_overview or the asset mutation tools. There is no prerequisite, filtering, or scope guidance beyond the implicit 'this returns assets'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_bank_accountsList bank accountsA
Read-only
Inspect

List the business's bank accounts: each account's name, bank, type, currency, opening balance and the bank-reported balance as of $latestbalancedate (the statement's running balance, not the ledger). Each account carries private: true marks a personal account kept out of the books; never count its balance as business cash. Each account carries feed: feed is "live" (a bank connection fills it; provider, lastsync), "failing" (connected but broken; reason, lastfailed) or "manual" (no connection: entered by hand or by statement import; howtoget). Read it; never guess whether an account has a feed.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint already covers safety, and the description adds substantial behavioral context: the balance is bank-reported as of the latest balance date, not ledger balance, and private/feed semantics are explained. It does not discuss ordering, pagination, or response shape beyond field meanings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: it first states the resource and returned fields, then explains private accounts and feed statuses. Every sentence adds useful meaning, though the long parenthetical clauses make it slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema or input schema, so the description carries the full burden and does so: it names the returned fields, clarifies the balance source, and explains private and feed semantics. An agent has enough information to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no input parameters, so parameter semantics are not a meaningful burden here. The baseline for zero parameters is a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource—listing the business's bank accounts—and immediately enumerates the returned fields. It is clearly distinguishable from sibling tools like create_bank_account or update_bank_account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong interpretive guidance for using the results, especially that private accounts must not be counted as business cash and that feed status must be read rather than guessed. It does not explicitly compare against nearby alternatives, so it falls 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_binnedList binnedA
Read-only
Inspect

List binned (soft-deleted) records for the business — expenses, income, documents (invoices, bills, quotes, purchase orders, credit notes), clients, suppliers, bank transactions, products, variants, journal entries, messages and tags — newest deletion first. Payments binned as part of a document deletion are not listed separately; restoring the document brings them back.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare `readOnlyHint: true`, and the description adds the further behavioral detail of deletion-time ordering, plus the non-obvious edge case that payments associated with a deleted document are hidden from this listing and only reappear after restore. It does not contradict the annotation and adds useful semantic behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first front-loads the main action and scope, the second adds the crucial edge case. There is no filler, and every clause adds information directly useful to deciding and invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list operation without an output schema, the description covers everything an agent needs: what is listed, what is excluded, and the ordering. The payment caveat also prevents a realistic misunderstanding about what shows up in the result set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the parameter schema to explain. The absence of any parameters is accurately reflected by the empty `properties` object, and the description does not need to elaborate on parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and a precise resource ('binned soft-deleted records'), then enumerates all covered record types and specifies sorting ('newest deletion first'). It clearly distinguishes this list tool from brothers that list active records (list_invoices, list_clients, etc.) by its exclusive focus on binned items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear context: use this to see binned records for the business, and it adds an important functional caveat that binned document payments are not separately listed but will be restored with their document. It does not explicitly name alternatives like `restore_deleted` or state 'when not to use it', but its purpose itself implies the use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_clientsList clientsA
Read-only
Inspect

List the business's customers with id, name, email and invoiced/outstanding totals. Archived customers are included and carry archived: true — archiving hides nothing server-side.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds valuable behavioral context: archived customers are included and carry 'archived: true', with the note that archiving hides nothing server-side. This clarifies a potentially surprising behavior. The description also implies pagination via schema but doesn't repeat it. Overall, it adds meaningful behavioral disclosure beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. The core purpose is front-loaded, and the archive behavior is succinctly appended. Every word adds value; there is no redundancy or irrelevant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters and no output schema, but the schema itself thoroughly documents each parameter. The description covers the main output fields and the archive behavior. It doesn't explain the return structure (e.g., pagination fields) but the schema does, so the description is adequately complete for an agent to call it correctly. Minor gaps like mentioning the default limit are already in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, meaning all parameters (to, from, limit, query, cursor) have detailed descriptions. The tool description itself does not add further parameter semantics beyond what the schema provides. Per calibration, high coverage leads to a baseline of 3, and the description does not need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), the resource ('customers'), and the specific fields returned (id, name, email, invoiced/outstanding totals). It distinguishes itself from sibling tools like list_suppliers or list_accounts by explicitly naming 'customers' and the business context. The archive behavior is also clearly noted, adding specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives (e.g., list_suppliers, list_invoices). It provides context about including archived customers but offers no guidance on when this tool is preferred or when another list tool should be used. The purpose is clear, but there's no explicit routing or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dashboardsList dashboardsA
Read-only
Inspect

List the business's dashboards: the Overview first, then each custom one with its name, position and tile count.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true, so the safety profile is covered. The description adds real behavioral value by disclosing the result ordering (Overview first, then custom dashboards) and the fields each entry carries, which the agent could not know from the schema. It stops short of covering pagination or whether tile details are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no waste, front-loaded with the action and immediately followed by the useful ordering and field details. Nothing is redundant with the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description supplies the essential shape of the result (ordered, with name/position/tile count). It could be slightly more complete by noting whether tile contents are included or pointing to get_dashboard for detail, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline of 4 applies. The description correctly adds no parameter noise and instead spends its words on return-shape information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb (List) plus resource (dashboards) and goes further by stating the ordering and the fields returned for each entry (name, position, tile count). This makes it clearly distinct from get_dashboard, create_dashboard, and evaluate_dashboard in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the 'list all dashboards' framing suggests this is the entry point before calling get_dashboard or update_dashboard, but the description never states when to prefer this over get_dashboard or list_dashboard_tile_types, nor any preconditions. Adequate but with a clear gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dashboard_tile_typesList dashboard tile typesA
Read-only
Inspect

The tile catalogue: every tile type, its sizes and its config keys with their values and defaults.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the description's job is narrower. It does add real value by disclosing the shape of the payload — tile types, sizes, config keys, values and defaults — which goes beyond the annotation. It says nothing about pagination or size of the catalogue, but for a zero-parameter read the disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with a colon that introduces the concrete contents; nothing is redundant. It is slightly compressed — 'The tile catalogue' is a label rather than a verb phrase — but the meaning is immediately legible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries the burden of describing the return value, and it does so at a useful level (types, sizes, config keys, defaults). It does not explain how the catalogue should be used in a dashboard-building workflow, which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No misleading hints about input are present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (the tile catalogue) and enumerates what it contains: every tile type plus sizes and config keys with values and defaults. That clearly separates it from list_dashboards or get_dashboard, though it never explicitly names those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the noun 'catalogue' — an agent can infer this is the lookup to call before add_dashboard_tile or update_dashboard_tile, but the description never states when to use it or that it takes no arguments. No exclusions or alternative routing are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_documentsList documentsA
Read-only
Inspect

List the business's documents — invoices, quotes, credit notes, recurring invoices, bills, purchase orders, debit notes and goods received notes. This is the complete, authoritative document surface: it reads both document stores. Rows are paginated (50 per page, 200 max), so a count or total is only safe when taken from meta.total or from every page — never by summing one page's rows while meta.truncated is true. Rows come newest first. Optionally filter by type (invoice, quote, bill, …), direction (in/out), status (e.g. overdue, due, paid, partiallypaid), a query substring (reference/number, name, notes — jump straight to one document by its reference), currency (ISO 4217, e.g. USD), a due-date range (from/to), unpaid (only rows with an outstanding balance), min_outstanding (minimum outstanding amount) and/or repeating (only live repeat series) — combine e.g. type=bill + unpaid + status=overdue to pull only overdue bills in one call, or type=invoice + query= to fetch a specific invoice. To find what repeats, or before stopping a repeat, use repeating=true (with contact for one customer): type=recurring is a document type, not whether a series is running. Each row carries totals, outstanding, status, type, type_label and contact. Use get_document for one document's full detail.

NameRequiredDescriptionDefault
toNoOnly documents with a due date on/before this date (inclusive, ISO 8601; e.g. today to isolate bills due by now). Documents with no due date are kept.
fromNoOnly documents with a due date on/after this date (inclusive, ISO 8601, e.g. "2026-01-01"). Documents with no due date are kept.
typeNoThe kind of document. One of: invoice — Bill a customer for goods or services. Money in.; quote — A pre-sale estimate for a customer; becomes money in once accepted.; recurring — An invoice that repeats on a schedule. Money in.; debit_note — Reduce what you owe a supplier (offsets a bill). Money in.; credit_note — Refund or reduce a customer's invoice. Money out.; purchase_order — Order goods or services from a supplier. Money out.; bill — A supplier's bill that you owe. Money out.; grn — Record stock received against a purchase order. Money out..
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring match over the document's text (reference/number, name, notes, purchase order, contact and line items). Combine with type to jump straight to one document by its reference number, e.g. type=bill, query="4B66E86E-0286".
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.
statusNoFilter to documents whose computed status matches (case-insensitive), e.g. "overdue", "due", "paid", "partiallypaid", "sent", "draft". Combine with type=bill for overdue-bill analysis.
unpaidNoWhen true, return only documents with an outstanding balance (excludes fully paid / zero-outstanding rows).
contactNoFilter to documents for this contact id (a client or supplier).
currencyNoFilter to documents in this currency (ISO 4217 code, e.g. "USD", "ZAR"). Documents with no stored currency are excluded when set.
directionNoMoney direction filter: "in" for sales documents (invoices, quotes, debit notes), "out" for purchase documents (bills, POs, credit notes, GRNs).
repeatingNoWhen true, return only the documents whose repeat schedule is on: each live series' template. Generated copies and stopped series are left out. Pass a row's id to set_recurring_invoice to stop or change that series.
min_outstandingNoOnly documents whose outstanding balance is at least this amount (inclusive).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=true, and the description adds substantial behavior beyond that: page size 50 with 200 max, newest-first ordering, an explicit warning against summing a single page while meta.truncated is true, and the fact that rows with no due date or no stored currency are kept/excluded. It does not discuss any auth or rate-limit constraints, but for a read-only list tool that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool is and the pagination-count hazard before the filter enumeration, and every sentence is substantive. It is dense and long, but the length is driven by 13 parameters rather than padding; the filter list is a readable single sentence rather than a redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, yet the description covers the return surface itself — per-row fields (totals, outstanding, status, type, contact), meta.total/meta.truncated/next_cursor, and page ordering. Combined with 13 fully documented parameters, an agent has everything needed to call this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real value by explaining how filters compose, by demonstrating query as a reference-number jump, and by clarifying the recurring/repeating semantic trap that the enum description alone does not resolve. It does not add format details beyond the schema for from/to, limit or min_outstanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource with the full inventory of document kinds enumerated, plus the claim that it is 'the complete, authoritative document surface: it reads both document stores.' It explicitly contrasts with get_document, but does not address narrower siblings such as list_invoices or list_expenses, which an agent will see in the tool list and may pick instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete worked combinations (type=bill + unpaid + status=overdue; type=invoice + query=<ref>) and an explicit disambiguation warning: 'type=recurring is a document type, not whether a series is running' — use repeating=true instead. It also names the alternative for single-record retrieval ('Use get_document for one document's full detail').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_emailsList emailsA
Read-only
Inspect

List emails the business has sent, newest first, with their delivery state and times. Covers the last 30 days unless days/from-date say otherwise. Filter by status, kind or related entity, and page with cursor.

NameRequiredDescriptionDefault
daysNoHow far back to look, in days. Defaults to 30; pass 0 to read the whole history (slower).
kindNoOnly emails of this kind (e.g. "invoice", "reminder", "quote-accepted", "order-received").
limitNoPage size; defaults to 50, capped at 250.
queryNoCase-insensitive substring match on the subject line.
cursorNoOffset from the previous response's `cursor`; omit for the first page.
statusNoOnly emails in this delivery state: sent | delivered | bounced | complained | rejected | delayed | failed.
to-dateNoOnly emails sent at or before this epoch-millis timestamp.
contextidNoOnly emails about this entity — e.g. an invoice id, to see that invoice's send history.
from-dateNoOnly emails sent at or after this epoch-millis timestamp. Overrides `days`.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses behavioral traits: default 30-day time window, override via days/from-date, sorting newest first, filtering by status/kind/entity, and cursor pagination. This adds meaningful operational context without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core purpose, and every sentence adds functional detail (ordering, time window, filters, pagination). No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 optional parameters and no output schema, the description provides a solid overview including defaults and pagination. It does not describe the exact return format, but that is typical for list tools and the schema covers parameter details. Slightly more on response shape would push it to 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are individually documented. The description adds value by clarifying relationships: the 30-day default overridden by days/from-date, and cursor for pagination. This is beyond the schema's per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and the resource (emails the business has sent), with specific details on ordering (newest first) and included data (delivery state and times). This distinguishes it from sibling list tools like list_invoices or list_documents, and from get_email for single records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: to list sent emails with filtering and pagination. It does not explicitly name alternatives or exclusions (e.g., 'use get_email for a single email'), so it lacks explicit when-not guidance, but the purpose is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_employeesList employeesA
Read-only
Inspect

List the business's payroll employees with name, number, role, department, contact details, employments and standing package. ID and tax numbers are never returned. For one employee use get_employee; for their payslips use list_payslips.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered, but the description adds a genuinely useful privacy trait beyond structured data: 'ID and tax numbers are never returned.' It does not describe ordering or default result size, though the schema's limit description covers pagination mechanics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: scope first, then the data exclusion, then the sibling routing. Every clause carries information and nothing is repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers scope, returned fields, and sensitive-field exclusions, while pagination semantics live in the schema. Only minor gaps remain (result ordering, whether filters exist), which are not needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (limit, cursor) are fully documented in the schema, including default, returned pagination fields, and cursor round-tripping. The description adds nothing about parameters, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource ('List the business's payroll employees') followed by an enumeration of the returned fields, which tells the agent exactly what data comes back. It also names the sibling tools it is not (get_employee, list_payslips), so it is distinguishable 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to alternatives with conditions: 'For one employee use get_employee; for their payslips use list_payslips.' The agent knows both when this tool applies (plural listing) and which sibling to use instead for narrower scopes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_expensesList expensesA
Read-only
Inspect

List the business's expenses with amount, date, category account, linked bank transaction and notes. These are recorded expense entries; for recorded income use list_income, and for raw bank-feed lines use list_transactions.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
maxNoOnly rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set.
minNoOnly rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals no side effects, and the description adds useful behavioral details such as case-insensitive substring filtering, pagination semantics, and the promise that results are never silently truncated. This is transparent about how the tool behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the tool's purpose, and uses a second sentence only to clarify sibling-tool boundaries. No unnecessary words or redundant detail are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description names the key returned fields and the input schema fully documents filtering and pagination behavior. The tool is positioned clearly among related list tools, so an agent has enough context to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The main description does not add parameter-level meaning beyond what the input schema already provides. However, the schema descriptions are comprehensive and cover all seven parameters, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists business expenses with the relevant fields. It explicitly distinguishes this tool from list_income and list_transactions, making its purpose and scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description directly tells when to use this tool versus alternatives: recorded expenses here, recorded income via list_income, and raw bank-feed lines via list_transactions. Parameter descriptions also explain filtering and pagination usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesList filesA
Read-only
Inspect

The files in a folder — name, type, whether stub has finished reading it, and what it decided the document was. Omit folderid for every file. Contents are not returned here: read_file_rows reads what is inside one, a page at a time.

NameRequiredDescriptionDefault
pairedNoPROD-1302 pairing filter. true = only files already cross-linked to their invoice/receipt counterpart; false = only files not yet paired; omit for all.
folderidNoOnly files in this folder. Omit for all of them.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declaring the safety profile, the description adds real value: it discloses the exact shape of the returned records, reveals that a background process ('stub') may not have finished reading a file, and states that file bodies are excluded. It does not mention result limits, ordering, or pagination for this call itself, which is a notable omission for a listing tool with no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler: the field inventory first, then the scope default and the sibling hand-off. Every clause — including the contents exclusion — earns its place, and nothing is repeated from annotations or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read with no output schema, the description covers the important gap by describing the returned fields, and it clarifies the read-only scope. What's missing is the operational envelope: whether the result is paged or capped, and how to combine the `paired` filter with `folderid`. Those gaps are minor but real for a listing tool an agent may call on a large corpus.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 fully documented, and the description only restates the folderid default ('Omit folderid for every file') without adding anything new. The `paired` filter is not mentioned at all in the description; the schema's PROD-1302 note carries that burden entirely. Baseline 3 is correct when the schema does all the semantic work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (files in a folder) and enumerates the returned fields — name, type, stub processing state, and the document classification — so the agent knows exactly what this returns. It also explicitly carves out what it does NOT do (file contents), pointing to read_file_rows. The verb 'list' is only implied by the title, and it doesn't distinguish itself from other list_* siblings such as list_documents, but the folder-file scope is specific enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative for the adjacent need: 'Contents are not returned here: read_file_rows reads what is inside one, a page at a time,' plus the default-scope rule 'Omit folderid for every file.' That routes the agent correctly between metadata listing and content reading. No explicit when-not guidance beyond the contents exclusion, and the `paired` filter's use case lives only in the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_guidesList guidesA
Read-only
Inspect

List the guided walkthroughs available to this business — multi-step tasks (e.g. migrating from another accounting system, submitting a return) that stub can walk someone through step by step. Read-only; returns only guides this business is entitled to. Follow up with get_guide to read a guide's steps.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context by stating that only guides the business is entitled to are returned, which tells the agent the result set is permission-filtered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences and front-loads the core purpose, then adds examples, scope, and the follow-up action. Every sentence adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with no output schema, the description gives enough context to call it correctly: what it lists, what is excluded via entitlement filtering, and what to do next. It stops short of describing the returned guide fields, but the follow-up guidance to get_guide mitigates that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain and the baseline is 4. The schema is empty and the description correctly does not invent parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List the guided walkthroughs') and clarifies scope with concrete examples of what a guide is. It also distinguishes this tool from the sibling get_guide by explicitly positioning it as the discovery step before reading a guide's steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly implies this is the entry point for finding guided walkthroughs and explicitly says to follow up with get_guide. However, it does not compare against other help-related siblings like get_help_article or search_help_articles, so the when-not-to-use guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_incomeList incomeA
Read-only
Inspect

List the business's income entries with amount, date, category account and linked bank transaction. These are recorded income entries; for the sales documents behind them use list_invoices, and for raw bank-feed lines use list_transactions.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
maxNoOnly rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set.
minNoOnly rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful scope boundaries ('recorded income entries' vs. invoices/raw bank lines) but does not disclose further behavioral traits such as ordering, authorization needs, or what guarantees the API provides. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two purposeful sentences with no filler. The first states the resource and its key fields; the second routes to the relevant siblings. Essential differentiators are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool, the description plus the fully documented input schema and annotation is complete: it identifies what is listed, how it differs from related tools, and the schema covers all filter and pagination semantics. The limit parameter even documents response fields like next_cursor/truncated/total, compensating for the lack of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a detailed semantic description covering date handling, min/max inclusion rules, substring filtering, and pagination cursor mechanics. The prose description adds no parameter-level details, but with full schema coverage this is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the business's income entries'), enumerates the returned fields (amount, date, category account, linked bank transaction), and explicitly distinguishes itself from list_invoices and list_transactions. An agent can determine exactly what this tool does 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives and the conditions for choosing them: use list_invoices for the sales documents behind income entries and list_transactions for raw bank-feed lines. This gives an unambiguous routing rule for an agent comparing sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_invoicesList invoicesA
Read-only
Inspect

List invoices/quotes/credit-notes with totals, status, line items, client and payments. These are sales documents; for recorded income entries use list_income, and for raw bank-feed lines use list_transactions.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
maxNoOnly rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set.
minNoOnly rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already marks it as read-only, and the description adds non-obvious behaviors not covered by annotations: rows without a date are kept for date filters, rows without an amount are excluded when min/max is set, the query filter is case-insensitive and applied before pagination, and responses are never silently truncated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds value: purpose, sibling differentiation, parameter semantics, and pagination behavior are all covered without fluff. The structure follows a logical flow from what it does to how to use it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description mentions response fields (next_cursor, truncated, total) and how to use the cursor, and the purpose statement lists returned invoice fields. This is sufficient for an agent to call it correctly and process results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All seven parameters have descriptions that go beyond the schema: date filters clarify treatment of missing dates, min/max clarify treatment of missing amounts, limit explains default and pagination contract, query explains case-insensitivity and pre-pagination application, and cursor explains opaque usage. Schema coverage is 100% and enriched meaningfully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists invoices/quotes/credit-notes with specific fields (totals, status, line items, client, payments) and explicitly differentiates it from sibling tools list_income and list_transactions by naming the alternative tools and their use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance by contrasting with recorded income entries and raw bank-feed lines, and includes concrete pagination instructions (limit, cursor, next_cursor) and filtering semantics, leaving no ambiguity about invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_journal_entriesList journal entriesA
Read-only
Inspect

List the business's journal entries — each with its date, description, financial year, and debit/credit lines (accountid + amounts). Includes both manual entries and the ones auto-generated from source documents. Paginated.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that results are paginated and include both manual and auto-generated entries, enriching understanding of the tool's behavior. It does not mention ordering or potential edge cases, but the core behaviors are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at two sentences, front-loads the primary action, and efficiently communicates key details (inclusions, pagination) without extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While there is no output schema, the description lists the expected fields (date, description, financial year, debit/credit lines) and mentions pagination, which gives the agent a solid understanding of what to expect. It lacks explicit response structure, but this is covered indirectly via parameter descriptions for cursor and limit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with detailed descriptions for each parameter. The tool description itself does not add extra meaning beyond the schema, but the schema already provides clear semantics for all five parameters, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists journal entries with specific fields (date, description, financial year, debit/credit lines) and explicitly notes it includes both manual and auto-generated entries, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide guidance on when to use this tool over siblings like list_transactions or get_committed_ledger. It mentions pagination but lacks context on selection criteria, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_leave_movementsList leave movementsA
Read-only
Inspect

List the business's stored leave movements (opening balances and adjustments) with employee, leave type, kind, date and units. For applications for leave use list_leave_requests.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real domain context by enumerating what a movement represents (opening balances and adjustments) and the fields carried (employee, leave type, kind, date, units), which is more than the annotation conveys. It stops short of anything about ordering or scoping, so not 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The core purpose is front-loaded and the disambiguation follows immediately, which is exactly the right ordering for a routing decision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description compensates by naming the returned fields (employee, leave type, kind, date, units), and the schema fully covers pagination. Nothing an agent needs to select or invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (limit, cursor) are fully documented in the schema, including pagination contract and the 'never silently truncated' guarantee. The description adds nothing about parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('leave movements'), then defines exactly what those are ('opening balances and adjustments'). It explicitly distinguishes itself from list_leave_requests, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit alternative and the condition that selects it: 'For applications for leave use list_leave_requests.' Combined with the parenthetical '(opening balances and adjustments)', the boundary between this tool and its nearest sibling is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_leave_requestsList leave requestsA
Read-only
Inspect

List the business's leave requests with employee, leave type, start and end date, units, status, reason and who approved or declined it. For the leave types use list_leave_types; for balance movements use list_leave_movements.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe read profile is covered. The description adds the returned field set, but no behavioral details like permissions, rate limits, or pagination beyond what the schema provides. With annotations covering safety, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, then routing guidance. Every sentence earns its place with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description's enumeration of returned fields is valuable and sufficient. Pagination is fully covered by the schema parameter descriptions, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with limit and cursor fully documented in the schema. The description does not add any parameter meaning. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('leave requests'), scoped to 'the business's', and enumerates the returned fields. It distinguishes itself from list_leave_types and list_leave_movements by explicitly naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to list_leave_types for leave types and list_leave_movements for balance movements. However, it does not state when not to use this tool or any prerequisites/exclusions for listing leave requests.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_leave_typesList leave typesA
Read-only
Inspect

List the business's leave types with name, unit, paid flag, accrual method and rate, cycle and carry-over rules. For requests against them use list_leave_requests.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=true annotation already establishes this is a safe read. The description adds the concrete shape of what is returned, which is useful, but says nothing about ordering, pagination behavior (left to the schema), or any auth/rate considerations. Adequate but not rich beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core purpose front-loaded and the sibling routing placed last. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned fields, and pagination semantics live in the schema while the safety profile lives in the annotation. Nothing an agent needs to select and call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (limit, cursor) are fully documented in the schema, including pagination mechanics. The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the business's leave types') and enumerates the fields returned (name, unit, paid flag, accrual method and rate, cycle, carry-over rules), so the agent knows exactly what it gets. It also explicitly distinguishes itself from list_leave_requests, removing ambiguity among the leave-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit routing rule: 'For requests against them use list_leave_requests,' which cleanly separates the two leave-list tools. It gives no further when-to-use context (e.g., when a full type listing is needed vs. filtered lookups), but the primary disambiguation is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_loansList loansA
Read-only
Inspect

List the business's loans: each loan's name, lender, interest rate, original amount, and whether it is current or archived. amount is what was borrowed, not what is still owed; for the balance owed, read the loan's ledger account in a trial balance with evaluate_report.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description earns extra credit by disambiguating `amount` (borrowed, not owed) and routing the agent to the ledger account for balances — genuine behavioral context beyond the annotations. It says nothing about pagination or result size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: purpose plus returned fields first, then the semantic clarification/routing hint. Every clause earns its place and nothing is repeated from structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description usefully enumerates the returned fields and clarifies the one field most likely to be misread (`amount` vs balance owed). For a zero-parameter read tool this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case. There are no parameter semantics to convey and the description correctly spends no space on them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the business's loans') and enumerates exactly what each result contains (name, lender, interest rate, original amount, current vs archived). No sibling tool covers loans, so ambiguity is nil and an agent can select this immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use-elsewhere rule: for the balance owed, read the loan's ledger account via evaluate_report rather than relying on this tool's `amount`. It stops short of stating general scope or exclusions (e.g. whether archived loans are always included), so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_locked_periodsList locked periodsA
Read-only
Inspect

List the business's locked periods, newest first. A locked period freezes the books up to its end date: later changes to documents dated inside it wait as pending instead of moving the reported figures. Each period has its dates, reason, status, and how many changes wait as pending (added, edited, removed); the documents behind them are on the locked-periods page.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: newest-first ordering, the freeze semantics (changes inside a period become pending rather than altering reported figures), and the returned fields including pending-change counts. It omits any pagination or result-size behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and ordering before the conceptual explanation, and every sentence carries information (domain definition plus returned fields). It runs three sentences, which is on the edge of verbose for a no-argument list tool, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so reasonably by enumerating the fields (dates, reason, status, pending counts) and pointing to where the underlying documents live. Coverage is good, though the exact response shape is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing to disambiguate and the description correctly makes no parameter claims.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the business's locked periods') plus the ordering ('newest first'), and defines what a locked period is. It clearly identifies a unique resource among the many list_* siblings, so an agent can pick it out 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: the description explains the domain concept of a locked period, from which an agent can infer relevance, but it never states when to use this versus alternatives or any preconditions. There is no explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payrunsList payrunsA
Read-only
Inspect

List the business's pay runs with period window, pay date, frequency, derived status and pay-date action. Pay runs are cycle headers; their amounts live on the payslips (list_payslips). For one run use get_payrun.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful domain context including 'Pay runs are cycle headers' whose amounts live elsewhere, which prevents an agent from expecting monetary totals. It adds no auth or pagination-caveat detail, but that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and return fields, followed by the disambiguating routing notes. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description helpfully previews the return fields and clarifies the header-vs-amounts split. Pagination is handled by the schema, so nothing critical is missing, though deeper output-shape detail is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (limit, cursor) are fully documented with pagination behavior in the schema itself. The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (the business's pay runs) and enumerates the returned fields (period window, pay date, frequency, derived status, pay-date action). It explicitly distinguishes itself from two siblings, get_payrun for single runs and list_payslips for amounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names two alternatives with selecting conditions: 'For one run use get_payrun' and 'their amounts live on the payslips (list_payslips)'. This is clear routing guidance, though it doesn't cover other payrun-adjacent siblings like list_payrun_schedules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payrun_schedulesList payrun schedulesA
Read-only
Inspect

List the business's pay run schedules with enabled flag, frequency, pay day, next run, whether each run is populated with payslips, and what happens on the pay date. For the runs a schedule made use list_payruns.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds genuinely useful context by disclosing the returned fields of each schedule even though no output schema exists. It does not cover pagination behavior, but the schema's own parameter descriptions already explain next_cursor/truncated/total semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the resource scope and returned fields front-loaded and the sibling routing pointer placed at the end where it belongs. Every clause carries information an agent would otherwise have to infer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only list with no output schema, the description does the heavy lifting by enumerating the fields of each schedule row. It stops short of explaining the semantics of the flags it names (e.g. what 'enabled' or 'what happens on the pay date' concretely mean), which leaves a small gap given there is no output schema to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, both `limit` and `cursor` are fully documented in the schema, including the default of 50 and the cursor round-trip. The description adds no parameter-level detail beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the business's pay run schedules') and enumerates exactly what each row carries: enabled flag, frequency, pay day, next run, payslip population, and pay-date behavior. It also explicitly disambiguates from the closely-named sibling list_payruns by scoping that tool to the runs a schedule produced.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear routing rule: use list_payruns for the runs a schedule generated, implying this tool is for the schedule definitions themselves. It lacks an explicit 'when-not' or prerequisite statement (e.g. whether an empty result means no schedules configured), so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payslipsList payslipsA
Read-only
Inspect

List the business's payslips with employee, pay run, period, pay date, draft flag, gross, deductions, net and the earning, deduction and contribution lines. For one payslip use get_payslip; for the run headers use list_payruns.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read profile is covered by structured data. The description adds value beyond that by disclosing the scope (the business's payslips) and the exact result content, which serves as a lightweight return-format disclosure in the absence of an output schema. It does not cover ordering or any auth/rate-limit traits, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. The resource and returned fields are front-loaded, and the routing guidance is compressed into a single trailing clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so enumerating the returned fields in the description is exactly the right compensation, and the schema fully carries pagination. Combined with annotations covering the safety profile, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both limit and cursor are fully documented there, including default, pagination fields and the next_cursor round-trip. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (the business's payslips), then enumerates the fields returned (employee, pay run, period, pay date, draft flag, gross, deductions, net, earning/deduction/contribution lines). It explicitly names the sibling tools it is not, so an agent can distinguish it from get_payslip and list_payruns 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly routes the agent to alternatives with the selecting condition: 'For one payslip use get_payslip; for the run headers use list_payruns.' This is explicit when/when-not guidance rather than inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payslip_templatesList payslip templatesA
Read-only
Inspect

List the business's payslip templates: each named line set (earnings, deductions, contributions) with each line's kind, rate, quantity, amount and formula. Templates are master data; for issued payslips use list_payslips.

NameRequiredDescriptionDefault
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes a safe read, so the description only needs to add beyond that — and it does, by clarifying that these are master-data template definitions rather than issued payroll records. It doesn't cover pagination behaviour or volume characteristics in the prose, but the schema carries those.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads the identification plus the return shape, the second handles disambiguation from the sibling. No filler, no restatement of the title or name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully sketches what a template contains (line sets and their fields), which is enough for an agent to know what it will receive. Pagination semantics live in the schema, so the only minor gap is not describing ordering or volume of templates returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both limit and cursor are fully documented in the schema, including default, next_cursor round-tripping and no-silent-truncation. The description adds no parameter-level meaning of its own, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('List the business's payslip templates') and then enumerates the internal structure returned (named line sets of earnings/deductions/contributions, each with kind, rate, quantity, amount, formula). It explicitly differentiates itself from the sibling list_payslips, so an agent can separate the two 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the domain clearly ('Templates are master data') and routes the agent to list_payslips for issued payslips, which is real when-to-use guidance tied to a named alternative. It stops short of stating exclusions for this tool itself (e.g. that it is business-wide and unfiltered), so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_productsList productsA
Read-only
Inspect

List the business's products with price, cost, stock and sales totals. These are catalogue items for sale; for recorded money-out use list_expenses and money-in use list_income. Archived products are included and carry archived: true; archiving hides nothing server-side.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
maxNoOnly rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set.
minNoOnly rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, and the description adds real behavioral context beyond that: archived products are included, they carry archived: true, and archiving hides nothing server-side — a fact an agent could not infer from the schema. It does not restate pagination behavior, but the schema's limit/cursor descriptions already carry that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what the tool returns before the disambiguation and the archived caveat. Minor redundancy between 'Archived products are included' and 'archiving hides nothing server-side', but the repetition reinforces rather than pads.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return burden — and it does by naming the returned fields and the archived flag. Combined with fully documented parameters and a readOnly annotation, 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (from/to, min/max, query, limit, cursor) is fully documented in the schema. The description adds no extra parameter meaning — notably it never explains why a product listing accepts date and amount filters, which is the one place it could have compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list the business's products) and immediately characterizes the rows as catalogue items for sale, while naming the returned fields (price, cost, stock, sales totals). This separates it cleanly from list_expenses, list_income, and list_assets 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names two concrete alternatives with the condition that selects them: money-out goes to list_expenses and money-in to list_income. That is an explicit when-not routing rule for the most likely confusion, not an implied one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recurring_schedulesList recurring schedulesA
Read-only
Inspect

List repeat-invoice series: each one's customer, frequency, the invoice whose payment term sets the next due date (due_from), next copy, copies made so far and whether it is on. Pass clientid for one customer's series, or id (an invoice or any copy) for the series behind it.

NameRequiredDescriptionDefault
idNoA repeating invoice or any copy it made: shows the one series behind it, even when stopped.
clientidNoOnly this customer's repeat series. Find the id yourself with list_clients.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuine behavioral context by describing the returned record shape (customer, frequency, due_from, next copy, copies made, enabled state) and that an id lookup reveals the series even when stopped. It omits pagination/limits and result ordering, which keeps 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and its payload, followed by parameter routing. The field enumeration is dense but each item earns its place; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only two-optional-param list tool with no output schema, the description compensates by naming the fields returned, so an agent knows what to expect. Missing detail on result volume/limits and default no-param behavior keeps it below 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameter descriptions are already detailed, so the baseline is 3. The description restates the clientid/id dual-mode but adds only marginal meaning (the due_from explanation of which invoice drives the next due date), so it does not exceed the schema significantly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (repeat-invoice series) and then enumerates exactly what each series carries: customer, frequency, due_from, next copy, copies made, on/off state. An agent can distinguish this from list_invoices and list_payrun_schedules 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains the two selection modes: clientid for one customer's series, id (invoice or any copy) for the series behind it. It does not explicitly contrast with the sibling list_invoices or note that omitting both params lists everything, but the contextual guidance for each parameter is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sales_taxesList sales taxesA
Read-only
Inspect

List the business's sales taxes (VAT and the like): each tax's name, rate or fixed amount, whether it is added on top or included in the price, whether it can be claimed back, and its reference number.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. With no output schema, the description usefully discloses the shape of the returned records (tax name, rate or fixed amount, inclusive/exclusive, claimable, reference number), which is real added value. However it says nothing about pagination, ordering, or auth scope, so it is solid but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the resource front-loaded and the returned fields enumerated compactly. No wasted words, though the trailing field list is a touch dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only list tool with no output schema, the description covers both what the tool does and what comes back, so an agent has enough to invoke it correctly. Minor gap: no mention of ordering, pagination, or result size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies no filtering or input is needed, and there are no parameters to mis-specify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (the business's sales taxes), and enumerates the exact attributes returned (name, rate/fixed amount, inclusive/exclusive, claimable, reference number). This clearly distinguishes it from sibling mutations like add_entity_salestax, update_entity_salestax, and the related get_sales_tax_classifications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and the read-only nature of the tool, but there is no explicit guidance on when to call it versus alternatives such as get_sales_tax_classifications, nor any preconditions or exclusions. Adequate minimum-viable context, but nothing that routes the agent among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_suppliersList suppliersA
Read-only
Inspect

List the business's suppliers (id and name). Archived suppliers are included and carry archived: true — archiving hides nothing server-side.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered structurally. The description adds meaningful behavioral detail beyond annotations: archived suppliers are included and carry `archived: true`, and archiving hides nothing server-side. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with no filler. The core operation is stated first, and the archived behavior is added as a valuable clarification without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, readOnly annotation, and rich parameter schema, the description covers what an agent needs: what is returned, that archived suppliers are included, and the server-side behavior around archiving. The pagination details are already fully specified in the parameter descriptions, so repeating them here would add no value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 in the schema. The description does not add parameter-specific semantics beyond saying the response includes id and name, which is output-focused rather than input-focused. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('suppliers'), and also clarifies the response shape ('id and name'). It clearly distinguishes this from sibling list_* tools by naming the exact resource and noting archived suppliers are surfaced.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's intended use clear: retrieving the business's suppliers. The archived note adds useful context about when this tool is appropriate (even when archived suppliers are needed), though it does not explicitly name alternatives or state when-not-to-use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsList tagsA
Read-only
Inspect

List the business's tags: each label's name, colour, group and whether it is archived. Read this before tagging a record, so an existing tag is reused rather than a near-duplicate created.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value beyond that by disclosing the shape of each returned item (name, colour, group, archived) and the workflow reason to call it first, which matters because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero padding, with the scope of the listing front-loaded and the workflow guidance second. Every clause carries information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only listing with no output schema, the description covers what it returns (the four fields per tag) and why to call it before tagging. Nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case: there is nothing for the description to clarify beyond confirming a full unfiltered listing, and it introduces no misleading parameter language.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list the business's tags) and enumerates exactly what each entry contains: name, colour, group and archived status. This clearly separates it from the sibling mutators create_tag, update_tag, delete_tag and clear_entity_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit situational guidance: read this before tagging a record so an existing tag is reused rather than a near-duplicate created. That effectively routes the agent away from create_tag when a tag already exists, though the alternative tool is implied rather than named outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_transactionsList transactionsA
Read-only
Inspect

List the business's bank/feed transactions with signed amount, date, description, reference, running balance, linked income/expense ids and reconciliation status. Rows come newest first (by date, then id), 50 per page by default. When truncated is true there are older rows: pass the response's next_cursor back verbatim as cursor for the next page, or narrow with from/to. These are raw bank-feed lines; for recorded income use list_income, and for invoices/quotes use list_invoices.

NameRequiredDescriptionDefault
toNoOnly rows on/before this date (ISO 8601). Rows without a date are kept.
maxNoOnly rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set.
minNoOnly rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination.
fromNoOnly rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoCase-insensitive substring filter — keeps only rows whose text (name, notes, and other string fields) contains this. Applied before pagination, so total/next_cursor reflect the filtered set.
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.
bankaccountidNoOnly transactions on this bank account. Pass the bank account's id (as shown on a transaction's bank account, or in the business overview). Exact match; transactions with no bank account are excluded. Applied before pagination, so total/next_cursor reflect the filtered set.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description adds real behavioral context beyond that: sort order (newest first by date then id), default page size of 50, the meaning of truncated/next_cursor, and that filters apply before pagination. It does not mention auth requirements or rate limits, but for a read-only list tool this is solid disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what the tool returns, followed by pagination mechanics and then the sibling routing. No filler; each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly carries the return-shape burden by listing returned fields, ordering, and pagination signals. Combined with the routing guidance and the readOnlyHint annotation, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 from/to, min/max, query, cursor, limit and bankaccountid. The description only reiterates cursor/from/to usage without adding syntax or edge-case meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (bank/feed transactions) and enumerates the returned fields (signed amount, date, reference, running balance, linked ids, reconciliation status). It explicitly differentiates from siblings by naming list_income and list_invoices as the tools for recorded income and invoices/quotes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: raw bank-feed lines here, list_income for recorded income, list_invoices for invoices/quotes. It also states the pagination workflow (check truncated, pass next_cursor back, or narrow with from/to), so the agent knows both when to use it and how to proceed when results are cut off.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_document_sentMark document sentAInspect

Mark a document as sent without emailing it.

NameRequiredDescriptionDefault
idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states what the tool does (marks as sent) and what it does not do (does not email), which is transparent. The annotations (readOnlyHint false) are consistent with a state-changing operation but provide minimal detail, so the description carries the burden adequately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that contains no filler and directly conveys the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description adequately covers the primary context of use and the key distinction (no email). It does not mention return values or errors, but given the simplicity of the operation and the lack of an output schema, this is not a significant omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% parameter description coverage, and the tool description does not compensate by explaining that the 'id' parameter refers to the document ID. While the tool name and title imply this, the documentation leaves the parameter meaning implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'mark' and identifies the resource 'document', clearly stating the action and its key nuance (without emailing). This distinguishes it from send_document which emails the document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'without emailing it' provides a clear usage distinction from send_document, implying this tool should be used when the document needs to be flagged as sent but no email should be dispatched. However, it does not explicitly mention when to prefer it over other document-update tools like save_document.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_message_alertedMark message alertedAInspect

Mark a message as having been alerted (shown as an alert) to the current user.

NameRequiredDescriptionDefault
idYesId of the message.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is not read-only and not destructive; the description adds that the mutation is scoped to the current user's alert state. It does not disclose idempotency, permissions, or side effects, but for a simple state marker the annotations plus description are adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action, with no filler. The parenthetical clarifies terminology without bloating the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with annotations and no output schema, the description plus schema are sufficient for an agent to invoke the tool correctly. It could add a note about repeated calls or read-state alternatives, but these are not essential at this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'id' parameter is fully described in the schema as 'Id of the message.' With 100% schema description coverage, the description need not add parameter detail, and it doesn't.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Mark'), a resource ('a message'), and the precise state change ('alerted'), with a parenthetical clarifying that alerted means 'shown as an alert' and scoping it to 'the current user.' This distinguishes it from sibling tools like mark_message_read and mark_messages_read_bulk.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'to the current user' implies this is for per-user alert state rather than a global or read state, but the description does not explicitly say when to prefer this over mark_message_read, update_message, or other message mutations. Usage context is inferable but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_message_readMark message readAInspect

Mark one message or many as read by the current user. Send id for one message, which returns {error}. Or send ids (up to 1000) to mark many in one transaction, which returns {error, read: [id ...], errors: [{id, message} ...]}. That is partial success: ids this business does not own are skipped and listed in errors, and error is true only when nothing was marked.

NameRequiredDescriptionDefault
idNoOne message id to mark read.
idsNoUp to 1000 message ids to mark read in one transaction. Partial success: ids this business does not own are skipped and listed in errors.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description goes well beyond that: it discloses that ids not owned by the business are skipped and reported, that `error` is true only when nothing was marked, and that the bulk call is a single transaction. These are exactly the behavioral traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the purpose before branching into the two modes. Every clause carries information about behavior or return shape; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden and does so: it spells out {error} for the single case and {error, read, errors} for the bulk case, plus the partial-success rule. 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.

Parameters4/5

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 genuine meaning: the mutually-exclusive usage of `id` vs `ids`, the per-mode return shapes, and the 1000-item transactional limit with partial-success semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Mark one message or many as read by the current user') and immediately distinguishes the two operating modes via `id` vs `ids`, so an agent can tell this apart from siblings like mark_message_alerted, snooze_message, or update_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly routes the agent between the single-message path (`id`) and the bulk path (`ids`, up to 1000 in one transaction), and explains that partial success is possible. It does not, however, state when to prefer this over sibling message tools or mention any prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

match_suppliersMatch suppliersAInspect

Sets the SUPPLIER on every expense that has none; it never touches bank transactions or reconciliation, so to link entries to bank lines use match_transactions instead. It dedupes the supplier records first, then lets SuperCat predict each expense's supplier (canonicalised to the dedupe-group leader). Only proposals that clear SuperCat's strong-prediction bar (confidence >= 0.75 AND topsim >= 0.4 AND (support >= 2 OR topsim >= 0.85)) are auto-applied; weaker guesses are surfaced for confirmation, not applied.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is a non-destructive write. The description goes far beyond that: it discloses the dedupe-then-predict pipeline, the exact confidence/topsim/support thresholds for auto-application, and that weaker predictions are surfaced but NOT applied — critical for an agent to know the tool will not silently guess.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the sibling exclusion before the threshold mechanics. Dense but every clause earns its place; the nested boolean threshold expression makes it slightly heavier to parse than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter mutation with no output schema, the description covers what is modified, what is explicitly untouched, the algorithm's effect on supplier canonicalisation, and the auto-apply vs. propose-only split. Nothing an agent needs to decide or call correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema carries no semantics to add. Baseline for a parameterless tool is 4; the description correctly avoids inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource+scope: it sets the supplier on every expense that has none. It also explicitly distinguishes itself from the sibling match_transactions, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-not and names the alternative: it never touches bank transactions or reconciliation, so bank-line linking goes to match_transactions. The scope boundary is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

match_transactionsMatch transactionsA
Destructive
Inspect

BUSINESS-WIDE, DESTRUCTIVE, NO UNDO: pick this only to reconcile the WHOLE business, never for one record; to find the payment for one invoice or bill, use find_candidate_transactions instead. Reconciles the WHOLE business's books in one pass: it dedupes, categorises (writing an account onto every uncategorised entry), then links every dangling income & expense entry to its bank transaction — all PERSISTED immediately across ALL candidate entries at once. There is NO single-record targeting and NO undo. Matches deterministically where it can and escalates only what it cannot confidently link. Entries are ephemeral; this links them to the canonical transaction.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds crucial behavioral context: no undo, immediate persistence across all candidate entries, no single-record targeting, ephemeral entries linked to canonical transactions, and deterministic escalation. This goes well beyond what 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the most critical warnings (destructive, business-wide, no undo) and remains focused on actionable distinctions. However, it repeats the 'WHOLE' scope and 'NO undo' warnings, which adds slight redundancy even if intentional for emphasis.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no output schema, and a highly destructive operation, the description covers scope, behavior, side effects, alternatives, and reversibility. Nothing an agent needs to decide whether and how to call this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics for the description to add or compensate for. Baseline for zero parameters is 4; the empty schema is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reconciles the WHOLE business's books'), details the three operations (dedupe, categorise, link), and explicitly distinguishes itself from the single-record alternative find_candidate_transactions. An agent can immediately tell what this tool does and does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('reconcile the WHOLE business'), when-not-to-use ('never for one record'), and names the alternative ('use find_candidate_transactions instead' for one invoice or bill). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_destinationOpen destinationA
Read-only
Inspect

Open an allowlisted place in the app for the customer. Not how to reach a person: when they ask for one — "can I speak to someone", "talk to a person" — or one of hand_over's reasons comes up, call hand_over. It passes the team the case and opens the support chat itself. Open "support" here only when hand_over came back with sent false, or when they ask to see the support chat without needing anyone to act. Only allowlisted destinations work; an unknown one comes back as an error for you to relay. Reply warmly and briefly once you've called it.

NameRequiredDescriptionDefault
chatidNoSet automatically — do not supply.
destinationYesWhere to take the customer in the app. Only allowlisted destinations work; today the one available is "support", which opens the support chat.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description goes beyond them by disclosing allowlist enforcement and the failure mode ('an unknown one comes back as an error for you to relay') and by instructing a warm, brief reply after the call — behavior an agent could not infer from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every sentence carries routing, fallback, or error information. It is slightly baggy: the pronoun 'It' in 'It passes the team the case' is ambiguous, and the routing guidance wraps across three sentences where two would do, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter navigation tool with no output schema, the description covers the decisive cases: routing versus hand_over, the fallback condition, the allowlist and its error behavior, and the desired post-call reply. The only gap is what a successful call actually renders for the customer, which is minor given the annotations and schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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, including that chatid is set automatically and that 'support' is the current allowlisted destination. The description reinforces the allowlist constraint and its error outcome but adds no new format or value detail beyond the schema, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb+resource ('open an allowlisted place in the app for the customer') and immediately distinguishes itself from the sibling it is most likely to be confused with: hand_over. An agent can tell whether to navigate the customer or escalate to a human without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-not guidance ('can I speak to someone', 'talk to a person', or one of hand_over's reasons) and names the alternative tool to call instead, plus the exact fallback condition for using open_destination with 'support' (hand_over returned sent=false, or the customer just wants to view the chat). Nothing 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.

open_report_sessionOpen report sessionA
Read-only
Inspect

Open a report session: the business's flow entries are classified once and cached (Redis in prod), so every subsequent session evaluate is a slice over pre-classified rows — the fast path for interactive report screens. Costs one report load cold, nothing warm. The returned sessionkey is the dataset's build basis-t; a change heartbeat means re-ask and the dataset rebuilds automatically. Call this first, then pass the sessionkey to evaluate_report_session (one view) or evaluate_report_batch (many at once); for a single one-off report without a session use evaluate_report.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only declare readOnlyHint=true. The description adds substantial behavioral context: flow entries are classified once and cached in Redis, a cold session costs one report load while warm sessions cost nothing, and the dataset rebuilds automatically on a change heartbeat. This far exceeds the annotation baseline and helps the agent reason about performance and statefulness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, each serving a distinct purpose: definition/mechanics, performance profile, and invocation sequence with siblings. No fluff. The only slight blemish is the unexplained jargon 'build basis-t', which may confuse an agent, but overall the structure is tight and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description properly explains the returned sessionkey's role and the full session lifecycle: open, pass to evaluator tools, and automatic rebuild on heartbeat. It also covers cost and sibling comparisons, making the tool complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is an empty object with zero parameters, so there is nothing for the description to clarify about parameters. Per the rubric, a zero-parameter tool earns a baseline of 4, and the description correctly focuses on output behavior (the sessionkey) instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb-resource pair ('Open a report session') and immediately expands on what that means (classify flow entries once, cache, fast path for interactive report screens). It also names the sibling tools it is not (evaluate_report_session, evaluate_report_batch, evaluate_report), making differentiation unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: 'Call this first, then pass the sessionkey to evaluate_report_session (one view) or evaluate_report_batch (many at once); for a single one-off report without a session use evaluate_report.' This tells the agent exactly when to use this tool vs. its alternatives, with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

populate_payrunPopulate payrunAInspect

Fill a pay run with a DRAFT payslip for each employee on its roster who has none yet; running it again skips those already there. Drafts post nothing to the ledger. A pay run that finalises itself on its pay date is refused.

NameRequiredDescriptionDefault
idYes
employeesNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false and destructive=false; the description adds genuinely non-obvious behavior: drafts post nothing to the ledger, re-runs skip existing payslips (idempotent), and pay runs that finalise on their pay date are refused. These are the exact traits an agent needs before invoking, and none are derivable 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each carrying a distinct behavioral fact, with the core action front-loaded. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description thoroughly covers creation semantics, ledger impact, idempotency and refusal conditions. The only real gap is the undocumented parameters, which is a notable but bounded omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description never explains the `id` or `employees` parameters. It even muddies the picture by saying payslips are created 'for each employee on its roster', leaving it unclear whether the optional `employees` array narrows the roster or is required to populate at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fill/populate) and resource (pay run) plus the exact artifact created: a DRAFT payslip for each employee lacking one. This clearly distinguishes it from siblings like finalise_payslips and save_payslip 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to use it (populating a roster with drafts) and a when-not condition (auto-finalising pay runs are refused), plus idempotency guidance for repeat calls. It stops short of naming finalise_payslips as the follow-up alternative, so 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.

preview_payslipPreview payslipA
Read-only
Inspect

Price a payslip for a saved employee without saving it: gross, deductions, net and each line, with PAYE, UIF and SDL priced. Send rows in payvalues to see a change before you save it with save_employee. It reads only; nothing is stored or posted.

NameRequiredDescriptionDefault
paydateNoYYYY-MM-DD. The tax tables in force on this date price PAYE, UIF and SDL. Omitted, today.
employeeYesThe employee id. Their saved package, template and pay values price the slip.
frequencyNoThe pay cadence to price at. Omitted, monthly.
payvaluesNoRows put over the employee's saved pay values for this preview only, one per code. A sent row replaces the saved row for its code. Nothing is saved.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint already declares the safe read profile, and the description adds useful behavioral context: it computes PAYE, UIF and SDL, returns gross/deductions/net/line detail, and previews payvalues overrides without storing or posting anything. It does not cover permissions, error behavior, or rate limits, but it adds meaningful context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a specific purpose, then the preview workflow, then the safety note. It is appropriately sized and easy to scan, though the final sentence slightly repeats the earlier 'without saving it' point rather than adding new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the return content well: gross, deductions, net, each line, and statutory pricing. Combined with a fully described input schema and the readOnlyHint, it gives an agent enough to invoke the preview correctly and understand that nothing is persisted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the input schema already documents paydate, employee, frequency, and payvalues in detail. The description reinforces that payvalues rows override saved values for preview only, but adds little syntax or meaning beyond what the schema already provides; the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Price a payslip') for a saved employee and immediately distinguishes it from the saving action ('without saving it'). It also names the computed outputs (gross, deductions, net, each line, PAYE/UIF/SDL), so an agent can distinguish it from save_payslip or get_payslip 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly says when to use the tool: to preview a change before saving with save_employee, and specifically via rows in payvalues. It names the save alternative but does not explicitly route agents to get_payslip when they want an already-saved payslip, so the alternative guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_bill_matchesPropose bill matchesA
Read-only
Inspect

Pair ONE supplier's open bills to bank payments as a set, in one read-only call: each bill and each money-out bank line is used at most once, so a supplier who bills the same amounts every month cannot have one payment claimed by two bills. Pass supplier (sup-…) and optionally a from/to due-date range. A line in another currency is converted at its own date's rate and must land within 2% of the bill; among those, a line one day after the bill wins, then same-day, then by smallest FX gap. Returns {pairs [{bill, transaction, lag_days, gap_percent, tied}], settle_batches, unmatched_bills, unmatched_candidate_lines, unconvertible_lines, totals, matched, truncated, limit}. tied = true means another line fit that bill equally well, so ask the user about that pair. READ-ONLY: it proposes, never settles. Show the pairs; once the user confirms, send each settle_batches entry ({pairs [{bill, transaction}]}, at most 100 pairs) to settle_bills as its arguments. A bill in a foreign currency paid from a base-currency line may come back from settle_bills as "failed" with code "cross-currency-needs-fx"; leave those for the user.

NameRequiredDescriptionDefault
toNoOnly bills due on/before this date (inclusive, ISO 8601).
fromNoOnly bills due on/after this date (inclusive, ISO 8601).
supplierYesThe supplier id (sup-…) whose open bills to pair.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and the description reinforces 'READ-ONLY: it proposes, never settles', but it goes well beyond: the one-use-per-bill constraint, FX conversion at the line's own date rate, the 2% threshold, deterministic tie-breaking order, and the cross-currency-needs-fx failure mode from settle_bills. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: it leads with the core pairing action and constraint, then matching rules, then return shape and workflow. Every sentence conveys distinct information, though the volume is high enough that it reads as packed rather than lean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex matching tool with no output schema, the description fully compensates by enumerating the return fields inline (pairs, settle_batches, unmatched_*, totals, truncated, limit), explaining `tied`, and describing the downstream settle flow. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 supplier, from and to. The description restates the supplier format (sup-…) and due-date range but adds no syntax or meaning the schema lacks. Baseline 3 when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Pair ONE supplier's open bills to bank payments as a set, in one read-only call'. This clearly distinguishes it from siblings like match_transactions and settle_bills, and the one-to-one constraint is spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (pair open bills against money-out bank lines for one supplier), the workflow after calling (show pairs, then send each settle_batches entry to settle_bills), and the edge case (tied=true means ask the user). Alternatives and follow-ups are named directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_file_columnsRead file columnsA
Read-only
Inspect

The column headings of an uploaded CSV, and how many rows are under them. Read this before folding a column, so you name one that is actually there. To read the rows themselves, or a workbook or a PDF, use read_file_rows.

NameRequiredDescriptionDefault
fileidYesThe file to read.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true is already declared, so the safety profile is covered by annotations; the description adds that the output is headings plus per-column row counts and that the tool is scoped to CSV uploads rather than workbooks or PDFs. It does not say what happens if the fileid is not a CSV or is unreadable, which would be the remaining behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, with the return value front-loaded and routing to the sibling last; nothing is filler. The fragmentary opening sentence and the slightly colloquial 'so you name one that is actually there' cost it a point on polish rather than on length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work of describing the return value (column headings and their row counts) and the input constraint (CSV uploads only), and it names the correct sibling for other cases. Handling of malformed or non-CSV fileids is the one thing an agent could still be surprised by.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but the schema only says 'The file to read', which is generic; the description narrows that to an uploaded CSV and implicitly excludes workbooks and PDFs, adding real meaning about what a valid fileid is. It does not describe identifier format (id vs. path), so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

It states exactly what the tool returns – the column headings of an uploaded CSV plus the row count under each – and explicitly tells the agent it is not the row reader, pointing at read_file_rows for that. It lacks a leading verb ('list'/'read') and the first sentence is a noun fragment, which keeps it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete precondition ('read this before folding a column, so you name one that is actually there') and names the alternative tool with the conditions that select it (rows, workbooks, PDFs → read_file_rows). An agent can decide between this tool and the sibling without opening any schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_document_paymentRecord document paymentAInspect

Record a NEW payment against ONE document, in either direction; for several bills at once use settle_bills, and to correct a payment already recorded use update_document_payment. A money-in document (invoice, recurring invoice, quote, debit note) records the payment as an income; a money-out document (bill, purchase order, GRN, credit note) is settled by recording an expense whose accountid is the document's id — the tool dispatches on the document's direction, so pass the document id and the payment details either way. Find the id yourself with list_documents (query by number or contact); never ask the user for an id. Record only what was actually paid, never an amount made up to clear a gap: if the payment is already there and only an FX or rounding gap is left ('settle it', 'it's FX'), use save_document with settled true.

NameRequiredDescriptionDefault
idNoDocument id to record the payment against — a money-in document (invoice / recurring invoice / quote / debit note) or a money-out document (bill / purchase order / GRN / credit note). On update, the payment id.
dateNoDate the payment was received (ISO 8601).
nameNoLabel for this payment (e.g. "Deposit", "Final payment").
notesNoFree-text notes on the payment.
amountNoPayment amount in the payment's currency.
methodNoPayment method as free text (e.g. "cash", "card", "eft") — no fixed set.
paymentNoBank/ledger account id the money moved through — received into (money-in) or paid from (money-out) (see list_accounts).
categoryNoIncome category for the payment; defaults to Sales when omitted.
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
exchangerateNoManual FX rate to the business base currency; omit to use the stored/auto rate.
transactionidNoBank transaction id that paid this document. When the line already carries its own unallocated income of the same amount and currency, that income is linked to the document instead of recording a second one.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly=false, destructive=false); the description goes much further by explaining that the tool internally dispatches on document direction, that money-out documents produce an expense whose accountid is the document id, and the linking behavior when a matching unallocated income exists (via transactionid). It also constrains correctness ('record only what was actually paid'), which is real behavioral guidance not present in any annotation or schema field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verb/resource, then alternatives, then the direction mechanics, then the correctness constraint. Dense but every sentence carries information; the single-block paragraph is heavier than ideal, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Handles the tricky parts of a 12-param, zero-required-parameter mutation tool: id discovery, direction dispatch, alternatives, and the FX-gap edge case. The notable gap is that it never clarifies which optional fields are effectively mandatory to actually record a payment (amount, date, payment account), leaving an agent to infer that from an all-optional schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all 12 parameters in detail. The description adds only the high-level point that the same id and payment details are passed for either direction, which is helpful but doesn't add per-parameter 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (record a NEW payment against ONE document) plus the direction-agnostic scope, and explicitly distinguishes itself from settle_bills and update_document_payment. The money-in vs money-out dispatch rule lets an agent tell exactly what this tool covers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names both alternatives with the selecting condition ('for several bills at once use settle_bills', 'to correct a payment already recorded use update_document_payment'), plus a further route to save_document for pure FX/rounding gaps. It also gives an explicit process rule: find the id via list_documents, never ask the user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_business_dataRefresh business dataAInspect

Clear the business's cached data so the next read recomputes from source. Call when data appears stale — e.g. a recent change isn't reflected in reads.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it clears cache and causes recomputation. Annotations indicate not read-only and not destructive, which aligns. No hidden side effects mentioned, but core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with action and purpose. Each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description fully covers what the tool does and when to use it. No missing essential context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; schema coverage is 100%. Description adds no parameter-specific information, so baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the tool's action (clears cached data) and its purpose (recompute from source). Specific verb 'clear' and resource 'cached data'. Differentiates from sibling read tools by implying a refresh action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit condition 'Call when data appears stale' with an example. Does not mention alternatives, but the trigger is clear. Slightly less than perfect because it doesn't say when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_dashboard_tileRemove dashboard tileCInspect

Remove one tile from a dashboard.

NameRequiredDescriptionDefault
tileIdYes
dashboardIdYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description carries a lower bar, but it adds nothing: it does not say whether removal is permanent, whether the tile's underlying report/data survives, or what happens if tileId is unknown. Most notably, a 'remove' operation paired with destructiveHint=false deserves an explicit note about reversibility, which is absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. It is efficient, though the terseness comes at the cost of the missing context noted elsewhere rather than being a wording defect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-ID mutation with no output schema, the description is minimally sufficient to attempt the call, but it omits reversibility, error behavior on missing tiles, and how to obtain the required IDs — gaps that matter for a destructive-ish operation sitting among many dashboard siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are required and schema description coverage is 0%, so the description is the only source of parameter meaning. 'One tile from a dashboard' only restates that both IDs are needed; no format, ID provenance (e.g., from get_dashboard or list_dashboard_tile_types), or validation behavior is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Remove one tile from a dashboard.' An agent can immediately tell this deletes a single tile rather than a whole dashboard or updating tile config, differentiating it implicitly from delete_dashboard and update_dashboard_tile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no mention of the closely related siblings (update_dashboard_tile for editing, delete_dashboard for removing all tiles, add_dashboard_tile). The agent must infer that this is the correct tool from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_document_contactRemove document contactA
Destructive
Inspect

Detach the contact (client or supplier) from a document. Pairs with set_document_contact.

NameRequiredDescriptionDefault
idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive, and the description adds useful scope: it detaches a contact rather than deleting the client/supplier or the document. This clarifies what exactly changes, with no contradiction of 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two brief sentences with no filler. The main action is front-loaded and the sibling pointer adds value without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool, the description is mostly adequate and the destructive annotation covers the risk profile. However, the ambiguous id parameter and lack of any statement about result/return leave a noticeable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not clarify what the required 'id' refers to (document id, contact id, or relation id). The only implicit hint is 'from a document,' which is insufficient for reliable invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Detach'), names the resource ('the contact (client or supplier) from a document'), and immediately distinguishes its relationship to set_document_contact. An agent can tell this is the inverse operation of its sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Pairs with set_document_contact' provides a clear alternative and signals this tool is the counterpart/undo for setting a contact. It doesn't spell out explicit when-not conditions, but the inverse relation is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_fileRemove fileA
Destructive
Inspect

Remove (detach) a file from an entity by id. This only retracts the link between the file and the record — the underlying file is not deleted from storage and the entity itself is unchanged. Unlike the delete_* tools (delete_document, delete_folder, delete_expense, …) which remove whole records or folders, this leaves both the file and the entity intact.

NameRequiredDescriptionDefault
entityYesEntity kind to attach the file to, e.g. "expense", "income", "asset", "transaction", "entry", "client", "supplier", "product". For any document — invoice, quote, credit/debit note, purchase order, bill or goods-received note — use "contract" (its id may start with cont-, inv- or order-); the correct storage attribute is resolved from the id, so a bill (cont-… id) also resolves whether you pass "contract", "bill" or "invoice".
fileidYesId of the uploaded file to attach (see /file/upload).
entityidYesId of the entity to attach the file to.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite destructiveHint true, description clarifies that only the link is removed, not the file or entity. This accurately discloses side effects and allays concerns about data loss.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main description is concise and well-structured, but the entity parameter description is excessively long and includes tangential resolution behavior, adding noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential semantics and distinguishes from delete_* siblings. It could explicitly reference attach_file as the inverse operation, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are documented, but descriptions use 'attach' rather than 'remove/detach' (e.g., 'Id of the uploaded file to attach', 'Id of the entity to attach the file to'), which is inconsistent with the tool's purpose and could mislead an agent. Entity description is also overloaded with attach-specific resolution detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it removes/detaches a file from an entity by id, and distinguishes from delete_* tools, making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts with delete_* tools to prevent misuse, explaining that the underlying file and entity remain intact. This gives clear guidance on when to choose this tool over destructive alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_deletedRestore deletedAInspect

Restore a binned (soft-deleted) record by kind + id, undoing its delete. Restoring a document (invoice, bill, quote, purchase order, credit note) also restores the payments that were binned with it. Idempotent — restoring a record that is not binned changes nothing.

NameRequiredDescriptionDefault
idYesThe binned record's id.
entityYesThe binned record's kind: "expense", "income", "contract" (any document — invoice, bill, quote, purchase order, credit note; "document" is accepted too), "invoice" (a legacy-store invoice or quote), "client", "supplier", "transaction", "product", "variant", "journal-entry", "message" or "tag".

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description adds value by disclosing the cascade behavior (restoring documents also restores associated payments) and idempotency. This goes beyond the annotation hints and clarifies the side effects of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences convey the core action, the key behavioral nuance (cascade restore), and idempotency with zero wasted words. The most critical information (what it does and its safe-to-call nature) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with full schema coverage and no output schema, the description covers the primary operation, the cascade side effect, and idempotency—all that an agent needs to call it correctly. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters (id and entity) fully described in the schema. The description adds no additional parameter-level detail; it focuses on behavior rather than parameter syntax or allowed values, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Restore' and the resource 'binned (soft-deleted) record' identified by kind + id, explicitly undoing a delete. It distinguishes from sibling delete_* tools by being the inverse operation, and the mention of specific document types clarifies scope without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when a record is binned and needs to be restored, and it explicitly notes idempotency ('restoring a record that is not binned changes nothing'), which guides safe usage. It does not mention alternatives like list_binned to obtain the id, but the context is clear enough for an agent to infer the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_clientSave clientAInspect

Create or update a customer. Pass an id to update that customer; omit id to create a new one. Returns the new client id on create. Updating an existing customer with an opening date later than its own earliest invoice or receipt is refused, unwritten, with code confirm-required until the same call is repeated with confirm true. To create/update many at once, send an items array — one all-or-nothing transaction with a single ledger recompute; each item with an id updates, each without creates.

NameRequiredDescriptionDefault
idNoClient id. Present → update that client; omit → create a new one.
cityNoCity.
nameNoDisplay name / description of the client.
emailNoClient email address.
itemsNoVector of client objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
hiddenNoWhether this client is hidden from lists.
numberNoMain telephone (landline) number of the client, beside the contact person's contactnumber. Trimmed; a blank value on update clears it.
suburbNoSuburb or district.
addressNoStreet address line 1.
confirmNoPROD-1950: required only to save an opening date that is LATER than the customer's own earliest invoice or receipt. Without it that one case is refused, unwritten, with code confirm-required plus earliesttransactiondate and transactionsbefore, so the caller can show what the date would exclude from the debtors balance and let the user override it.
countryNoClient country (ISO code or name).
starredNoWhether this client is marked as a favourite.
websiteNoClient website, e.g. www.example.co.za. Trimmed; a blank string clears it, null leaves it unchanged.
address2NoStreet address line 2.
archivedNoWhether this client is archived. Archiving is a status flag only: the server stores it and still returns archived clients on every list, report and total. The apps filter on it.
contactsNoThe full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.
addressesNoThe full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.
vatnumberNoVAT / tax registration number.
postalcityNoPostal address city.
postalcodeNoPostal or ZIP code.
contactnameNoName of the primary contact person.
creditlimitNoMost this customer may owe, in base currency. Changing or clearing a stored limit needs the Extend credit over limit permission.
openingdateNoDate the opening balance applies from (ISO 8601).
contactemailNoEmail of the primary contact person.
customercodeNoYour internal customer/account code for this client.
postalsuburbNoPostal address suburb.
contactnumberNoPhone number of the primary contact person.
postaladdressNoPostal address line 1, e.g. a PO Box.
openingbalanceNoOpening balance amount carried for this client at openingdate.
postaladdress2NoPostal address line 2.
documentaddressNoWhich address documents print: physical (default) or postal.
clearcreditlimitNoWhen true, removes the stored credit limit.
postalpostalcodeNoPostal address postal code.
registrationnumberNoBusiness registration number.
clearopeningbalanceNoReserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare non-read-only and non-destructive; the description adds substantial context beyond that — the returned id on create, the confirm-required refusal code for late opening dates, and the all-or-nothing single-ledger-recompute semantics for `items`. It omits auth/permission implications (e.g. the Extend credit over limit permission) and the fact that `contacts`/`addresses` replace and remove stored entries, both of which live only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the core create/update contract, then the edge case and the batch mode. Slightly redundant with schema text ('each item with an id updates, each without creates' duplicates the `items` description), but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 35-parameter, zero-required upsert tool with no output schema, the description covers the decision logic (create vs update vs batch), the one notable failure mode and its retry protocol, and the create return value. The remaining field-level detail is fully specified in the schema, so an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema — including the id-vs-create rule and the items array. The description largely restates those same rules rather than adding new semantics (formats, defaults, limits), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create or update a customer') and immediately disambiguates the two modes: id present means update, absent means create. No sibling tool (save_supplier, save_employee) operates on this resource, so no explicit differentiation is required for an agent to pick it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditions for each mode: pass id to update, omit to create, and use `items` for bulk 'preferred over repeated calls'. It also explains the confirm-retry path. It stops short of naming exclusions or alternatives (e.g. list_clients to find an id, delete_client for removal), 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.

save_documentSave documentAInspect

Create or update a WHOLE document and its header (contact, dates, type, parent); to change lines on an existing document without resending it use update_document_item, and to add one line use add_document_line. Works for documents of ANY kind — all eight document types are supported here, not just invoices: invoice, quote, recurring, debit_note, credit_note, purchase_order, bill, grn (the type enum below documents what each one is for). Credit notes and debit notes are raised through this same tool — pass the matching type and, where it relates to an existing document, its id as parent. For one document, send its fields inline (pass an id to update, omit + include type to create). To create/update many at once, send an items array — preferred over repeated calls: the whole batch is one all-or-nothing transaction with a single ledger recompute. Each item with an id updates; each without creates and must include type. This manages the document as a whole; to edit individual line items on an existing document use update_document_item (or update_document_items_bulk).

NameRequiredDescriptionDefault
idNoDocument id. Present → update that document; omit → create a new one (must include type).
dateNoDocument date (ISO 8601).
nameNoDisplay name / title of the document.
sentNoWhether the document has been sent to the recipient.
typeNoThe kind of document. One of: invoice — Bill a customer for goods or services. Money in.; quote — A pre-sale estimate for a customer; becomes money in once accepted.; recurring — An invoice that repeats on a schedule. Money in.; debit_note — Reduce what you owe a supplier (offsets a bill). Money in.; credit_note — Refund or reduce a customer's invoice. Money out.; purchase_order — Order goods or services from a supplier. Money out.; bill — A supplier's bill that you owe. Money out.; grn — Record stock received against a purchase order. Money out..
itemsNoVector of document objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates and must include type.
notesNoFree-text notes.
clientNoClient id, or an exact client name to resolve (see list_clients).
lockedNoWhether the document is locked against further edits.
numberNoDocument number; auto-generated if omitted.
parentNoId of the parent document this one derives from (e.g. the invoice a credit note relates to).
contactNoContact id, or an exact client/supplier name to resolve (client for money-in document types, supplier for money-out; see list_clients / list_suppliers).
duedateNoPayment due date (ISO 8601).
messageNoMessage shown to the recipient on the document.
settledNoSet true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; bad debt is written off with write_off_document, which also reverses the VAT.
showvatNoWhether to display the VAT/sales-tax line on the document.
acceptedNoWhether the recipient has accepted the document (e.g. a quote).
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
shippingNoShipping amount added to the document total.
showbankNoWhether to display the business's banking details on the document. Defaults to true on create; only shown to recipients on money-in documents (invoices, quotes).
supplierNoSupplier id, or an exact supplier name to resolve (see list_suppliers).
accountidNoBank/ledger account id the payment moved through (see list_accounts).
descriptionNoFree-text description of the document.
settleddateNoDate the settle entry posts, when settling an existing document (ISO 8601, YYYY-MM-DD). Omit for the default date.
showdepositNoWhether to display the deposit line on the document.
accepteddateNoDate the document was accepted (ISO 8601).
paymentnotesNoFree-text payment instructions shown on the document.
showdiscountNoWhether to display the discount line on the document.
showshippingNoWhether to display the shipping line on the document.
baseaccountidNoBase/control account id override; rarely needed — defaults from the category.
depositamountNoExplicit deposit amount; used instead of the percentage when deposituseamount is true.
invoicebankidNoPROD-2443. :bankaccount/id of one of the business's own bank accounts to show on this document instead of the default invoice bank. "$delete" clears it back to the default; null or omitted leaves it unchanged. An id the business does not own is refused.
accountpaymentNoAmount paid against the document at save time.
depositpercentNoDeposit as a percentage of the total.
discountamountNoExplicit discount amount; used instead of the percentage when discountuseamount is true.
discountpercentNoDiscount as a percentage of the subtotal.
showpaymentlinkNoWhether to include an online payment link on the document.
deposituseamountNoWhen true, use depositamount instead of the percentage.
settledaccountidNoWhere the settle gap posts, when settling an existing document: a Chart of Accounts account name or id (see list_accounts). Omit to post to Settlements, or to Foreign Exchange for a foreign-currency document.
discountuseamountNoWhen true, use discountamount instead of the percentage.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds the key behavioral fact that a batch is one all-or-nothing transaction with a single ledger recompute, which is real consequence information. It does not discuss whether omitted fields are cleared on update or what partial failures look like, leaving some mutation semantics unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and information-dense, with the create/update rule and batch guidance clearly sequenced. It loses a point for redundancy: the 'edit individual line items' alternative is stated twice, once at the top and again in the final sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 40-parameter mutation tool with no output schema, the description covers the essential decision points: whole-vs-line scope, create-vs-update, batch atomicity, and document-type coverage. It relies entirely on the schema for the settle/payment interplay and does not say what the save returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains every parameter, including `settled` and `invoicebankid`. The description adds only modest meaning beyond it: the id-vs-type create/update contract and the credit/debit-note pattern of passing matching `type` plus `parent` id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create or update a WHOLE document and its header') and immediately scopes it against siblings (update_document_item, add_document_line). It also enumerates the eight supported document types, so the agent knows the tool is not invoice-only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use this for whole-document create/update, use update_document_item/update_document_items_bulk for line edits, use add_document_line to add a line. It also states that batch `items` is preferred over repeated calls and explains the id-present/id-absent rule for each item.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_employeeSave employeeAInspect

Create or update a payroll employee: name, number, contact and identity details, role, department, employments and standing package. Omit id to create; pass an id to update that employee. An update that ends the employee's employment (a new end date with no employment starting the next day) files their tax certificates; a status change, a re-sent end date or a create files nothing. Writes no payslip and posts nothing to the ledger.

NameRequiredDescriptionDefault
idNo
cityNo
nameNo
roleNo
emailNo
notesNo
numberNo
suburbNo
addressNo
countryNo
starredNo
address2No
archivedNo
idnumberNo
birthdateNo
taxnumberNo
departmentNo
postalcodeNo
employmentsNo
packagekindNoHow the package is paid. annual, monthly and weekly: packageamount is the pay for that period and packagequantity is not sent. hourly and daily: packageamount is the RATE per hour or day and packagequantity is the normal hours or days per week. "$delete" clears it.
jurisdictionNoThe employee's jurisdiction id within the business's payroll pack, when the pack has more than one.
contactnumberNo
packageamountNoThe package amount; see packagekind. "$delete" clears it.
packagequantityNoNormal hours or days per week, for an hourly or daily package only. "$delete" clears it.
paysliptemplateNoThe id of the payslip template whose lines this employee's payslips start from.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses the actual side-effect conditions: an update that ends an employment by adding a new end date with no next-day employment files tax certificates, while a status change, re-sent end date or create files nothing. It also explicitly bounds scope by stating no payslip is written and nothing posts to the ledger. That is exactly the behavioral context an agent needs before mutating payroll data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the verb and the create/update rule, with the payroll side effects stated last. The middle sentence is clause-heavy ('a new end date with no employment starting the next day') but every detail is load-bearing for correct invocation, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a 25-parameter upsert with no required fields and no output schema, so the agent must infer what constitutes a minimally valid create or update. The description handles the side-effect semantics well but leaves a substantial gap on parameter-level requirements and dependencies (template ids, jurisdiction, employment status). Adequate to call safely at a high level, but not complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20% out of 25 parameters, so the description carries more burden than usual. It does group the fields into recognizable categories and explains the id-based create/update switch, but it adds no meaning for the undocumented bulk of the schema — the employments array shape, status values, what a 'standing package' requires, or which fields matter for a valid create.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Create or update a payroll employee') and enumerates the covered data groups (name, number, contact, identity, role, department, employments, package). The create-vs-update rule keyed on 'id' makes the operation unambiguous. It doesn't explicitly contrast itself with nearby siblings such as save_client, save_supplier or get_employee, which keeps it at a 4.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete decision rule: omit id to create, pass an id to update that employee. It also implies use is for creating or modifying employees rather than reading them. What it lacks is guidance on prerequisites (e.g. fetching an existing employee first, dependency on payroll setup or jurisdictions) and any explicit 'use X instead' routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_expenseSave expenseAInspect

Record spending that is NOT settling a document, or edit an existing expense's ACCOUNTING ENTRY (category, supplier, tax); to pay a bill or PO prefer record_document_payment (one document) or settle_bills (several), and to change the BANK LINE itself (its description, ignored flag or notes) use update_transaction. For one expense, send its fields inline (pass an id to update, omit to create). To create/update many at once, send an items array — this is preferred over repeated calls: the whole batch is one all-or-nothing transaction with a single ledger recompute. Each item with an id updates; each without creates. To pay a bill / purchase order / GRN, set accountid to that document's id. Use create_income_expenses_bulk to add income and expenses together in one transaction.

NameRequiredDescriptionDefault
aiNoInternal: set when the expense was produced by AI enrichment.
idNoExpense id. Present → update that expense; omit → create a new one.
dateNoExpense date (ISO 8601).
nameNoDisplay name / description of the expense.
paidNoWhether this expense has been paid.
alertNoAlert/reminder note to surface on this expense.
itemsNoVector of expense objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
notesNoFree-text notes.
splitNoWhether this expense is one line of a split transaction.
totalNoTotal including quantity. Used only when amount is omitted: amount becomes total ÷ quantity, and must come to whole cents. If amount is also sent, amount wins.
amountNoUnit amount before quantity/tax, in the record's currency.
methodNoPayment method as free text (e.g. "cash", "card", "eft") — no fixed set.
unlinkNoPass the id of a currently-linked transaction/document to detach it.
groupidNoGroup id linking split lines of one real-world transaction together.
taglistNoTag ids to set on this expense (replaces the existing set).
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
paiddateNoDate payment was made (ISO 8601).
quantityNoNumber of units.
salestaxNoWhether sales tax (VAT) applies. May also be an array of salestax refs.
supplierNoSupplier id, or an exact supplier name to resolve (see list_suppliers).
accountidNoChart-of-accounts account id (or an exact account name to resolve) used to categorise this expense (see list_accounts). ALSO how a payment is recorded against a purchase document: set this to the bill / purchase order / GRN document id (cont-…) and the expense counts toward that document's paid amount, inheriting the document's accounting category. This is how a money-out document is settled via a pre-existing expense. To record a fresh payment against a bill / purchase order / GRN, prefer record_document_payment — it now handles both directions, minting the accountid-linked expense for you from the payment details. To refund a customer, set this to their id (cli-…): it posts once to Receivables, tagged to them, with no VAT.
exchangerateNoManual FX rate to the business base currency; omit to use the stored/auto rate.
showquantityNoWhether to display the quantity column on the document.
bankaccountidNoBank account id the money moved through (see list_accounts).
baseaccountidNoBase/control account id override; rarely needed — defaults from the category.
transactionidNoBank transaction id to reconcile this expense against.
salestaxamountNoExplicit sales tax amount; used instead of the percentage when salestaxuseamount is true.
salestaxpercentNoSales tax rate as a percentage (e.g. 15 for 15%).
salestaxuseamountNoWhen true, use salestaxamount as the tax figure instead of computing from the percentage.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds real behavior: the batch form is one all-or-nothing transaction with a single ledger recompute, and per-item id presence determines create vs update. What it does not cover is failure behavior beyond all-or-nothing (validation errors, whether partial-permission failures abort the batch) or what the call returns, so it falls short of a 5 for a 29-parameter mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary exclusion (NOT settling a document) and the sibling routing before the mechanical how-to. It is dense but almost every clause carries routing or mode information; the parenthetical about `id` appears twice (top-level and items) and the sentence structure is long, which costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 29-parameter create/update tool with no output schema, the description supplies the decision-critical context: which sibling to use, inline vs batch, update vs create, and the `accountid` overloading. It omits what a successful save returns (id of the created expense?) and any permission or locked-period constraints, which matters given there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 routing semantics the schema presents only per-field: the inline-vs-`items` mode split, the create-vs-update meaning of `id` at both levels, and the overloaded meaning of `accountid` (category vs cont-… document vs cli-… refund), which is a genuinely tricky parameter. It still delegates all the other 25 field meanings to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource (record/edit an expense's accounting entry) and immediately bounds the scope: spending that is NOT settling a document. It then explicitly contrasts itself with record_document_payment, settle_bills, update_transaction and create_income_expenses_bulk, so an agent can route correctly without opening the schemas of five tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use rules: use this for spending that is not settling a document, use record_document_payment for one bill/PO, settle_bills for several, update_transaction for the bank line itself. It also states a preference rule (batch `items` over repeated calls) and a mode rule (pass `id` to update, omit to create). Little 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.

save_incomeSave incomeAInspect

Create or edit income ACCOUNTING ENTRIES (category, client, tax); to change the BANK LINE itself (its description, ignored flag or notes) use update_transaction, and to record a payment against an invoice prefer record_document_payment. When the bank line that paid the invoice already has its own income (its $incomeids in list_transactions), settle by saving that income with id = the income and accountid = the invoice id instead, so the payment is not counted twice. For one, send its fields inline (pass an id to update, omit to create). To create/update many at once, send an items array — preferred over repeated calls: the whole batch is one all-or-nothing transaction with a single ledger recompute. Each item with an id updates; each without creates. Use create_income_expenses_bulk to add income and expenses together in one transaction.

NameRequiredDescriptionDefault
idNoIncome id. Present → update that income; omit → create a new one.
dateNoIncome date (ISO 8601).
nameNoDisplay name / description of the income.
alertNoAlert/reminder note to surface on this income.
itemsNoVector of income objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
notesNoFree-text notes.
splitNoWhether this income is one line of a split transaction.
amountNoUnit amount before quantity/tax, in the record's currency.
clientNoClient id, or an exact client name to resolve (see list_clients).
methodNoPayment method as free text (e.g. "cash", "card", "eft") — no fixed set.
unlinkNoId of a currently-linked invoice/asset to detach from this income. Ignored unless it is an invoice/asset id.
assetidNoAsset id to link this income to (e.g. proceeds from an asset).
groupidNoGroup id linking split lines of one real-world transaction together.
productNoProduct id this income is for (see list_products).
categoryNoIncome category name; forced to "Sales" when linked to an invoice.
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
accountidNoChart-of-accounts income category account id, or an exact account name to resolve (see list_accounts). Set to a supplier id (sup-…) to record a refund paid by that supplier: it posts once to Payables, tagged to the supplier, with no VAT, and draws down the credit they owe.
invoiceidNoInvoice id this income pays toward.
incometypeNoIncome type/classification label.
exchangerateNoManual FX rate to the business base currency; omit to use the stored/auto rate.
baseaccountidNoBase/control account id override; rarely needed — defaults from the category.
transactionidNoBank transaction id to reconcile this income against.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare that this is a non-read-only, non-destructive write. The description adds real behavior beyond that: the batch is one all-or-nothing transaction with a single ledger recompute, and the double-counting risk when a bank line already holds income. It stops short of stating permission requirements or what is returned/rolled back on failure, so not 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and alternatives before the edge-case settlement rule, and every sentence carries operational content. It is dense and backtick-heavy, and the batching guidance is split across two adjacent sentences, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter mutation tool with no output schema, the description covers the decisions that actually cause errors (create vs update, bank line vs accounting entry, batch vs loop, duplicate payment). It does not say what the call returns (e.g. created income ids) or how failures surface in a batch, which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning the schema does not: omit `id` to create vs include it to update, and the non-obvious `accountid` = invoice id settlement pattern (the schema's `accountid` text only covers the supplier-refund case). It also frames `items` as per-item create/update by presence of `id`.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ("Create or edit income ACCOUNTING ENTRIES") and immediately scopes what it is not: it does not touch the bank line (update_transaction) or invoice payments (record_document_payment). An agent can distinguish it from save_expense, update_transaction and record_document_payment 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use update_transaction for the bank line, record_document_payment for invoice payments, create_income_expenses_bulk to mix income and expenses. It also gives a concrete deduplication rule (settle via `id` = existing income and `accountid` = invoice id when the bank line already carries `$incomeids`) and states that `items` batching is preferred over repeated calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_journal_entrySave journal entryAInspect

Create or replace a WHOLE journal entry with all its lines; to fix one line on an existing entry use update_journal_line, and to add one use add_journal_line. Pass an id to update it; omit id to create a new one. Returns the new journal entry id on create. To create/update many at once, send an items array — one all-or-nothing transaction with a single ledger recompute; each item with an id updates, each without creates.

NameRequiredDescriptionDefault
idNoJournal entry id. Present → update; omit → create a new one.
dateNoJournal entry date (ISO 8601).
nameNoDescription of the journal entry.
itemsNoVector of journal entry objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
linesNoJournal lines. Each line debits or credits one account; total debits must equal total credits.
notesNoFree-text notes.
amountNoTotal amount of the journal entry.
openingNoWhether this is an opening balance entry.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds real context beyond that — that the whole entry and all its lines are replaced (not merged), that bulk items run as one all-or-nothing transaction with a single ledger recompute, and that a new id is returned on create. What is not disclosed is what happens to existing lines omitted from a replace, and whether anything is permanently lost, which matters given 'replace' semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verb and scope, then the sibling routing, then the id rule, then the batch mode — a sensible priority order. Dense but nearly every clause carries information; the capitalized 'WHOLE' is a slightly heavy emphasis device but does signal the key distinction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter upsert with nested line objects and no output schema, the description covers the create/update switch, the batch semantics, sibling routing, and the return value. The remaining gap is update-time behavior on an existing entry (whether omitted lines survive), which is the riskiest unknown for a 'replace' tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning on top: the id-present/omit rule is framed as the create-vs-update switch and the items array is explained as a per-item create-or-update batch. It does not add anything about lines, amount, opening, or notes beyond the schema, so it sits just above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create or replace a WHOLE journal entry with all its lines') and immediately contrasts with the two sibling tools update_journal_line and add_journal_line. An agent can distinguish whole-entry replacement from single-line editing without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use update_journal_line to fix one line, add_journal_line to add one, this tool for whole entries. It also states the id-present/omit branching and recommends the items array for bulk over repeated calls, so both the alternative-tool decision and the alternative-invocation-mode decision are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_leave_movementSave leave movementAInspect

Create or edit a leave opening balance or adjustment. To create, send employee, leavetype, kind ("opening" or "adjustment") and days (positive grants leave, negative uses it). Pass an id to edit that movement's kind, date, days or notes; its employee and leave type are fixed. Leave movements change leave balances only and post nothing to the ledger.

NameRequiredDescriptionDefault
idNo
dateNo
daysNoSigned: a positive number grants leave and a negative number uses it.
kindNoopening sets an opening balance. adjustment changes the balance.
notesNo
employeeNo
leavetypeNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses two genuinely non-obvious traits: employee and leave type are immutable once an id is supplied, and the tool 'post[s] nothing to the ledger' — a scope-limiting side effect an agent would otherwise have to guess. It omits permissions, failure modes, and what is returned, which keeps it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose then the two operating modes. The days sign convention is restated from the schema and the parentheticals are dense, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema and thin schema documentation, the description covers the essentials: mode selection, conditional required fields, edit-time immutability, and ledger scope. It leaves open what the response contains and how invalid combinations (e.g. id plus employee) are handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 29% (only days and kind are documented), so the description must compensate. It partly does — it explains the sign convention of days, the meaning of employee/leavetype on create, the role of id as a mode switch, and which fields are editable (kind, date, days, notes). However, id, date, notes and employee/leavetype still get no format or constraint detail (id format, date format, uniqueness), so the gap is narrowed rather than closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Create or edit a leave opening balance or adjustment') and immediately separates the create path from the edit path. It is clearly distinct from save_leave_request and save_leave_type, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact field set for creation ('send employee, leavetype, kind ... and days') and the exact trigger for edit mode ('Pass an id'). That is concrete when-to-do-what guidance. It stops short of exclusions, e.g. that viewing movements belongs to list_leave_movements or that formal leave requests belong to save_leave_request.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_leave_requestSave leave requestAInspect

File or edit a leave request: employee, leave type, start and end dates, days, reason and notes. Omit id to file a new request; pass an id to edit that request. A new request is always filed as requested, never approved; use decide_leave_request to approve, decline or cancel it. Leave requests post nothing to the ledger.

NameRequiredDescriptionDefault
idNo
daysNoThe leave taken, in the leave type's unit. Fractions are allowed.
notesNo
reasonNo
enddateNo
archivedNo
employeeNo
sicknoteNo
leavetypeNo
startdateNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses two non-obvious behaviors: a new request is always filed as "requested" and never auto-approved, and leave requests post nothing to the ledger. That is real added value for a write tool with readOnlyHint=false and destructiveHint=false. The gap is edit semantics: with destructiveHint=false declared, it never says whether passing an id overwrites unspecified fields or performs a partial update, nor what happens to the archived/sicknote fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action and then the create/edit rule and the sibling handoff. The mid-sentence field enumeration largely restates schema property names, which earns little, but the rest of the text is dense and waste-free.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with no output schema and near-zero schema documentation, the description covers the workflow well (create vs edit, approval, ledger impact) but leaves the caller guessing on date formatting, partial-vs-full updates, and whether a new request needs employee/leavetype/startdate despite an empty required list. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 10%, so the description must carry the load, and it partially does by explaining the id switch and naming several business fields. But it adds no meaningful semantics for archived, sicknote, reason vs notes, or the date string format, and says nothing about which fields a new request realistically needs given that required is empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"File or edit a leave request" gives a specific verb pair and resource, then enumerates the fields handled (employee, leave type, dates, days, reason, notes) and distinguishes the two modes by the id parameter. An agent can tell this apart from decide_leave_request and the list_leave_* 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact selection rule between create and edit ("Omit id to file a new request; pass an id to edit that request") and routes approval/decline/cancel work to decide_leave_request by name. Both the when-to-use condition and the alternative are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_leave_typeSave leave typeAInspect

Create or update a leave type: name, accrual method (monthly, upfront or none), yearly entitlement in days, cycle months, carry-over, whether it is paid and whether the balance is paid out on exit (provision; omit it to derive it from the method and carry-over). Omit id to create; pass an id to update that leave type. Leave types are master data and post nothing to the ledger.

NameRequiredDescriptionDefault
idNo
daysNoThe yearly entitlement per cycle, in the leave type's unit.
nameNo
paidNo
unitNo
notesNo
primaryNo
archivedNo
carryoverNo
provisionNo
cyclemonthsNo
accrualafterNo
carryovercapNo
accrualmethodNomonthly spreads the yearly entitlement across the year. upfront grants it whole at each cycle start. none accrues nothing.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations define read/destructive status, the description adds crucial behavioral context: 'Leave types are master data and post nothing to the ledger.' This significantly informs the agent about the operational impact of this action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The tool definition uses a single, dense sentence structure, which is efficient. Although long, every phrase is functional, moving from core function to conditional logic and finally to scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the high parameter count (14), the description manages the complexity successfully by explaining the creation/update mechanism and detailing specific logic for fields like provision, making the tool highly usable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given the extremely low schema description coverage (14%), the description is vital. It semantically groups complex parameters (e.g., 'accrual method (monthly, upfront or none)') and explains the purpose of interdependent fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the specific resource being manipulated ('leave type') and distinguishes the functionality from sibling tools by referencing specialized business parameters like accrual method and yearly entitlement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit instructions on how to invoke the tool for different outcomes: omitting 'id' for creation and passing 'id' for updates. It also gives guidance on dependency: omitting 'provision' to allow derivation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_loanSave loanAInspect

Create or update a loan: money the business owes. Pass an id from list_loans to update that loan; omit it to create one, which needs a lender. A new loan gets its own liability account. An id this business does not own is refused with code loan-not-found. An opening date later than entries already on the loan's account is refused, unwritten, with code confirm-required until the same call is repeated with confirm true.

NameRequiredDescriptionDefault
idNoThe loan to update, from list_loans. Omit it to create a new loan.
nameNoWhat the business calls the loan, e.g. Vehicle finance. A new loan needs a lender.
rateNoYearly interest rate as a percentage, e.g. 11.5.
notesNoFree-text notes.
amountNoWhat was borrowed, in the loan's currency. Not the balance still owed.
lenderNoWho lent the money: a bank, a director, a family member.
confirmNoSend true only after the user agrees, when an update came back with code confirm-required: the opening date is later than entries already on the loan's account.
currentNoTrue when the loan is due within a year (a current liability). Only read when the loan is created.
archivedNoTrue to archive a loan that is paid off.
currencyNoISO currency code, e.g. ZAR. Omit for the business's own currency.
openingdateNoDate the opening balance applies from, yyyy-MM-dd.
openingbalanceNoWhat was still owed on openingdate, for a loan that started before the business used stub. 0 clears it.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Well beyond the readOnlyHint=false / destructiveHint=false annotations: it discloses a side effect (a new loan gets its own liability account), two named error codes (loan-not-found, confirm-required), that the refused write is left unwritten, and that the ownership check is scoped to this business. This is exactly the mutation context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Roughly four sentences, front-loaded with the create-vs-update rule, then side effect, then the two error cases with their remedies. Nothing is repeated from the schema and no sentence is filler despite the density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutation tool with no output schema, it covers creation, update, ownership rejection, the confirm escalation, and the account side effect. The one gap is that it never indicates what comes back on success (notably whether the new loan's `id` is returned, which an agent would need to chain a follow-up update or archive).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above that by adding a conditional requirement the schema does not express (the schema declares no required fields, yet a create 'needs a lender') and by linking the confirm parameter to the confirm-required flow rather than just describing it as a boolean.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (create/update) and resource (loan), and even defines the domain concept as 'money the business owes'. It explicitly distinguishes itself from list_loans by naming it as the id source, so an agent can separate read from write without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the exact decision rule: pass an `id` from list_loans to update, omit it to create, and a create requires a lender. It also prescribes the remediation path for the confirm-required case — repeat the identical call with confirm true — which is the main way this tool fails on first invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_payroll_settingsSave payroll settingsAInspect

Change this business's payroll settings, the country pack's settings and the jurisdiction that get_payroll_setup lists. Send only the settings to change. The first call saves nothing and answers the changes; call again with confirm true after the user approves them. Finalised payslips, closed periods and existing drafts keep their figures; only payslips created or re-populated after the change use the new settings.

NameRequiredDescriptionDefault
confirmNoOmitted, nothing is saved: the answer lists each change for the user to approve. Send true after the user approves.
settingsNoSetting id to value, ids as get_payroll_setup lists them under settings. Only the ids you send change. A null value removes the stored value, and the pack default applies.
jurisdictionNoA code from get_payroll_setup jurisdiction.options. "$delete" clears it. Omitted, it stays.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false), it discloses the two-phase dry-run/confirm workflow and, critically, the blast radius: finalised payslips, closed periods and existing drafts keep their figures, and only payslips created or re-populated afterwards pick up the new settings. That retroactivity detail is exactly the kind of behavior an agent cannot infer from 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with what changes, then the call protocol, then the side-effect scope. No filler or redundancy; each sentence carries a distinct, decision-relevant fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter mutation tool with nested objects and no output schema, the description covers the call sequence, side effects and where to get valid ids. It stops short of describing the shape of the approval response or any permission/entitlement requirements, which a caller might still wonder about.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains confirm, the settings id-value map, null-to-reset behavior and the '$delete' jurisdiction sentinel. The description adds the partial-update convention ('Send only the settings to change') and the approval workflow around confirm, but mostly restates what the schema documents, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Change this business's payroll settings, the country pack's settings and the jurisdiction') and names the sibling get_payroll_setup as the source of valid ids. An agent can distinguish this from save_employee, save_payslip or save_payslip_template 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It spells out the when and the when-not explicitly: the first call saves nothing and returns the proposed changes, and the second call is only made 'after the user approves them'. It also points to get_payroll_setup for enumerating setting ids and jurisdiction options, so the agent knows how to prepare the call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_payslipSave payslipAInspect

Create or edit a DRAFT payslip: employee, pay run, period, pay date and the earning, deduction and contribution lines. Omit id to create; pass an id to edit that payslip. A created payslip is always a draft and an edit never changes the draft flag, so this never posts to the ledger; a finalised payslip refuses an edit. A payslip on a pay run that finalises itself on its pay date is refused.

NameRequiredDescriptionDefault
idNo
linesNo
notesNo
payrunNo
paydateNo
employeeNo
periodendNo
periodstartNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses the crucial side-effect boundary: the operation never posts to the ledger, creation is always draft, editing never flips the draft flag, and edits on finalised payslips or self-finalising pay runs are rejected. These are exactly the behaviours an agent cannot infer from readOnlyHint=false / 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the create/edit split, and every sentence carries decision-relevant content. The final sentence about self-finalising pay runs is slightly convoluted in phrasing but not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation with no output schema and no annotations beyond the safety hints, the draft/ledger semantics are well covered, but the description never says what comes back. Because editing requires an id, an agent needs to know whether the create path returns the new payslip id — that gap matters for chaining into preview_payslip or finalise_payslips.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% at the top level, so the description carries the burden, and it only partly does: it fully explains the create-vs-edit meaning of id and conceptually names employee, payrun, period and lines. It adds no format or reference guidance for paydate, periodstart/periodend, payrun or employee, so the agent still cannot tell what identifiers or date shapes are accepted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb pair and resource ('Create or edit a DRAFT payslip') and enumerates the domain fields it covers. Placing 'DRAFT' in caps immediately separates it from finalise_payslips, preview_payslip and get_payslip without the agent needing to open another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete when-to-use rules ('Omit id to create; pass an id to edit') and two explicit refusal conditions (finalised payslip, pay run that finalises on its pay date). It stops short of naming alternatives such as preview_payslip for a dry run or finalise_payslips for the next step, which is the only thing separating it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_payslip_templateSave payslip templateAInspect

Create or update a payslip template: a named line set of earnings, deductions and contributions with each line's kind, rate, quantity, amount and formula. Omit id to create; pass an id to update that template. On update, lines is the full set. A template is master data: it changes future payslips only and posts nothing to the ledger.

NameRequiredDescriptionDefault
idNo
nameNo
linesNoThe full set of lines. It replaces the stored set; send the id of every line you keep.
notesNo
archivedNo
statutoryNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructive=false), the description discloses the critical non-merge semantics: 'The lines are replaced entirely — not merged.' This is exactly the behavioral detail an agent needs to avoid data loss on update. It doesn't mention permissions, side effects on existing payslips, or return behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with create/update semantics and the destructive replace rule immediately. Sentences are tight and each carries meaning; minor redundancy in restating id usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 6 params and 17% schema coverage and no output schema, the description covers the create/update decision and the replace behavior well, but leaves several parameters and all line-field semantics to the schema, which only partially documents them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (17%), so the description must compensate. It gives meaning to id, name, and lines (replace-not-merge, required-on-create) but leaves the line sub-fields (rate, kind, formula, etc.) and the notes/archived/statutory parameters unexplained. Partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description leads with a specific verb and resource: 'Create or update a payslip template: a named set of earning and deduction lines.' It defines what a template is, distinguishing it from a payslip instance conceptually, but doesn't explicitly contrast with siblings like save_payslip or list_payslip_templates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear create-vs-update routing: 'Omit an id to create with the given lines. Supply an id (optional) or name+lines to update.' It also states when name+lines are required vs optional. No named alternative tools or exclusions, so it stops 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.

save_productSave productAInspect

Create or update the catalogue PRODUCT itself (name, price, account); for a size, colour or other option of an existing product, use save_variant. Pass an id to update that product; omit id to create a new one. Returns the new product id on create. To create/update many at once, send an items array — one all-or-nothing transaction with a single ledger recompute; each item with an id updates, each without creates.

NameRequiredDescriptionDefault
idNoProduct id. Present → update that product; omit → create a new one.
skuNoStock-keeping unit / product stock code. Canonical product-level SKU (mirrors a variant's sku).
costNoCost price per unit.
nameNoDisplay name / description of the product.
unitNoLegacy unit-of-measure label; prefer `units`.
imageNoProduct image URL; pass "$delete" to remove the existing image.
itemsNoVector of product objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
notesNoFree-text notes.
priceNoSelling price per unit, in the record's currency.
unitsNoUnit of measure label (e.g. "each", "hour", "kg").
amountNoUnit amount before quantity/tax, in the record's currency.
starredNoWhether the product is starred/favourited.
archivedNoArchive (true) or unarchive (false) the product. An archived product is kept with its history and still listed; it is not deleted.
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
quantityNoNumber of units.
trackstockNoWhether stock levels are tracked for this product.
descriptionNoProduct description.
paymentlinkNoWhether an online payment link is enabled for this product.
salestaxidsNoSales tax ids to link to this product.
unlinktaxesNoSales tax ids to unlink from this product.
costcurrencyNoISO 4217 currency code for the cost price.
allowoversellNoWhether the product can be sold beyond available stock.
enablequantityNoWhether the buyer can choose a quantity for this product.
requireaddressNoWhether a delivery/billing address is required when this product is purchased.
stocklocationidNoDefault stock location id for new stock moves: "2" (main) or one of the business's locations. Pass "$delete" to clear it.
salestaxexclusiveNoWhether the price excludes sales tax.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the rest: it discloses that create returns the new product id, and that the `items` path is one all-or-nothing transaction with a single ledger recompute. That transactionality and side-effect detail is genuinely useful beyond the annotations, though permission requirements and failure behaviour are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose and the sibling distinction, then the id rule, then the batch rule. Dense but every sentence carries information; the batch sentence is slightly long but earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 26-parameter tool with no output schema, the description covers the critical decision points (create vs update, single vs batch, product vs variant) and states the return value on create. Remaining gaps are minor given the fully documented schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 on top: the create-vs-update semantics of `id` and the per-item id/no-id behaviour inside `items`. It does not explain the many boolean flags, but the schema already documents those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Create or update the catalogue PRODUCT itself') and explicitly scopes it against the sibling save_variant for sizes/colours/options. An agent can distinguish 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing rules: use save_variant for options of an existing product, pass `id` to update, omit `id` to create, and use the `items` array for bulk instead of repeated calls. When-to-use and when-to-use-something-else are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_supplierSave supplierAInspect

Create or update a supplier. Pass an id to update that supplier; omit id to create a new one. Returns the new supplier id on create. Updating an existing supplier with an opening date later than its own earliest bill or expense is refused, unwritten, with code confirm-required until the same call is repeated with confirm true. To create/update many at once, send an items array — one all-or-nothing transaction with a single ledger recompute; each item with an id updates, each without creates.

NameRequiredDescriptionDefault
idNoSupplier id. Present → update that supplier; omit → create a new one.
cityNoCity.
nameNoDisplay name / description of the supplier.
emailNoSupplier email address.
itemsNoVector of supplier objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
numberNoMain telephone (landline) number of the supplier, beside the contact person's contactnumber. Trimmed; a blank value on update clears it.
suburbNoSuburb or district.
addressNoStreet address line 1.
confirmNoPROD-1951: required only to save an opening date that is LATER than the supplier's own earliest bill or expense. Without it that one case is refused, unwritten, with code confirm-required plus earliesttransactiondate and transactionsbefore, so the caller can show what the date would exclude from the creditors balance and let the user override it.
countryNoSupplier country (ISO code or name).
starredNoWhether this supplier is marked as a favourite.
websiteNoSupplier website, e.g. www.example.co.za. Trimmed; a blank string clears it, null leaves it unchanged.
address2NoStreet address line 2.
contactsNoThe full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.
addressesNoThe full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.
vatnumberNoVAT / tax registration number.
postalcityNoPostal address city.
postalcodeNoPostal or ZIP code.
contactnameNoName of the primary contact person.
creditlimitNoMost the business means to owe this supplier, in base currency. It only warns: a bill over it still saves.
openingdateNoDate the opening balance applies from (ISO 8601).
contactemailNoEmail of the primary contact person.
postalsuburbNoPostal address suburb.
contactnumberNoPhone number of the primary contact person.
postaladdressNoPostal address line 1, e.g. a PO Box.
openingbalanceNoOpening balance amount carried for this supplier at openingdate.
postaladdress2NoPostal address line 2.
documentaddressNoWhich address documents print: physical (default) or postal.
clearcreditlimitNoWhen true, removes the stored supplier limit.
postalpostalcodeNoPostal address postal code.
registrationnumberNoBusiness registration number.
clearopeningbalanceNoReserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only declare readOnlyHint=false and destructiveHint=false, but the description discloses real behavioral traits: the opening-date guard that refuses and leaves data unwritten with code confirm-required until `confirm` is true, the all-or-nothing batch transaction with a single ledger recompute, and the returned supplier id on create. This is context the annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the create/update rule, then the confirm-required exception, then the batch path. Every sentence carries a distinct decision-relevant fact with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 32-parameter upsert tool with no output schema, the description covers the create/update split, the batch alternative, the one refusal path, and what is returned. The many optional clear-flag and nested list-replacement behaviors are left entirely to the schema, which is acceptable given 100% coverage but leaves a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 restates the `id` and `items` semantics already in the schema and adds only the confirm-retry sequencing and the create-time return id; it says nothing about the many clear*/list-replacement flags beyond what the schema documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource pair ('Create or update a supplier') and immediately clarifies the upsert semantics that separate it from delete_supplier, list_suppliers, and match_suppliers. It does not name any sibling tool, so the differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear decision rule ('Pass an `id` to update; omit `id` to create') and states that the `items` array is 'Preferred over repeated calls'. Missing an explicit exclusion: it never says when a single call beats the batch form, or that delete_supplier is the removal path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_variantSave variantAInspect

Create or update an OPTION (size, colour, pack) under an existing product; for the product itself, use save_product. Pass an id to update it; omit id to create a new one. Returns the new variant id on create. To create/update many at once, send an items array — one all-or-nothing transaction with a single ledger recompute; each item with an id updates, each without creates.

NameRequiredDescriptionDefault
idNoVariant id. Present → update that variant; omit → create a new one.
skuNoStock-keeping unit / product code.
costNoCost price per unit.
nameNoDisplay name / description of the variant.
imageNoVariant image URL; pass "$delete" to remove the existing image.
itemsNoVector of variant objects to create/update in one all-or-nothing batch. Preferred over repeated calls. Each item with an id updates; each without creates.
notesNoFree-text notes.
priceNoSelling price per unit, in the record's currency.
unitsNoUnit of measure label (e.g. "each", "hour", "kg").
barcodeNoBarcode value for this variant.
archivedNoArchive (true) or unarchive (false) the variant. An archived variant is kept with its history and stays in the product's variants; it is not deleted.
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
productidNoParent product id this variant belongs to (see list_products).
descriptionNoVariant description.
salestaxidsNoSales tax ids to link to this variant.
costcurrencyNoISO 4217 currency code for the cost price.
stocklocationidNoDefault stock location id for this variant; empty inherits the product's. Pass "$delete" to clear it.
salestaxexclusiveNoWhether the price excludes sales tax.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds genuinely useful behaviour beyond that — the bulk path is 'one all-or-nothing transaction with a single ledger recompute' (atomicity plus a side effect on the ledger) and create returns the new variant id. It does not state permission requirements or what happens to top-level params when `items` is supplied, so it stops short of fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose and the sibling exclusion, then the create/update switch, then bulk mode. The bulk sentence is dense but every clause ('all-or-nothing', 'single ledger recompute', 'each with an `id` updates') carries information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 18 optional params and no output schema, the description covers the two things an agent most needs: the create-vs-update discriminator and the batch alternative, plus a return value on create that the absent output schema would otherwise leave unknown. The one real gap is that it never says whether top-level fields are ignored when `items` is passed, which matters given the duplicated field sets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (including `id` create-vs-update and `items` semantics) is already documented in the schema; the description largely restates that. It adds no syntax, format, or defaulting detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create or update an OPTION ... under an existing product') and immediately scopes it with examples (size, colour, pack). It also names the sibling it is not ('for the product itself, use save_product'), so an agent can separate it from save_product and delete_variant 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: save_product for the product, save_variant for the option under it; pass `id` to update, omit `id` to create; send an `items` array for bulk rather than repeated calls. Both the alternative tool and the selection condition are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_combinedSearch combinedA
Read-only
Inspect

The unified search over business data — combine free text and/or an amount range in one call. Set 'kind' to: all, expenses, income, transactions, clients, suppliers, products, or invoices (use 'all' to search the whole business). Set 'query' for text search (case-insensitive substring match across names, descriptions, notes, references, supplier/client names, categories) and/or 'min'/'max' for an amount range on the kind's primary amount field — both are optional, so omit the amount range for a pure text search (e.g. over clients or suppliers) or omit 'query' for a pure amount search. Optionally filter by date range with 'from' and 'to' in YYYY-MM-DD format. Set 'sort' to 'amount' (default — descending by amount) or 'date' (descending by date; best for clients/suppliers, which have no amount, or when recency matters more than size). Returns ALL matches, paginated — use limit/cursor to page through the full result set; narrow query/range/date if there are more than you need.

NameRequiredDescriptionDefault
toNoUpper bound of the date range to match (ISO 8601, YYYY-MM-DD).
maxNoUpper bound of the amount range to match (matched on the kind's primary amount field, absolute value).
minNoLower bound of the amount range to match (matched on the kind's primary amount field, absolute value).
fromNoLower bound of the date range to match (ISO 8601, YYYY-MM-DD).
kindYesWhich collection to search. One of: "all" (every collection), "expenses", "income", "transactions", "clients", "suppliers", "products", "invoices".
sortNoResult ordering. "amount" (default) sorts by the kind's primary amount field descending; "date" sorts by date descending — use "date" for clients/suppliers (which have no amount) or whenever recency matters more than size.
limitNoMax rows to return in this page (default 50). Responses include next_cursor / truncated / total; pass next_cursor back as `cursor` to fetch the next page. Never silently truncated.
queryNoFree-text search query (case-insensitive substring match across all text fields).
cursorNoOpaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation is consistent. The description transparently discloses search behavior: case-insensitive substring matching, absolute value for amount, default sort, pagination mechanics, and the response fields (next_cursor / truncated / total). No hidden side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but every sentence serves a purpose, covering all parameters and behaviors without redundancy. It is well-structured with clear explanations of filters, sorting, and pagination.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains what the response includes (next_cursor / truncated / total) and how to page. Combined with the exhaustive parameter coverage, it is fully self-contained for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already has 100% description coverage, and the description adds extra semantic detail: absolute value for amount bounds, case-insensitive substring, default limit 50, and how to use the cursor. This goes well beyond the schema's baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it is a unified search over business data, listing the supported kinds and the ability to combine free text, amount, and date filters. This differentiates it from the many list_* sibling tools that target specific collections, making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides thorough usage guidance: explains how to use kind, query, min/max, from/to, sort, limit, and cursor, including pagination with next_cursor and the note that results are never silently truncated. This is more than enough to know when and how to invoke it compared to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_help_articlesSearch help articlesA
Read-only
Inspect

Search stub's published help articles (the product docs) for a how-to. Use it when no guide from list_guides covers the question. Read-only; returns up to five matches, best first, each with a slug for get_help_article. pro: true marks a paid-plan feature.

NameRequiredDescriptionDefault
queryYesWhat the user wants to do, in their words, e.g. "invite my accountant".

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description adds meaningful context: it discloses the result cap (up to five), ordering (best first), the presence of a slug for follow-up via get_help_article, and the meaning of the `pro` flag. It does not cover pagination or what happens on zero matches, keeping it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the resource and the routing condition, then the return-shape facts. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema available, the description fills the gap by describing the return shape (count, ordering, slug, pro flag), and the usage condition plus read-only note round out everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single query parameter already has an example, so the description adds no syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (published help articles/product docs) with the scope of results. It is clearly distinguishable from siblings list_guides and get_help_article, which the description references by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit triggering condition ('when no guide from list_guides covers the question'), naming the alternative tool that should be tried first. An agent knows exactly when to route here versus elsewhere.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_documentSend documentAInspect

Email a document (invoice, quote, credit note, etc.) to its contact. Works on any document id. This actually sends the email — to flag a document as sent without emailing use mark_document_sent, and to log a payment against it use record_document_payment. Find the id yourself with list_documents (query by number or contact); never ask the user for an id. Its reply's destination is every address the email went to: say who received it from that, never a guess.

NameRequiredDescriptionDefault
idYesId of the document (invoice, quote, credit note, etc.) to email (required).
emailNoOverride recipient address; defaults to the document contact's email on file.
messageNoA note shown in the email above the document.
sendcopyNoSend me a copy: BCC the signed-in user who sends this, and nobody else. Off by default. Only a signed-in person gets a copy; an API, agent or MCP token sends none.
attachpdfNoAttach the document's own PDF, drawn at send time from the saved document. Off when absent: stub-web sends true by default. If the PDF cannot be drawn, the email goes without it. The view-online link always stays.
attachrebilledNoAttach the receipt of every expense rebilled on this document's lines. Off by default. Files that do not fit are sent as download links.
attachmentfileidsNoAttach these files: a rebilled receipt's file id (or the expense id for a legacy receipt), or the id of any business file when the sender may read Files. A file in a locked folder never goes. With attachrebilled, adds to the rebilled receipts. At most 20.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=true, so safety is partly covered; the description still adds real value by stressing "This actually sends the email" — i.e. an external, irreversible side effect rather than an internal state change. It does not cover rate limits, auth/permission requirements, or what happens on delivery failure, which keeps it below 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and its immediate distinction from siblings, with no filler sentences. The closing sentence about the reply's destination is useful but awkwardly phrased ("Its reply's destination is every address the email went to"), costing a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema, the description covers the action, alternatives, id-discovery workflow, and even how to interpret the send result (who actually received it). Delivery-failure or permission behavior is left implicit, but nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter (email override, message, sendcopy, attachpdf, attachrebilled, attachmentfileids) is already fully documented in the schema, including defaults and edge cases like locked folders and non-fitting files. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Email a document") and immediately scopes it with examples (invoice, quote, credit note) and the note that it works on any document id. It also names the two sibling tools it must not be confused with (mark_document_sent, record_document_payment), so an agent can distinguish 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use this to actually email, use mark_document_sent to only flag as sent, use record_document_payment to log payment. It additionally prescribes the lookup procedure (find the id via list_documents by number or contact) and forbids asking the user for an id — both strong when-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_feedbackSend feedbackCInspect

Send feedback about the MCP tools to the stub team.

NameRequiredDescriptionDefault
toolNoOptional: the MCP tool name this feedback is about (e.g. list_invoices).
feedbackYesYour feedback about the MCP tools — what worked, what didn't, what's missing.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is known, but the description adds nothing beyond that. It doesn't say whether feedback is attributed, where it goes, or whether sending is one-way — the useful facts for a submission tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It earns its brevity, though the brevity is also the source of the missing differentiation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, the schema is complete, and no output schema is needed. However, with a near-identical sibling (send_team_feedback) in the set, the description should have disambiguated the two channels — that's the one thing an agent actually needs here and it's absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are fully documented there, including the optional 'tool' field. The description's phrase 'about the MCP tools' echoes the schema rather than adding meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: sending feedback about the MCP tools to the stub team. That is clear enough to act on, but it never mentions send_team_feedback, so an agent cannot tell from the description which feedback channel is which.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance at all: not when feedback should be sent, not what kind of feedback belongs here versus send_team_feedback, and no prerequisites. The sibling list contains an obviously competing tool that is never addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_team_feedbackSend team feedbackAInspect

Pass the entrepreneur's feedback, praise, complaint or feature request to the stub team, who read it in Slack. Use this whenever they ask you to send something on — "send this to the team", "tell stub that…", "can you report this", "they should fix…" — and offer it when they voice a clear frustration or want something stub cannot currently do. Quote their own words rather than summarising them. This is NOT feedback about the MCP tools (that is send_feedback), it does not open a support ticket, and nobody will reply in the chat — say so. ALWAYS check the returned sent field: when it is false the feedback reached nobody, and you must tell them it did not go through instead of thanking them for it.

NameRequiredDescriptionDefault
chatidNoSet automatically — do not supply. The conversation this feedback came from.
feedbackYesThe entrepreneur's feedback, in THEIR OWN WORDS. Quote what they said rather than summarising it — a paraphrase of feedback is not the feedback. Include the whole thought, not just the last sentence.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal annotations (readOnlyHint=false, destructiveHint=false), the description reveals important behavior: the feedback goes to a Slack channel, it is not a support ticket, nobody will reply, and the tool returns a `sent` field that must be checked. It even instructs the agent on how to handle the false case transparently, which is far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every sentence earns its place: it front-loads the core action, then provides trigger phrasing, exclusions, and a mandatory failure-handling note. The structure is logical and each clause adds necessary information rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description compensates by explicitly describing the returned `sent` field and the required action when it is false. It also covers the no-reply behavior and the distinction from send_feedback. Combined with the schema and annotations, the agent has all necessary information to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already explains that feedback must be in the entrepreneur's own words. The description adds a little extra semantic context by enumerating accepted content types ('praise, complaint or feature request') and reinforcing the quoting rule. It does not duplicate the entire schema, but adds modest beyond-schema value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: it passes the entrepreneur's feedback, praise, complaint, or feature request to the stub team via Slack. It explicitly differentiates itself from the sibling send_feedback by saying 'This is NOT feedback about the MCP tools', and clarifies that it does not open a support ticket. This leaves no ambiguity about the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit trigger examples ('send this to the team', 'tell stub that…', 'can you report this') and an offer condition ('when they voice a clear frustration or want something stub cannot currently do'). It also states what the tool is NOT for, naming send_feedback as the alternative for MCP tool feedback. This is comprehensive guidance for when to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_business_descriptionSet business descriptionAInspect

Set ONLY the free-text 'what we do' description used to classify the business; for name, contact, currency or tax fields, use update_business. This is used to classify the business and tailor its dashboard/defaults.

NameRequiredDescriptionDefault
whatwedoYesA short free-text description of what the business does (its trade/industry in the owner's words).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the write-but-non-destructive profile is already covered. The description adds real value beyond that: it clarifies that only the description field is mutated (not other business data) and that the value drives business classification and dashboard/default tailoring. It stops short of stating overwrite semantics or length limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the scoping constraint and the alternative. Minor redundancy: 'used to classify the business' is stated twice across the two sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no output schema, the description covers scope, the alternative tool, and the downstream effect of the value. Missing only edge details such as whether an existing description is replaced and any length constraint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is well documented, so the schema carries the syntax burden. The description adds meaning the schema does not: that this free text is consumed for classification and dashboard/default selection, which tells the agent what a good value looks like.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Set ONLY the free-text what-we-do description') and explicitly scopes it away from other business fields. It names the sibling tool update_business so an agent can distinguish the two 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool (setting only the description) and when to use the alternative (name, contact, currency, tax fields -> update_business). The ONLY scoping plus the named alternative leaves nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_business_tagSet business tagAInspect

Set the single segmentation tag/label on the business itself (drives segmentation and routing). Use only to tag the business entity; to change the business's free-text description use set_business_description, and to tag individual records (transactions, invoices, expenses) use set_entity_tags.

NameRequiredDescriptionDefault
tagYesThe business tag/segment label to set on this business (drives segmentation and routing).

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations (readOnlyHint=false, destructiveHint=false) indicate a non-read-only, non-destructive operation. The description adds context by explaining the tag 'drives segmentation and routing' and implies it replaces the single existing tag, but does not detail side effects like overwrite behavior or potential validation. This exceeds the minimal annotation but is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, tightly packed with essential information, no redundancy or extraneous details. It efficiently conveys purpose, usage boundaries, and functional context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers all necessary context: what it does, when to use it (and when not to), and the functional implication of the tag. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'tag' is fully described in the schema ('The business tag/segment label to set on this business') and reinforced in the tool description with 'drives segmentation and routing.' Schema coverage is 100% and the descriptions provide additional semantic context, so the parameter meaning is completely clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Set the single segmentation tag/label on the business itself' with a specific verb and resource. It also distinguishes it from related tools (set_business_description, set_entity_tags), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use and when-not-to-use guidance: 'Use only to tag the business entity; to change the business's free-text description use set_business_description, and to tag individual records use set_entity_tags.' This leaves no ambiguity about alternative tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_document_contactSet document contactAInspect

Attach a contact to a document — a client for money-in documents, a supplier for money-out documents.

NameRequiredDescriptionDefault
idYesDocument id to attach the contact to (invoice, quote, bill, etc.).
clientYesContact id to attach — a client for money-in documents, a supplier for money-out documents (see list_clients / list_suppliers).

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=false and destructiveHint=false, indicating a non-destructive write operation. The description adds no further behavioral details (e.g., whether attaching replaces an existing contact or is idempotent). Given the annotations, this is adequate but not enhanced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no redundant words. It front-loads the action and parameter semantics efficiently, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple attach operation, the description covers the core behavior and parameter meaning sufficiently. It does not mention output (none exists) or error cases, but none are critical for invoking the tool correctly. A minor gap is not clarifying whether an existing contact is overwritten, but that is not essential for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes both parameters simply as IDs. The description adds meaningful context by explaining that `client` should be a client ID for money-in documents and a supplier ID for money-out documents, which helps the agent choose the correct value beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Attach a contact to a document') and adds a useful distinction between money-in and money-out documents. It is specific about the verb and resource, and while it does not explicitly name sibling tools, the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives guidance on when to use which contact type ('client for money-in, supplier for money-out'), which helps select the correct parameter. It does not explicitly contrast with the sibling tool `remove_document_contact`, but the intent is clear enough for most use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_entity_flagSet entity flagAInspect

Flag or unflag an entity (e.g. mark for review). For several entities, prefer set_entity_flags_bulk — one call instead of many.

NameRequiredDescriptionDefault
entityYesEntity kind to flag/unflag, e.g. "expense", "income", "transaction".
flaggedYesTrue to flag (e.g. mark for review), false to unflag.
entityidYesId of the entity to flag/unflag.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-destructive mutation, and the description confirms the flagging action. However, it does not disclose additional behavioral details such as idempotency, return behavior, or side effects beyond the flag change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loads the core action, and includes only the useful bulk-guidance note. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple flagging operation, the description plus full schema coverage is adequate. The bulk preference note adds useful context, though it does not mention any return value or confirmation behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides complete descriptions for all three parameters (entity, flagged, entityid), so the description adds little beyond the schema. It reinforces the 'mark for review' intent but does not materially extend parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Flag or unflag an entity') and provides a concrete example ('mark for review'). It also distinguishes itself from the bulk sibling by explicitly naming set_entity_flags_bulk.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to prefer the bulk variant: 'For several entities, prefer set_entity_flags_bulk — one call instead of many.' This makes the single-entity use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_entity_flags_bulkSet entity flags bulkAInspect

Flag or unflag many entities at once.

NameRequiredDescriptionDefault
itemsYesEntities to flag/unflag in one call.
flaggedNoDefault flag value applied to items that don't set their own.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=false and destructiveHint=false, which align with the description's flag/unflag behavior. No additional behavioral context (e.g., side effects or limitations) is added 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no unnecessary words, fully front-loading the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple flag operation, the description is adequate, but it does not mention potential partial failures, entity type validation, or the fallback logic between top-level `flagged` and per-item `flagged`—though the schema covers this. No output schema exists, so no additional return context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both `items` and `flagged` clearly documented. The description adds no extra semantic meaning beyond the schema, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Flag or unflag many entities at once' clearly states the specific verb (flag/unflag), resource (entities), and bulk nature, distinguishing it from the singular sibling tool set_entity_flag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies bulk usage via 'many entities at once' but does not explicitly contrast with the singular set_entity_flag or other alternatives, leaving some ambiguity about when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_entity_tagsSet entity tagsAInspect

Set the tags on an entity (replaces its tag list), e.g. an expense, invoice, client, employee or payslip. A new payslip copies its employee's tags when it is created. For several entities, prefer set_entity_tags_bulk — one call instead of many.

NameRequiredDescriptionDefault
entityYesEntity kind to tag, e.g. "expense", "income", "invoice", "transaction", "client", "supplier", "employee", "payslip".
taglistYesTag ids to set on the entity (replaces the existing set; empty clears all tags).
entityidYesId of the entity to tag.

TDQS

A3.5/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses replace semantics and the schema notes that an empty taglist clears all tags, which is a destructive update to the existing tag list. This contradicts the annotation destructiveHint=false, which implies only additive updates, so the annotation contradiction rule applies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core set/replace behavior and the bulk alternative. The sentence about new payslips copying employee tags is relevant tag context but not essential for invoking this tool, so it is slightly tangential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter mutation with full schema coverage and no output schema, the description covers replacement semantics, empty-list clearing, entity examples, and bulk routing. It could mention where tag ids come from (e.g., list_tags), but no major invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter has a clear schema description for entity kind, tag ids, and entity id. The description repeats entity examples and replace semantics but adds no parameter-level syntax or constraints beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (set tags on an entity), lists concrete entity kinds, and distinguishes the single-entity operation from set_entity_tags_bulk. An agent can identify exactly what the tool does without inspecting sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes multi-entity work to set_entity_tags_bulk with the phrase 'one call instead of many.' It does not mention clear_entity_tags or list_tags as related tools/prerequisites, but the primary alternative is clearly named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_entity_tags_bulkSet entity tags bulkAInspect

Set tags on many entities at once (replaces each entity's tag list), e.g. every payslip in a pay run. For a single entity use set_entity_tags.

NameRequiredDescriptionDefault
itemsYesEntities to tag in one call. Each item sets the full tag list on one entity.

TDQS

A3.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=false, but the description says the tool replaces each entity's tag list, and the schema exposes a deleted flag that clears or removes tags. Replacing or clearing existing tags is not an additive-only update, so the description contradicts the annotation's safety claim.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and scope, followed by the single-entity alternative. There is no wasted language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the core bulk/single distinction and replacement behavior, but for a bulk mutation with no output schema it does not address atomicity, partial failure, batch limits, or return behavior. The schema documents item fields, but operational expectations remain incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the nested item fields and deleted flag are fully documented there. The description adds the replacement semantics and an example, which is useful but does not go beyond the schema's field-level guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (set tags), the resource (entity tags), the bulk scope (many entities at once), and gives a concrete example (every payslip in a pay run). It also names the single-entity sibling, so an agent can distinguish it immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this for many entities at once and to use set_entity_tags for a single entity. The example clarifies the intended scale and makes the bulk-vs-single routing clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_recurring_contractSet recurring contractAInspect

Set up, update, or disable a recurring schedule on a document (bill, purchase order, etc.) so it repeats automatically. Pass the document id, enabled true/false, and a frequency (with day_of_month or weekday). Set autosend true to send each generated document automatically.

NameRequiredDescriptionDefault
idYes
enabledYes
weekdayNoDay of the week (0-6, Sunday=0) to run on, for weekly frequency. Defaults to Monday (1). Ignored for other frequencies.
autosendNo
frequencyNoHow often the document repeats. One of: monthly — Once a month. Set day_of_month (1-31) for the day; defaults to the 1st.; weekly — Once a week. Set weekday (0-6, Sunday=0) for the day; defaults to Monday.; daily — Every day.; yearly — Once a year on the given day_of_month; defaults to the 1st of January..
day_of_monthNoDay of the month (1-31) to run on, for monthly/yearly frequency. Defaults to the 1st. Ignored for daily/weekly.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that setting autosend to true will automatically send generated documents, which is an important side effect not covered by the readOnlyHint/destructiveHint annotations. It also notes the ability to disable schedules, aligning with non-destructive but state-changing behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main purpose, followed by parameter usage and a key side effect. No redundant or extraneous information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers all parameters and the main behavior, it implies frequency is always passed, yet the schema marks it non-required. It also doesn't clarify the behavior when disabling (e.g., whether frequency is ignored), leaving potential ambiguity for agents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to parameters that lack schema descriptions, such as id (document id), enabled, autosend, and the relationship between frequency and day_of_month/weekday. However, it does not elaborate on defaults or the optional nature of frequency, which is only partially covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool sets up, updates, or disables a recurring schedule on a document, using a specific verb and resource. It distinguishes from likely sibling tools by mentioning documents generally rather than only invoices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like set_recurring_invoice or trigger_recurring_contract. The description doesn't mention any sibling tools or selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_recurring_invoiceSet recurring invoiceAInspect

Set up, update, or disable a recurring schedule on an invoice so it repeats automatically. Pass the invoice id (find it yourself with list_documents by number; never ask the user for an id), enabled true/false, and a frequency (with day_of_month or weekday). Set autosend true to email each generated invoice to the client automatically.

NameRequiredDescriptionDefault
idYes
enabledYes
weekdayNoDay of the week (0-6, Sunday=0) to run on, for weekly frequency. Defaults to Monday (1). Ignored for other frequencies.
autosendNo
frequencyNoHow often the document repeats. One of: monthly — Once a month. Set day_of_month (1-31) for the day; defaults to the 1st.; weekly — Once a week. Set weekday (0-6, Sunday=0) for the day; defaults to Monday.; daily — Every day.; yearly — Once a year on the given day_of_month; defaults to the 1st of January..
day_of_monthNoDay of the month (1-31) to run on, for monthly/yearly frequency. Defaults to the 1st. Ignored for daily/weekly.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare non-readOnly and non-destructive, so the description usefully adds behavior: autosend emails each generated invoice to the client, and disabling stops repetition. It doesn't disclose permission requirements or exactly what disabling clears, but adds meaningful context 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose then the actionable parameter guidance. Nearly every clause earns its place, with only minor redundancy between the id instruction and the surrounding prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with no output schema, the description covers the primary call path and the autosend side effect. It leaves some gaps (return behavior, what disable does to existing generated documents) but is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema coverage, the description compensates by explaining id derivation, the meaning of enabled true/false, the frequency pairing with day_of_month/weekday, and the semantics of autosend. This adds real meaning beyond the raw schema fields, though it doesn't fully cover all six parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (set up/update/disable) against a clear resource (recurring schedule on an invoice) with the outcome ('so it repeats automatically'). It is distinguishable from set_recurring_contract and trigger_recurring_invoice because it names the invoice as the target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operative guidance, especially the routing instruction to derive the id via list_documents by number rather than asking the user. It stops short of explicitly saying when to prefer this over sibling tools like trigger_recurring_invoice, so no exclusion criteria are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

settle_billsSettle billsA
DestructiveIdempotent
Inspect

Settle a batch of bills in one call (bills only: an invoice's leftover FX or rounding gap is settled with save_document settled true) — each pair links a bill / purchase order / GRN (cont-…) to its payment: either an existing expense (expense) or a bank transaction (transaction: a bank-feed transaction's own unallocated expense is re-pointed at the bill; an unlinked transaction gets a new expense linking the two). Money-out settle = an expense whose accountid is the bill's id. record_document_payment settles ONE bill at a time (minting the expense from payment fields); this tool instead LINKS an existing expense or bank transaction and settles a whole batch, which the chat loop can't do with N single settles. Each pair is applied INDEPENDENTLY: one failing (missing/locked/bad ref) never aborts the rest. Every id (bill, expense, transaction) is owner-scoped; an already-settled bill, or a transaction whose expense already pays that bill, is a safe no-op (not a failure), so re-running the same batch is harmless. A transaction allocated elsewhere (income, another bill or category, several expenses) fails with a reason naming the allocation. A bank transaction slightly ABOVE the bill (a bank fee, at most 3% of the outstanding, same currency) is not refused: it comes back status "proposed" with a proposal {type bank-charge, amount, accountid 201, accountname Bank Charges, outstanding, paid} and NOTHING is written. Show the user the fee; only once they confirm, re-send the same pair with bankcharge = proposal.amount to settle the bill and post the fee to Bank Charges in one transaction (re-sending again is an already-settled no-op). Above 3% the over-settle refusal stands. A bank transaction in a DIFFERENT currency from the bill, worth within 3% of the outstanding at its date's rate, comes back status "proposed" with a proposal {type fx-gain|fx-loss, amount, currency, accountid, accountname, outstanding, paid, paidcurrency, paidbase, exchangerate; for a bill in a foreign currency also billcurrency, carrying (the bill's base value), paidbill} and NOTHING is written. Show the user the FX line; only once they confirm, re-send the same pair with fxadjustment = proposal.amount to settle the bill and post the difference to the Foreign Exchange account (when the business has autofxadjustment on, it is booked without asking). A bill in a foreign currency paid from a bank line in that same currency settles at once and books the rate move since the bill date to Foreign Exchange (fxadjustment, autobooked); with no dated rate it settles with no FX line and fxunsized true. Any other currency mismatch (an expense pair, no dated rate, outside 3%, a partial payment in another currency) is refused with status "failed", code "cross-currency-needs-fx", billcurrency and paymentcurrency, and NOTHING is written. Returns {results [{bill, status "settled"|"already-settled"|"proposed"|"failed", expenseid, created, bankchargeid, fxadjustmentid, fxadjustment, proposal, reason}], settled, already-settled, proposed, failed} — expenseid is the undo handle and created=false means the expense pre-existed (undo by UNLINKING it, never deleting); bankchargeid is the minted fee expense (safe to delete); fxadjustmentid is removed automatically when its expenseid is unlinked from the bill or deleted, so do NOT delete it separately (restoring a deleted expense does not bring its FX line back). Max 100 pairs per call. Only run after the user has confirmed the proposed matches.

NameRequiredDescriptionDefault
pairsYesThe confirmed bill↔payment pairs to reconcile. Each is applied independently.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations (which only say non-readonly, idempotent, destructive). The description discloses that pairs apply independently and one failure never aborts the batch, that already-settled bills are safe no-ops, that proposals write NOTHING, the 3% bank-fee threshold, the cross-currency failure code, and precise undo semantics (unlink the expense, never delete; bankchargeid is safe to delete; fxadjustmentid is auto-removed).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and the single-vs-batch contrast are front-loaded, but the body is a dense wall of nested parentheticals and em-dash clauses that is hard to scan; the FX and bank-charge rules are buried in one long paragraph. Almost every sentence carries information, so this is over-density rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a complex, destructive, batch-mutating tool with no output schema: it documents the full return shape (results array with statuses, expenseid, created, bankchargeid, fxadjustmentid, proposal, reason), aggregate counts, and the failure taxonomy including cross-currency-needs-fx.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 beyond the schema: what `bankcharge` and `fxadjustment` mean as confirmation echoes of a returned proposal, and the exclusivity of `expense` vs `transaction` with different write paths for each. Some of this overlaps the schema text, which keeps it off a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Settle a batch of bills in one call') and immediately narrows scope ('bills only'), naming the sibling path for the invoice case (save_document settled true) and contrasting with record_document_payment. An agent can distinguish this from every nearby 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rules: use record_document_payment for one bill at a time, use save_document for an invoice's FX/rounding gap, and only run this after the user confirms the proposed matches. It also states the batch-size ceiling (max 100 pairs) and the confirmation-only re-send protocol.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_todosSet todosAInspect

Create or replace the todo checklist for the current chat. Pass the FULL list of items every time (the stored list is replaced, not merged). Each item has text and a status of "pending", "in_progress", or "done". Use this to plan and track multi-step work — mark an item "in_progress" before starting it and "done" when finished — so progress is visible to the user and survives across sessions. Requires a chatid from an ACTIVE Ask-stub chat session — the id cannot be minted via MCP, so this tool applies only when operating inside a chat. Never include ids; name records by number, name, amount or date.

NameRequiredDescriptionDefault
todosYesThe FULL checklist (replaces the stored list, not merged).
chatidYesId of the chat whose todo checklist to replace.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations (readOnlyHint=false, destructiveHint=false). Discloses the full-replace-not-merge behavior, the per-item status model, the visibility/session persistence, and the hard prerequisite that chatid must come from an active chat session and cannot be minted via MCP.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the create-or-replace action and the full-list rule. Dense but every sentence carries operational value. Slightly long with the id naming rule tacked on at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, and the description covers the mutation semantics, status lifecycle, and the chatid prerequisite adequately. The 'never include ids' line sits oddly against the schema's optional id field, leaving slight ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds meaningful semantics: full list replaces rather than merges, item fields text+status with enum values, and 'never include ids'. However 'never include ids' conflicts with the schema which allows an optional id for stable ids, which is a minor contradiction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (create or replace) and resource (todo checklist for the current chat), and distinguishes the replace semantics from a merge. Sibling names are mostly accounting tools, so no confusing overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly explains when to use it: planning multi-step work, marking in_progress before starting and done when finished. Also states the prerequisite of an ACTIVE Ask-stub chat session. Lacks explicit when-not-to-use beyond the chatid prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snooze_messageSnooze messageAInspect

Snooze a notification — resurfaces tomorrow at 08:00 SAST

NameRequiredDescriptionDefault
idYesId of the message/notification to snooze.
timeNoSnooze duration hint in minutes; omit to snooze until tomorrow 08:00 SAST.
snooze-untilNoExplicit ISO 8601 timestamp to resurface the message at; overrides `time`.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains the resurfacing behavior, which goes beyond the annotations, but does not detail other side effects such as whether the message is marked as read or alerted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, direct, and front-loaded with the action and default behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the schema covers parameters, so the description is sufficient overall, though it could clarify the relationship between the default and the optional time parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes all parameters with 100% coverage; the description adds no additional parameter semantics beyond what is in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Snooze a notification') and the resource ('notification'), and the behavior is distinct from siblings like mark_message_read or delete_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool (deferring a notification to a specific time) but does not explicitly contrast it with sibling message actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_recurring_schedulesStop recurring schedulesAInspect

Stop repeat series so they make no more copies. Pass ids of the repeating invoices or any of their copies; copies of one series stop it once. Each result says whether the series was found off after the stop. Report from those results.

NameRequiredDescriptionDefault
idsYesRepeating invoices, or copies they made, whose series to stop. Get them from list_recurring_schedules.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already say mutation but non-destructive; the description adds that the effect is to stop future copies, that duplicate ids from one series are collapsed, and that each result reports whether the series was found off. It still doesn't state permissions, reversibility, or what happens to existing copies, but that's beyond what a concise description needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the effect and then invocation guidance. 'found off' and 'Report from those results' are slightly awkward but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter, no output schema, and annotations covering safety, the description supplies the key operational context: effect, accepted id forms, dedupe behavior, and result interpretation. It could mention reversibility or existing-copy handling, but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already defines the ids array. Description adds meaningful semantics: ids can be original repeating invoices or any generated copies, and multiple copies of one series stop it only once.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: stop repeat series so they make no more copies. This clearly separates it from trigger_ or set_recurring_invoice, but it does not explicitly name or contrast the siblings, so it stops short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains that ids may be repeating invoices or their copies and that one series stops once. It gives invocation context but no explicit when-not-to-use or named alternative such as trigger/set/list, so usage is implied rather than fully guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_appsSync appsAInspect

Refresh data from all of the business's installed integrations now (pulls the latest transactions/records from each connected app). Returns per-app sync results. Note: this pulls from every connected provider in turn and can take a while — on a business with several live bank feeds it may run longer than a typical tool-call timeout; if it times out the sync still continues server-side, so re-read (e.g. list_expenses) shortly after rather than immediately retrying.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral details: it iterates through every connected provider, can exceed timeout, and work continues server-side even if the client times out. The annotations are not contradicted, though the description could more explicitly state whether it writes data locally or only fetches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: action, purpose, return type, and a clear timeout note are all included without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains what it returns ('per-app sync results') and the timeout behavior, which is sufficient given there is no output schema. It could be slightly more specific about the shape of the per-app results, but this is not a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and the description correctly does not invent any. With zero parameters, the baseline of 4 applies and no additional param explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Refresh data from all of the business's installed integrations now') and specifies what it pulls ('latest transactions/records from each connected app'). It is distinct from related tools like refresh_business_data by focusing on installed integrations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use the tool and what to expect: it can take longer than a typical timeout, may continue server-side after timeout, and advises re-reading data (e.g., list_expenses) instead of retrying. This is strong practical usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_payrun_scheduleTrigger payrun scheduleAInspect

Generate the next monthly pay run draft(s) right now, without waiting for the schedule. Runs every enabled pay run schedule the business has.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint=false and destructiveHint=false, so the description carries the burden of explaining the mutation. It does disclose that this is an immediate action affecting all enabled pay run schedules, which is useful. But it does not mention side effects beyond generating drafts, idempotency, or whether generated drafts can be modified or undone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The most important information—'Generate the next monthly pay run draft(s) right now'—is front-loaded, and the scope statement follows efficiently. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter trigger tool, the description is largely complete: it states the action, the timing, and the scope (all enabled schedules). Since there is no output schema, a note about what the caller receives after triggering would improve completeness, but the core invocation context is adequately covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so the schema fully captures the parameter surface. The description adds no parameter details, but none are needed. A baseline of 4 applies for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Generate the next monthly pay run draft(s) right now, without waiting for the schedule.' It names a specific resource (pay run drafts) and makes the immediate-trigger nature explicit. It also distinguishes itself from waiting for the schedule and from sibling trigger tools targeting recurring contracts/invoices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use the tool: when pay run drafts should be generated immediately rather than waiting for the normal schedule. It also scopes behavior to 'every enabled pay run schedule the business has.' However, it does not explicitly mention alternatives or exclusion conditions, though the conditions for use are reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_recurring_contractTrigger recurring contractAInspect

Generate the next copies of recurring document templates (bills, purchase orders, etc.) right now, without waiting for the schedule. Pass entity_ids (the recurring document template ids).

NameRequiredDescriptionDefault
entity_idsNoThe recurring template ids to generate the next copies from now.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations indicate readOnly=false and destructive=false, and the description explains that it generates copies, which is consistent. It does not disclose potential side effects such as duplicate creation or whether the action is idempotent, but this is not 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using only two sentences, and front-loads the core purpose and timing. It avoids unnecessary detail and is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for an agent to understand the tool's immediate action and required input. While it does not describe return values or edge cases, the tool is simple enough that this omission is not a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the 'entity_ids' parameter with full coverage, and the description repeats that these are recurring template ids. No additional semantic detail beyond the schema is provided, so a baseline score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (generate next copies), the target resource (recurring document templates), and the immediacy (right now, without waiting for the schedule). It distinguishes itself from scheduling-related tools by emphasizing immediate generation, though the sibling 'trigger_recurring_invoice' is not explicitly contrasted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description instructs the caller to pass 'entity_ids' as the recurring template ids, which is helpful. However, it does not explicitly explain when to use this tool versus related alternatives like 'trigger_recurring_invoice' or 'set_recurring_contract', leaving some inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_recurring_invoiceTrigger recurring invoiceAInspect

Generate the next copies of recurring invoice templates right now, without waiting for the schedule. Pass entity_ids (the recurring invoice template ids).

NameRequiredDescriptionDefault
entity_idsNoThe recurring template ids to generate the next copies from now.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate that this is not a read-only operation (readOnlyHint: false) and not destructive (destructiveHint: false). The description's word 'generate' aligns with a write action but does not disclose additional behavioral details such as side effects, idempotency, or reversibility. Since the annotation already covers the basic write nature, the description adds little extra transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and to the point, consisting of two clear sentences. It states the action, the target, the condition, and the required input without any fluff or redundant information. This makes it easy for an agent to parse and act upon.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains what the tool does (generates invoices) and what input is needed, but it does not specify the output or return value. Since there is no output schema, the description carries the responsibility for explaining the result. It falls short by not mentioning whether it returns the created invoices, a status confirmation, or something else, leaving some ambiguity about the expected outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description for 'entity_ids' already clarifies that these are 'The recurring template ids to generate the next copies from now.' The tool description essentially repeats this by saying 'Pass entity_ids (the recurring invoice template ids).' With 100% schema coverage, the description adds minimal new semantic value, so it meets the baseline but does not elevate it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to generate the next copies of recurring invoice templates immediately. It specifies the action ('generate'), the target ('recurring invoice templates'), and the timing ('right now, without waiting for the schedule'). This distinguishes it from related tools like 'set_recurring_invoice' and 'trigger_recurring_contract' by focusing on the immediate execution rather than setup or another recurring entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly guides usage by stating 'without waiting for the schedule', indicating that this tool is for triggering invoices on demand rather than letting the schedule handle it. It also instructs to 'Pass entity_ids', clarifying the required input. However, it does not explicitly mention alternatives or when not to use it, leaving some room for inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undo_agent_runUndo agent runA
Destructive
Inspect

Undo a bulk agent run by its job id — reverses every change that run made, skipping anything you've since edited by hand.

NameRequiredDescriptionDefault
jobidYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotative destructiveHint=true is reinforced by the description stating it 'reverses every change', which is appropriately transparent. The additional detail about skipping manual edits provides further behavioral context beyond the annotation, making the tool's side effects clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-formatted sentence that front-loads the primary action and then explains the behavior and a key limitation. No unnecessary words or repetition; it is ideal in length and structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive nature of the tool, the description adequately covers the core effect (reverses changes) and the critical caveat (skips manual edits). It does not mention whether the undo itself is reversible or if there are other side effects, but these may not be essential for basic usage. Overall, it provides sufficient context for an agent to understand the tool's impact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'jobid' is a string with no schema description, and the tool description merely references it as 'by its job id'. While the name is somewhat self-explanatory, there is no guidance on how to obtain the job id or what format is expected. The description adds minimal meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool undoes a bulk agent run by job id, specifying the exact action and target. This is distinct from all sibling tools, as it is the only one that reverts agent runs, while others like get_app_run or list_app_runs only retrieve information.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear condition for use (when a bulk agent run needs to be undone) and includes a practical caveat (skips manual edits). However, it does not explicitly mention alternative tools or situations where this tool should not be used, which is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_accountUpdate accountAInspect

Update a chart-of-accounts LEDGER account by id, not a bank account; for a bank account, use update_bank_account. Changes its name, description, group or settings. See list_accounts for ids.

NameRequiredDescriptionDefault
idNoAccount id to update (see list_accounts).
codeNoThe business's own account code (e.g. "4000"). Trimmed; an empty string clears it; omit to leave it unchanged.
iconNoIcon identifier for the account (UI display).
metaNoOpaque metadata string stored on the account.
nameNoAccount name (e.g. "Consulting income", "Rent").
roleNoSemantic reporting role: "tax" (income-tax expense), "taxprovision" (tax provision/liability), or "salestax" (VAT control account). Omit for an ordinary account.
groupNoGroup label the account is organised under in the chart of accounts.
hiddenNoWhether the account is hidden from the chart-of-accounts UI.
deletedNoSoft-delete flag; true hides the account from active use.
journalNoJournal number classifying the account; maps to a standard journal name (e.g. sales, purchases, general).
premiumNoWhether the account is a premium-plan-only account.
primaryNoWhether this is the primary account of its kind.
parentidNoId of the parent account this nests under in the chart-of-accounts tree.
defaultidNoBuilt-in account id this custom account maps to: a number such as "410" or a string such as "za-coida" or "defaultvat".
baseaccountNoWhether this is a base/system account rather than a user-created one.
descriptionNoFree-text description of what the account is used for.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is known. The description adds useful scope (ledger account, not bank account) but does not explain partial-update behavior, permissions, or what happens to omitted fields, so it adds only moderate behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, front-loaded clauses with no wasted text. The primary purpose and the bank-account distinction come first, followed by scope and id source.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter update tool with 100% schema coverage and no output schema, the description supplies the key routing and id-discovery context. It is somewhat sparse on cross-parameter update semantics, such as whether omitted fields remain unchanged, but the annotations and schema cover most remaining needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines all 16 parameters in detail. The description mentions only a few updatable fields and points to list_accounts for ids, adding little beyond what the schema already provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: update a chart-of-accounts LEDGER account by id. It explicitly distinguishes this from a bank account and points to update_bank_account for that sibling, so an agent can identify the correct tool 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-not guidance ("not a bank account; for a bank account, use update_bank_account") and tells the agent where to obtain ids via list_accounts. This is clear routing guidance against a relevant sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_assetUpdate assetAInspect

Update a fixed asset by id — its name, value, purchase date or depreciation settings.

NameRequiredDescriptionDefault
idNoAsset id. Required on update; omit on create.
nameNoName of the asset (e.g. "Delivery van").
notesNoFree-text notes about the asset.
amountNo(Deprecated) legacy purchase value; the asset's cost now derives from its linked expense/transaction, so this is ignored.
incomeNoId of an income record linked to this asset (e.g. proceeds from its disposal).
unlinkNo(Legacy) id of a linked transaction to detach from the asset; prefer the dedicated unlink asset-transaction endpoint.
expenseNoId of the expense record that recorded the asset's purchase (its cost basis).
disposedNoWhether the asset has been disposed of (sold or retired).
accountidNoChart-of-accounts account id categorising this asset (see list_accounts).
usefullifeNoUseful life of the asset in years.
transactionNo(Legacy) id of a bank transaction to associate with the asset; asset↔transaction links are normally managed via the dedicated link/unlink asset-transaction endpoints.
depreciationNoWhether this asset depreciates over time.
disposeddateNoDate the asset was disposed (ISO 8601); defaults to now when :disposed is set without a date.
baseaccountidNoChart-of-accounts account id for the asset's accumulated-depreciation / base account (see list_accounts).
depreciationrateNoAnnual depreciation rate as a decimal fraction (e.g. 0.2 = 20% per year); used by the diminishing-balance method.
depreciationtypeNoDepreciation method: a string containing "straight" (straight-line), "diminish" (reducing/diminishing balance), or "fifty" (50/30/20 wear-and-tear).
depreciationstartNoDate depreciation starts (ISO 8601).
usedefaultdepreciationNoWhether to use the business/category default depreciation settings instead of the values on this asset.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations correctly indicate a non-read-only, non-destructive update, and the description matches. No hidden side effects such as depreciation recalculation or disposal implications are disclosed, but there is no contradiction with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no redundant wording. It lightly expands the title without introducing unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich schema covering all parameters, the description is sufficient for identifying the update operation. It does not mention return values, but the lack of an output schema lowers that requirement, and the schema fills most contextual gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with detailed individual descriptions, so the description adds little beyond broad category labels. The baseline of 3 applies because the schema already supplies the needed parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action (update), the resource (fixed asset), and the scope (by id, with fields like name, value, and depreciation settings). It distinguishes the tool from create_asset and other update_* siblings, though 'purchase date' is mentioned without a matching schema parameter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies an existing asset by id but does not explicitly state when to prefer this over create_asset or the dedicated link/unlink asset-transaction endpoints. It provides no alternative-tool guidance or exclusionary conditions, leaving usage context only partially conveyed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_bank_accountUpdate bank accountAInspect

Update an existing bank account by id — its name, bank, account number or opening balance. Changing the opening balance regenerates the account's synthetic opening-balance entry. An opening date later than the account's own earliest transaction is refused, unwritten, with code confirm-required until the same call is repeated with confirm true. To add a brand-new account use create_bank_account. PROD-2612: an :accountid naming another ledger account moves the bank account and its bare feed transactions onto it; pick one from /bankaccount/candidates and send :openingbalance 0, because a feed's stored opening balance would otherwise refuse the move, and clearing it lets the next sync write it again.

NameRequiredDescriptionDefault
idNoID of the bank account, required for updates
bankNoName of the bank
syncNoWhether automatic bank sync is enabled
hiddenNoWhether the account is hidden/soft-deleted (removes its card; also stops sync)
confirmNoPROD-1536: required only to save an opening date that is LATER than the account's own earliest transaction. Without it that one case is refused, unwritten, with code confirm-required plus earliesttransactiondate and transactionsbefore, so the caller can show what the date would exclude and let the user override it.
privateNoWhether this is a private account
syncingNoWhether sync is currently in progress
archivedNoWhether the account is archived
accountidNoThe ledger account this bank account settles into. PROD-2612: set it to one of the business's own asset accounts to use that account instead of minting a new one; it must not be a control or built-in account or another bank's, and the request must leave out the opening balance and any other currency. Refused with a link-* reason.
swiftcodeNoSWIFT/BIC code for international transfers
branchcodeNoBank branch code or routing number
accountnameNoName of the bank account
accounttypeNoType of account (e.g., checking, savings)
openingdateNoDate of the opening balance
openingrateNoPROD-2452: for an account in a currency other than the business's, the opening exchange rate as account-currency units per one base unit (21.7821 ZAR per GBP); must be above 0. Omitted, the rate feed's rate on the opening date is used. Ignored for a base-currency account.
syncenabledNoWhether this account is enabled for bank sync
accountnumberNoBank account number
creditaccountNoDefault credit account ID
creditjournalNoDefault credit journal ID
openingbalanceNoOpening balance for the account
clearopeningbalanceNoPROD-1200: when true, fully REMOVE the opening balance — retracts openingbalance, openingdate and the FX opening rate and base value (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false, so the description does the heavy lifting: it discloses that changing the opening balance regenerates the synthetic opening-balance entry, that a too-late opening date is refused unwritten with code confirm-required until repeated with confirm true, and that a ledger-account move is refused with a link-* reason. These are exactly the side effects and failure modes an agent must anticipate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the sibling hand-off are front-loaded, but the closing PROD-2612 sentence is a dense run-on mixing internal ticket IDs, path syntax and colon-prefixed parameter names (":openingbalance 0"), which slows an agent parsing it. The ticket references are arguably noise, though each sentence does carry operational content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 21-parameter mutation with no output schema and minimal annotations, the description covers the genuinely risky paths well. It omits two things an agent would want: that the call is a partial update (zero required parameters), and any hint about how a successful response looks or whether the regenerated opening-balance entry is revertible.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 an extra point for cross-parameter meaning the schema cannot express — that :accountid must be paired with :openingbalance 0 because a feed's stored opening balance would otherwise refuse the move. It does not explain the many unmentioned flags (hidden, sync, syncing, swiftcode), leaving those to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update an existing bank account by id") and enumerates the mutable facets (name, bank, account number, opening balance). It explicitly routes the create case to create_bank_account, so the agent can distinguish it from at least one sibling 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear 'use this to update, use create_bank_account for new' routing, plus a concrete procedure for the PROD-2612 move case (pick from /bankaccount/candidates, send openingbalance 0) and the confirm-retry loop. It never mentions update_bank_account_currency or update_account, which are the nearest siblings an agent could confuse with this one, so the alternative-mapping is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_bank_account_currencyUpdate bank account currencyAInspect

Change the currency of an existing bank account by id. The ledger account moves with it, and a stored opening balance is repriced in the new currency. An account that already has transactions is refused, unwritten, with code confirm-required until the same call is repeated with confirm true.

NameRequiredDescriptionDefault
idYesID of the bank account
confirmNotrue to change it although the account already has transactions
currencyYesThe new three-letter ISO currency code, e.g. USD
openingrateNoRate for the opening balance, in account units per one base unit; the feed's rate otherwise

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false). The description goes well beyond that, disclosing side effects (ledger account moves, opening balance repriced) and the exact failure protocol: accounts with transactions are refused, unwritten, returning code confirm-required until repeated with confirm true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the operation, then effects, then the failure/retry rule. No filler; each sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param mutation tool with no output schema, this covers purpose, side effects and refusal behavior well. The remaining gap is what a successful call yields/returns, but that is minor given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the schema already documents id, currency, confirm and openingrate. The description adds real meaning on top of that, explaining the confirm gate's error code and the repeat-with-confirm-true workflow, though it says nothing further about openingrate or the base-unit rate semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Change the currency of an existing bank account by id'), which is a precise sub-operation distinguishable from the broader sibling update_bank_account and from convert_currency. An agent can tell what this does 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (existing account, by id) and it describes the refusal/retry path, but it never names an alternative (update_bank_account, convert_currency) or states when this is the right choice versus those. Adequate but without explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_businessUpdate businessAInspect

Update the business's own profile fields (name, contact details, industry, currency, tax rate, and the like). To change only the free-text description use set_business_description, or only a single tag use set_business_tag.

NameRequiredDescriptionDefault
idNoThis business's id. Optional — defaults to the authenticated token's own business; supply only to target a specific business.
ageNoAge of the business (label, e.g. how long it has been trading).
tagNoUnique public vanity tag/slug for the business (used in its public page URL and for segmentation).
bankNoBank name for the account shown on invoices.
cityNoCity / town.
logoNoBusiness logo image URL (or data URI).
nameNoTrading / display name of the business.
aboutNoShort description / bio of the business shown on public pages.
alertNo
phoneNoBusiness contact phone number.
regionNoState / province / region.
suburbNoSuburb.
addressNoStreet address line 1.
charityNoWhether the business is a charity / non-profit.
countryNoCountry (name or code).
detailsNoNested profile details. Currently carries the legal entity type and the subscription billing contact.
productNoWhether the business sells products (goods).
serviceNoWhether the business sells services.
webhookNoWebhook URL to notify on business events.
websiteNoBusiness website URL.
address2NoStreet address line 2.
currencyNoBusiness base currency, ISO 4217 (e.g. "ZAR", "USD").
industryNoIndustry the business operates in.
referrerNoHow the business was referred (referral source).
salestaxNoWhether sales tax / VAT is enabled for the business.
showbankNoWhether to show the business's bank details on invoices.
turnoverNoAnnual turnover in the base currency.
twitchidNoTwitch channel id, for the Twitch / streamer integration.
employeesNoNumber of employees (as a label / band).
sdlnumberNoSDL (skills development levy) reference number.
taxregimeNoTax regime the business is registered under.
uifnumberNoUIF (unemployment insurance fund) reference number.
vatnumberNoVAT registration number.
branchcodeNoBank branch code shown on invoices.
experienceNoFounder's business / industry experience (label).
payenumberNoPAYE (payroll income-tax) reference number.
postalcodeNoPostal / ZIP code.
quotenotesNoDefault notes text placed on new quotes.
quotetitleNoDefault heading / title used on quotes (e.g. "Quote", "Estimate", "Cost Estimate"). Offered from the business locale's own quoteTitles list; unset renders the built-in "Quote".
accountnameNoBank account holder name shown on invoices.
accounttypeNoBank account type (e.g. "cheque", "savings").
invoicenotesNoDefault notes text placed on new invoices.
invoicetitleNoDefault heading / title used on invoices.
lastreviewedNoDate the business's books were last reviewed (ISO 8601).
quotemessageNoDefault customer-facing message on new quotes.
salestaxcronNoCron expression driving sales-tax return reminders / automation.
salestaxrateNoDefault sales-tax / VAT rate as a decimal fraction (e.g. 0.15 = 15%).
accountnumberNoBank account number shown on invoices.
invoicebankidNoId of the bank account to display on invoices.
invoiceoffsetNoStarting offset added to auto-generated invoice numbers.
paymentbankidNoId of the bank account payments are collected into.
customizationsNoJSON string of UI / branding customizations for the business.
featurepreviewNoWhether the business opts into preview / beta features.
invoicemessageNoDefault customer-facing message on new invoices.
openingbalanceNoOpening cash / bank balance carried into the books, in the base currency.
salestaxduedayNoDay of the period on which the sales-tax return is due.
salestaxnumberNoSales-tax / VAT registration number.
incometaxnumberNoIncome-tax reference number.
paymentpagelogoNoLogo image URL shown on the hosted payment page.
paymentpagenameNoDisplay name shown on the hosted payment page.
proofofdeliveryNoWhether proof-of-delivery capture is enabled.
tradesourcecodeNoSARS trade / source code classifying the business's main activity.
autofxadjustmentNoWhen true, settle_bills books the FX gain/loss line on a cross-currency bill payment (within 3%) without asking for confirmation. Off by default: the line is proposed and the user confirms it.
salestaxscheduleNoSales-tax filing schedule (e.g. monthly / bi-monthly).
streamelementsidNoStreamElements account id, for the StreamElements integration.
vanitypageactionNoCall-to-action mode for the business's public vanity page, e.g. "donate" or "pay".
financialstartdayNoDay of the month the financial year starts (1-31).
salestaxexclusiveNoDefault for whether new invoice / product line items are entered VAT-exclusive (price shown ex-VAT, tax added on top) rather than inclusive.
streamelementsjwtNoStreamElements JWT credential for the integration.
registrationnumberNoCompany registration number.
financialstartmonthNoMonth the financial year starts (month name or number).
paymentpagedisabledNoWhether the public payment page is disabled.
salestaxrecoverableNoWhether input sales tax / VAT is recoverable for the business.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-read-only, non-destructive update operation, and the description adds the scope of profile fields plus sibling routing. However, it does not disclose partial-update semantics, permission requirements, validation behavior, or side effects beyond what the annotations and schema imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two front-loaded sentences with no wasted wording. It states the primary purpose first and then the key alternative-tool routing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the extremely rich schema and existing annotations, the short description is sufficient for selecting the tool and finding parameter details. It still omits partial-update behavior and mutation side effects, but the schema covers the parameter-level complexity well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 99%, so the schema already carries nearly all parameter meaning. The description adds only a high-level list of example field categories, which helps orient the agent but does not add meaningful semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: updating the business's own profile fields. It gives representative fields and explicitly distinguishes the tool from set_business_description and set_business_tag, so an agent can identify its role 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly says this tool is for profile-field updates and names dedicated alternatives for changing only the free-text description or only a single tag. The routing guidance is explicit enough to prevent misuse of this broad update tool for narrow field changes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_dashboardUpdate dashboardAInspect

Change a dashboard's name, description, position or whole set of tiles. Send the updatedAt you read as baseUpdatedAt.

NameRequiredDescriptionDefault
idYes
nameNo
tilesNoThe whole new set of tiles; replaces the old set.
positionNo
descriptionNo
baseUpdatedAtYesThe updatedAt the edit was made from. A dashboard changed since then refuses as stale.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-destructive write. The description adds a genuinely useful behavioral trait beyond that: a dashboard modified since the supplied timestamp 'refuses as stale', which tells the agent edits can be rejected for concurrency reasons. It does not say whether omitted fields are left unchanged or what the error payload looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the field enumeration is front-loaded ahead of the precondition. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with no output schema, the definition covers purpose, editable fields, and the staleness precondition. The remaining gap is patch-vs-replace semantics for omitted fields, which an agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33%, so the description must compensate, and it does: it maps four of the six parameters to their meaning and clarifies that baseUpdatedAt is the updatedAt previously read. Only 'id' and the tiles item shape are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (change) plus the resource (a dashboard) and enumerates the mutable fields: name, description, position, tiles. It does not explicitly distinguish itself from the sibling update_dashboard_tile, though 'whole set of tiles' gestures at it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete operational instruction ('Send the updatedAt you read as baseUpdatedAt') but never states when to choose this over update_dashboard_tile for a single tile or delete_dashboard/create_dashboard. Usage is implied rather than comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_dashboard_tileUpdate dashboard tileCInspect

Change one tile on a dashboard.

NameRequiredDescriptionDefault
tileYesThe fields to change. A field sent as null is cleared.
tileIdYes
dashboardIdYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-read, non-destructive mutation, so the description owes context beyond that: whether the update replaces or merges fields, whether omitted fields are preserved, whether nulls clear fields (this only appears in the schema), and what the response returns. It provides none of this, merely restating that something is changed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no wasted wording and the core action front-loaded, but the brevity crosses into under-specification for a mutation tool with a free-form nested payload. It is efficiently written rather than appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool mutates a nested, schema-opaque object and has no output schema, so the description carries the burden of explaining what fields are valid and how partial updates behave. It does neither, and gives no pointer to discovery tools such as list_dashboard_tile_types or get_dashboard.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With coverage at 33%, the description needs to compensate and does not. It adds zero meaning beyond the schema, leaving the agent with an untyped additionalProperties bag and no hint about valid tile fields or where to discover them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Change one tile on a dashboard" names a specific verb (change) and resource (a single dashboard tile), which distinguishes it from the neighbouring add_dashboard_tile, remove_dashboard_tile and update_dashboard tools. It is clear but minimal — it says nothing about what aspects of the tile are changeable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this rather than add_dashboard_tile, remove_dashboard_tile, update_dashboard, or list_dashboard_tile_types. No preconditions are stated (e.g. that the tile must already exist, or that a dashboard/tile id must be obtained first via get_dashboard or list_dashboards).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_document_itemUpdate document itemAInspect

Change a line that is ALREADY on a document (invoice, quote, bill and so on), not its header: header fields (contact, dates, type) go through save_document, and a new line goes through add_document_line. To change several lines on one document, prefer update_document_items_bulk — one call instead of many.

NameRequiredDescriptionDefault
idNoLine item id. Required on update_document_item; omit on add_document_line.
costNoUnit cost (for margin / cost-of-sales), in :costcurrency.
nameNoLine item name / title.
sortNoDisplay order of the line within the document (ascending).
unitNoUnit label for the quantity (e.g. "hours", "kg").
priceNoUnit price (per-unit selling price) in the document currency.
amountNoLine total (unit price × quantity), usually derived from :price × :quantity. Accepts a number or a numeric string.
expenseNoPass "$delete" to unlink the expense this line recovers; the line keeps its name, account and amount. Rebilling is add-only, so any other value is refused.
productNoId of a catalog product to link this line to.
variantNoId of a catalog product variant to link this line to.
quantityNoNumber of units. Accepts a number or a numeric string.
accountidNoPer-line chart-of-accounts / expense-category id; bills split cost by category at accrual (see list_accounts).
quinvoiceNoId of the parent document (invoice, quote, bill, etc.) this line belongs to.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
descriptionNoLine item description.
costcurrencyNoISO 4217 currency of :cost, when it differs from the document currency.
baseupdatedatNoOptimistic-concurrency token: the line's last-known updatedat (epoch number or ISO string). A stale value is rejected; omit to skip the check.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is already covered, and the description is consistent with them. The description adds scope context (existing line vs. header) but says nothing about partial-update semantics, permission/auth requirements, or error behavior on stale data. With annotations carrying the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core operation, then the two exclusions, then the bulk alternative — all in two tight sentences with no filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter mutation tool with full schema documentation and no output schema, the description's job is mainly disambiguation, which it does thoroughly. It stops short of describing mutation semantics (e.g. what happens to unspecified fields, concurrency rejection), a minor gap given the schema covers the parameters themselves.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 17 parameters are already fully documented in the schema (including optimistic-concurrency via baseupdatedat and the $delete semantics for expense). The description adds no parameter-level detail beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change/update) and resource (a line already on a document), and explicitly scopes it against siblings: header fields go through save_document, new lines through add_document_line. An agent can distinguish this tool from its nearest 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use this tool (changing an existing line), when not to (header edits, adding new lines), and names the preferred alternative for multi-line edits (update_document_items_bulk). The routing logic is complete and leaves nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_document_item_salestaxUpdate document item salestaxAInspect

Update the sales-tax (VAT) on a single line item of a document (invoice, quote, credit note, debit note) — change the rate or amount. Identify the item by its id. To add a new sales-tax line use add_document_item_salestax.

NameRequiredDescriptionDefault
idNoSales-tax line id. On update, identifies which sales-tax to change (or pass :salestaxid); omit on add.
nameNoSales-tax name (e.g. "VAT").
rateNoSales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected.
amountNoFixed sales-tax amount, used instead of :rate when :useamount is true.
itemidNoId of the document line item this sales-tax attaches to. On update, if :id/:salestaxid are omitted and the item has exactly one sales-tax, it is resolved from here.
invoiceNoAlias for the parent document id (see :quinvoice).
parentidNoId of the business's own sales-tax definition this line applies (see get_business_profile salestaxes). On add, when omitted, the definition is matched by name, then by rate when exactly one definition has that rate. If several match, the call is refused and lists their ids; pass one as parentid. A 0 rate with no name match stays unlinked.
exclusiveNoWhether the tax is exclusive (added on top of the line amount) rather than inclusive (already contained in it).
invoiceidNoAlias for the parent document id (see :quinvoice); takes precedence when several are supplied.
quinvoiceNoId of the parent document (invoice, quote, credit/debit note). Used to reindex the correct document; aliased by :invoice / :invoiceid.
useamountNoUse the fixed :amount instead of computing tax from :rate.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
salestaxidNoId of the sales-tax to update (alternative to :id).
recoverableNoWhether this input sales tax / VAT is recoverable.
referencenumberNoSales-tax registration / reference number.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/safe-mutation profile is covered. The description adds only that rate or amount may change; it does not disclose side effects such as reindexing the parent document, whether document totals are recomputed, or the rejection/refusal behavior on ambiguous matches (all of which only appear in the schema text).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the operation and scope, followed by the sibling routing. The middle clause 'Identify the item by its id' is the weakest sentence — vague and partially at odds with the schema — but it costs little.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter mutation with four overlapping document-id aliases (invoice, invoiceid, quinvoice) and an internal responseid, the description says nothing about which identifiers matter or that only one line is affected per call. Annotations cover the safety profile and the schema covers the parameters, but the description adds little orientation for such a wide signature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all 15 parameters, including the alias precedence rules and the decimal-fraction rate convention. The description contributes only the loose phrase 'change the rate or amount,' and its 'identify the item by its id' phrasing is less precise than the schema's definition of id as the sales-tax line id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource — update the sales-tax on a single document line item — and enumerates the document types it applies to (invoice, quote, credit note, debit note), which is enough to distinguish it from add_document_item_salestax. It is slightly muddied by 'Identify the item by its id,' since the schema defines id as the sales-tax line id, not the parent item id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent to add_document_item_salestax for the add case, which is the nearest sibling and the most likely confusion. It stops short of stating prerequisites (e.g. that the document must exist, or when to use update_document_items_bulk instead for multiple lines, or update_document_item for the line itself).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_document_items_bulkUpdate document items bulkAInspect

Update many line items on a document in one call — prefer this over repeated single-item updates.

NameRequiredDescriptionDefault
itemsYesLine items to update; each entry must include the line `id` plus the fields to change.
quinvoiceYesId of the parent document (invoice, quote, bill, etc.) whose line items are being updated (required).

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds that this is a bulk mutation and one call, but does not disclose atomicity, partial failure behavior, or permission requirements. This is a moderate gap, not 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence with no filler. It front-loads the core action and scope, then adds a usage preference. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk-update tool with a nested items array, the schema carries enough parameter detail, and the description clarifies the intended use case. It is slightly incomplete because it omits what happens on partial failure or whether the update is atomic, but that is not essential for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both items and quinvoice already have meaningful schema descriptions. The tool description adds no parameter-level detail beyond what the schema provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Update'), a specific resource ('many line items on a document'), and a scope ('in one call'). This clearly distinguishes the bulk tool from related siblings like update_document_item, which targets a single item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: prefer this tool over repeated single-item updates. This is a direct routing signal, though it does not explicitly state when NOT to use it or name the exact sibling alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_document_paymentUpdate document paymentAInspect

Correct a payment ALREADY recorded against a document, identified by the payment id (not the document id); to record a new payment, use record_document_payment. Changes its amount, date or account on an invoice, quote, credit note or debit note. Never edit a correct payment to hide an FX or rounding gap; settle the document with save_document settled true instead.

NameRequiredDescriptionDefault
idNoDocument id to record the payment against — a money-in document (invoice / recurring invoice / quote / debit note) or a money-out document (bill / purchase order / GRN / credit note). On update, the payment id.
dateNoDate the payment was received (ISO 8601).
nameNoLabel for this payment (e.g. "Deposit", "Final payment").
notesNoFree-text notes on the payment.
amountNoPayment amount in the payment's currency.
methodNoPayment method as free text (e.g. "cash", "card", "eft") — no fixed set.
paymentNoBank/ledger account id the money moved through — received into (money-in) or paid from (money-out) (see list_accounts).
categoryNoIncome category for the payment; defaults to Sales when omitted.
currencyNoISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency.
responseidNoInternal: correlation id used to return the updated entity to the frontend; omit.
exchangerateNoManual FX rate to the business base currency; omit to use the stored/auto rate.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring readOnlyHint=false and destructiveHint=false, the description adds meaningful behavioral context: this is a correction operation against an existing payment, keyed by payment id, and it warns against editing correct payments to conceal FX/rounding discrepancies. It does not detail ledger effects or whether partial updates are allowed, but the core mutation behavior is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it first identifies the operation, then gives the key id distinction and alternative tool, then states the relevant fields, and finally adds a concise integrity warning. Every sentence carries operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-destructive mutation tool with full schema coverage and annotations, the description covers the essential context: what it updates, which identifier to use, the sibling alternative, and an important misuse warning. It does not address partial-update behavior or success/return semantics, but those are secondary given the absence of an output schema and the rich input schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all parameters thoroughly. The description reinforces the critical id semantic (payment id on update, not document id), but that point is also present in the schema, and it does not add further parameter-level guidance beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: correct an already recorded document payment, identified by payment id rather than document id. It clearly distinguishes this update tool from the sibling record_document_payment and lists the document types and fields affected.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool (to correct an existing payment) and when to use the alternative (record_document_payment for a new payment). It also gives a concrete negative guideline: do not edit a correct payment to hide an FX or rounding gap, and instead use save_document with settled true.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_entity_salestaxUpdate entity salestaxAInspect

Update an existing sales tax already on an entity. To add a new sales tax use add_entity_salestax (one entity), add_entity_salestaxes (several taxes on one entity), or add_salestax_to_entities (one tax across many entities).

NameRequiredDescriptionDefault
idYesId of the sales tax to update.
kindNo"salestax" | "levy" | "withholding"; "$delete" clears it.
nameNoDisplay name of the sales tax (e.g. "VAT").
rateNoSales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected.
orderNoStack position (default 0); components apply ascending.
amountNoExplicit sales tax amount; used instead of the rate when useamount is true.
compoundNoWhen true, this tax stacks on lower-order taxes' totals (default false).
parentidNoId of one of this business's salestax definitions to move the tax to; the record then reports under that tax.
exclusiveNoWhether the entity amount excludes this sales tax (tax added on top).
taxsourceNoStable locale rate-band identity, e.g. "locale:za/standard"; "$delete" clears it.
treatmentNo"standard" | "zeroRated" | "exempt"; blank/unknown means infer, "$delete" clears it.
useamountNoWhen true, use amount as the tax figure instead of computing from the rate.
recoverableNoWhether this sales tax is recoverable (claimable as input tax).
referencenumberNoSales tax registration/reference number.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the agent knows this mutates but is non-destructive. The description adds the key behavioral fact that this only operates on existing records. However, it doesn't mention idempotency, permissions, or partial-update semantics beyond the schema's $delete hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. The core action is front-loaded, and the sibling routing follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-param mutation tool with full schema coverage and clear annotations, the description covers the essential routing and scope. It could add a note about partial updates (only supplied fields change) or required permissions, but the main gaps are minor given the rich schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 14 parameters are already documented in the schema, including edge cases like $delete and rate limits. The description adds no parameter-level detail beyond routing guidance, which is appropriate given the exhaustive schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Update) and resource (existing sales tax on an entity), and explicitly distinguishes itself from the three add_* siblings by naming them. An agent can immediately tell this is a modification tool, not a creation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool (updating an existing sales tax) versus the alternatives, naming add_entity_salestax, add_entity_salestaxes, and add_salestax_to_entities with their respective scopes. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_folderUpdate folderAInspect

Update a file folder by id — rename it or change its parent. To create a brand-new folder use create_folder instead.

NameRequiredDescriptionDefault
idYesId of the folder to update (required).
nameNoNew name for the folder; omit to leave it unchanged.
parentidNoNew parent folder id to move this folder under; omit to leave it where it is.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is not read-only and not destructive. The description adds the behavioral scope of renaming and reparenting a folder, but it does not disclose side effects like how moving a folder impacts paths or whether the operation is idempotent. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The primary action and key parameters are front-loaded, and the alternative tool is mentioned only after the main capability is established. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with one required parameter, full schema coverage, and annotations, the description is largely complete. It identifies what the tool does, how it differs from create_folder, and the relevant fields. However, there is no output schema, and the description does not mention what the tool returns or whether it confirms success, which leaves a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents id, name, and parentid. The description adds operational context by describing name as 'rename' and parentid as 'change its parent', but it does not add meaning beyond that. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update a file folder by id', and clarifies the two concrete operations: rename it or change its parent. It also explicitly distinguishes itself from the sibling create_folder, leaving no ambiguity about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-not condition and names the alternative: 'To create a brand-new folder use create_folder instead.' This clearly routes an agent to the correct tool and covers the main competing operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_journal_lineUpdate journal lineAInspect

Change ONE debit or credit line of an existing journal entry in place; to rewrite the whole entry use save_journal_entry, and to add a line use add_journal_line. Changes its account, debit or credit amount; identify the line by its id.

NameRequiredDescriptionDefault
idNoLine id (for updating an existing line).
roleNoOptional line role: what the amount is (e.g. sars-3601), set by the producer. Lowercase letters, digits and hyphens, at most 64 characters. Send "$delete" to clear it; omit it to leave it alone.
debitNoDebit amount for this line (0 if this is a credit line).
creditNoCredit amount for this line (0 if this is a debit line).
entryidNoId of the parent journal entry this line belongs to.
clientidNoPROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send "$delete" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.
accountidNoChart-of-accounts account id for this line (see list_accounts).
supplieridNoPROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send "$delete" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false and destructive=false; the description adds the meaningful shape of the mutation — a single line is edited in place, so the rest of the entry is left intact, and the target line is addressed by id. It does not mention whether the parent entry must stay balanced or what happens to entry totals, which would be useful for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the scoping constraint front-loaded before the sibling routing. The second sentence ('changes its account, debit or credit amount; identify the line by its id') largely repeats the schema and could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter partial-update tool with full schema coverage and no output schema, the description supplies the essential framing: single-line scope, id-based targeting, and correct sibling choice. It omits how omission versus '$delete' behaves and any effect on entry balance, but those live in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each property (including the clientid/supplierid '$delete' semantics) is fully described there. The description only restates the id, account and amount fields at a high level, adding no syntax or edge-case detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Change ONE debit or credit line of an existing journal entry in place') and immediately distinguishes itself from save_journal_entry and add_journal_line, so an agent can pick 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: rewrite the whole entry -> save_journal_entry; add a line -> add_journal_line; otherwise this tool. The when-not conditions and the alternative names are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_messageUpdate messageAInspect

Change an existing message's text, context, notification flag or alert level by id; to mark it read use mark_message_read, and to hide it for a while use snooze_message.

NameRequiredDescriptionDefault
idYesId of the message to update.
textNoNew message body text.
alertNoAlert level/label.
contextidNoId of the related entity (e.g. an expense/invoice/file id).
contexttypeNoKind of entity `contextid` refers to.
notificationNoWhether this surfaces as a notification.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description confirms this is an in-place field mutation and lists which fields change, but does not disclose whether omitted fields are left untouched (partial vs full update), whether the id must already exist, or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the core mutation action and appends the disambiguation clauses. No wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with covering annotations, full schema coverage, and no output schema, the definition gives an agent enough to call it correctly. Remaining gaps are minor behavioral details (partial-update semantics, error/not-found behavior) that the annotations and schema do not supply either.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with self-documenting fields (id, text, alert, contextid, contexttype, notification), so the schema carries the parameter burden. The description adds only the grouped phrase 'context, notification flag or alert level', which adds no syntax or format 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Change/Update), a resource (message), and enumerates the mutable fields (text, context, notification flag, alert level) plus the id key. It also names the two sibling tools this must not be confused with, so an agent can distinguish it from mark_message_read and snooze_message without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes adjacent intents to alternatives: marking read goes to mark_message_read and temporary hiding goes to snooze_message. That is direct when-not/alternative guidance rather than implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_tagUpdate tagCInspect

Update an existing tag's name or colour by id. To make a new tag use create_tag, and to remove one use delete_tag.

NameRequiredDescriptionDefault
idNoTag id. Present → update that tag; omit → create a new one.
nameNoDisplay name of the tag.
colorNoHex colour for the tag (e.g. "#8a8d82"), used for display.
groupNoFree-text group the tag belongs to. On update, passing null or "" clears an existing group; omitting the key leaves it unchanged.
archivedNoWhether the tag is archived. Omit on create to default to unarchived.

TDQS

C2.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description hides a significant side effect: with the optional id, the tool also creates a tag, and it doesn't disclose any cascading effects on associated entities. Annotations provide only basic read/destructive flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and purposeful; every sentence adds value, including the sibling-tool alternatives.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description does not mention that the operation can upsert, that all parameters are optional, or what the result/return behavior is, leaving important invocation context uncovered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although every parameter has a description, the id parameter's semantics directly contradict the tool's stated update-only purpose, and the description only mentions name and color while schema includes group and archived.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action explicitly and distinguishes from create_tag/delete_tag, but it is undermined by the schema's optional id and 'omit → create' semantics, making the tool's true purpose ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear guidance to use create_tag for new tags and delete_tag for removal, but fails to clarify when the optional id path is appropriate, especially since omitting id can create a tag.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_transactionUpdate transactionA
Destructive
Inspect

Edit the imported BANK LINE by id, not the accounting entry categorised from it; to recategorise or re-attribute, use save_expense or save_income. Send id with the fields to change, or an items array to change many in one call. items is partial success: owned lines are written and the rest come back in errors. An item with deleted true bins the line and the income/expense derived from it.

NameRequiredDescriptionDefault
idNoID of the transaction to update. Omit when sending items.
dateNoTransaction date, YYYY-MM-DD
itemsNoSeveral transactions to update in one call. Partial success: owned ids are written and the rest come back in `errors`. `deleted` true bins the transaction and the income/expense derived from it.
notesNoAdditional notes about the transaction
valueNoTransaction amount in the base currency
ignoredNoWhether to exclude this transaction from the ledger
descriptionNoDescription of the transaction

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description adds genuine context beyond that: batch 'items' calls are partial-success (written ids vs 'errors'), and 'deleted: true' bins the line AND the income/expense derived from it. That disclosure of cascading effects is valuable, though it doesn't cover auth requirements or reversibility of edits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the scoping constraint, then the alternatives, then batch/delete semantics. No filler and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers what it edits, the batch partial-success/error return shape, and the destructive 'deleted' cascade. Dense and sufficient, with only minor gaps around permissions/reversibility.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 id/items relationship ('Omit when sending items'). The description reinforces the batch semantics but adds little field-level meaning beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Edit') and a precisely scoped resource ('the imported BANK LINE by id'), and explicitly distinguishes it from the accounting entry categorised from it. An agent can tell this apart from save_expense/save_income 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternatives directly ('to recategorise or re-attribute, use save_expense or save_income') and gives the condition that routes the agent there. It also spells out the single-vs-batch invocation modes (id vs items).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

void_documentVoid documentAInspect

Void a document (invoice, quote, credit note, bill or any other kind) by id, or un-void it with void false. A void document keeps its number but leaves the books and the contact's balance. Without confirm true it changes nothing and answers reason confirm-required with what it would do; ask the user, then call again with confirm true. A missing or another business's id is not-found.

NameRequiredDescriptionDefault
idYesContract or legacy invoice id to void or un-void.
voidNotrue (the default) voids the document; false un-voids it.
confirmNoSend true only after the user has agreed to the change the refusal described.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the sparse annotations: it discloses the accounting effect (keeps its number, leaves the books and the contact's balance), the two-step confirmation gate, the exact refusal token (`confirm-required`) and that the refusal describes what would have happened, plus not-found behavior for missing or foreign ids. This is exactly the disclosure an agent needs before mutating financial records.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and inverse, then the side effect, then the confirm protocol, then the error case — a sensible ordering. It is dense but every clause carries information; the slightly telegraphic phrasing costs a little readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description covers the meaningful return states (confirm-required refusal with a description of the pending change, not-found) and the side effects of the mutation. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 the schema lacks: the consequence of `void false` (un-void), the exact protocol for `confirm` including the refusal code, and that a foreign id yields not-found. That is value beyond the field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (void/un-void) on a specific resource (document) and enumerates the document kinds covered (invoice, quote, credit note, bill). It also immediately clarifies the inverse operation via `void false`, so an agent knows the full scope of the tool from one sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear procedural rule: without `confirm true` nothing changes, ask the user, then call again with `confirm true`. It also implies the void-vs-delete distinction by saying a voided document 'keeps its number' while leaving the books. It stops short of naming `delete_document` as the explicit alternative, so routing between the two must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_off_documentWrite off documentAInspect

Write off the unpaid rest of a sales invoice that will not be paid (bad debt), as the app's Write off on the invoice does: the outstanding amount goes to the write-off account, the VAT on it is reversed, and the invoice is locked. The write-off is always dated today, so its VAT reversal lands in the current open period; there is no date to choose. Without confirm true it changes nothing and answers reason confirm-required naming the amount, the account and the date; ask the user, then call again with confirm true. Refuses a quote or other non-invoice (not-an-invoice), a void invoice, one already written off (unchanged), one marked settled, one with nothing outstanding, one with a bank payment waiting for the owner's confirm (payment-pending), an invoice dated after today (invalid-date), and books locked through today (locked-period). A missing or another business's id is not-found.

NameRequiredDescriptionDefault
idYesThe sales invoice to write off, from list_invoices or get_document.
confirmNoSend true only after the user has agreed to the write-off the refusal described.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give readOnlyHint=false and destructiveHint=false, so the description carries useful extra context: the money movement, the VAT reversal, the invoice lock, the fixed today-date, and the confirm gate. However destructiveHint=false sits uneasily with an irreversible lock-and-reclassify operation, and the description never flags that the action is not undoable, so the safety profile is not fully resolved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is front-loaded: what it does, then the date/period caveat, then the confirm gate, then refusals. It is long and the refusal enumeration is dense inline prose, but every clause carries operational information rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description conveys what comes back (reason confirm-required with amount/account/date, and the named refusal codes) plus the full failure surface. Nothing material an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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: it explains that confirm is a two-step gate that changes nothing without it and returns a reason naming amount, account and date, and it identifies where the id comes from (list_invoices or get_document).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Write off the unpaid rest of a sales invoice... bad debt') and spells out the accounting effect: outstanding amount to write-off account, VAT reversed, invoice locked. This is clearly distinguishable from siblings such as void_document and record_document_payment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (invoice that will not be paid) plus an exhaustive when-not-to-use list keyed to refusal codes (quote, void invoice, already written off, settled, nothing outstanding, payment-pending, invalid-date, locked-period). The confirm-then-retry flow is stated as a required interaction pattern.

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.

  1. 15 tool updates
    • Changedadd_journal_line2 fields changed
      • addedInput schema / properties / clientid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
      • addedInput schema / properties / supplierid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
    • Addedcreate_clients_bulk
    • Changedcreate_income_expenses_bulk2 fields changed
      • changedInput schema / properties / expenses / items / properties / accountid / description
        Previous value: -"Chart-of-accounts category account id, or an exact account name to resolve (see list_accounts). Set to a bill / purchase order / GRN document id (cont-…) to record this expense as a payment against that document."New value: +"Chart-of-accounts category account id, or an exact account name to resolve (see list_accounts). Set to a bill / purchase order / GRN document id (cont-…) to record this expense as a payment against that document. Set to a customer id (cli-…) to record a refund paid to that customer: it posts once to Receivables, tagged to the customer, with no VAT, and draws down their credit balance."
      • changedInput schema / properties / income / items / properties / accountid / description
        Previous value: -"Chart-of-accounts income category account id, or an exact account name to resolve (see list_accounts)."New value: +"Chart-of-accounts income category account id, or an exact account name to resolve (see list_accounts). Set to a supplier id (sup-…) to record a refund paid by that supplier: it posts once to Payables, tagged to the supplier, with no VAT, and draws down the credit they owe."
    • Changeddelete_expense3 fields changed
      • addedInput schema / properties / id / description
        Added value: +"One expense id to delete."
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "Up to 250 expense ids to delete in one call. Partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 250,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id"
        -]New value: +[]
    • Changeddelete_income3 fields changed
      • addedInput schema / properties / id / description
        Added value: +"One income id to delete."
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "Up to 250 income ids to delete in one call. Partial success: ids this business does not own, already deleted, or unknown are skipped and listed in errors.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 250,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id"
        -]New value: +[]
    • Addedexport_document_pdf
    • Changedsave_document2 fields changed
      • changedInput schema / properties / items / items / properties / settled / description
        Previous value: -"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; no tool writes off bad debt, so tell the user to use Write off on the document, which also reverses the VAT."New value: +"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; bad debt is written off with write_off_document, which also reverses the VAT."
      • changedInput schema / properties / settled / description
        Previous value: -"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; no tool writes off bad debt, so tell the user to use Write off on the document, which also reverses the VAT."New value: +"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; bad debt is written off with write_off_document, which also reverses the VAT."
    • Changedsave_expense2 fields changed
      • changedInput schema / properties / accountid / description
        Previous value: -"Chart-of-accounts account id (or an exact account name to resolve) used to categorise this expense (see list_accounts). ALSO how a payment is recorded against a purchase document: set this to the bill / purchase order / GRN document id (cont-…) and the expense counts toward that document's paid amount, inheriting the document's accounting category. This is how a money-out document is settled via a pre-existing expense. To record a fresh payment against a bill / purchase order / GRN, prefer record_document_payment — it now handles both directions, minting the accountid-linked expense for you from the payment details."New value: +"Chart-of-accounts account id (or an exact account name to resolve) used to categorise this expense (see list_accounts). ALSO how a payment is recorded against a purchase document: set this to the bill / purchase order / GRN document id (cont-…) and the expense counts toward that document's paid amount, inheriting the document's accounting category. This is how a money-out document is settled via a pre-existing expense. To record a fresh payment against a bill / purchase order / GRN, prefer record_document_payment — it now handles both directions, minting the accountid-linked expense for you from the payment details. To refund a customer, set this to their id (cli-…): it posts once to Receivables, tagged to them, with no VAT."
      • addedInput schema / properties / items / items / properties / accountid / description
        Added value: +"Chart-of-accounts category account id, or an exact account name to resolve (see list_accounts). Set to a bill / purchase order / GRN document id (cont-…) to record this expense as a payment against that document. Set to a customer id (cli-…) to record a refund paid to that customer: it posts once to Receivables, tagged to the customer, with no VAT, and draws down their credit balance."
    • Changedsave_income1 field changed
      • changedInput schema / properties / accountid / description
        Previous value: -"Chart-of-accounts income category account id, or an exact account name to resolve (see list_accounts)."New value: +"Chart-of-accounts income category account id, or an exact account name to resolve (see list_accounts). Set to a supplier id (sup-…) to record a refund paid by that supplier: it posts once to Payables, tagged to the supplier, with no VAT, and draws down the credit they owe."
    • Changedsave_journal_entry4 fields changed
      • addedInput schema / properties / items / items / properties / lines / items / properties / clientid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / lines / items / properties / supplierid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lines / items / properties / clientid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lines / items / properties / supplierid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
    • Changedsave_product4 fields changed
      • addedInput schema / properties / archived
        Added value: +{
        +  "description": "Archive (true) or unarchive (false) the product. An archived product is kept with its history and still listed; it is not deleted.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / items / items / properties / archived
        Added value: +{
        +  "description": "Archive (true) or unarchive (false) the product. An archived product is kept with its history and still listed; it is not deleted.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / items / items / properties / stocklocationid
        Added value: +{
        +  "description": "Default stock location id for new stock moves: \"2\" (main) or one of the business's locations. Pass \"$delete\" to clear it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / stocklocationid
        Added value: +{
        +  "description": "Default stock location id for new stock moves: \"2\" (main) or one of the business's locations. Pass \"$delete\" to clear it.",
        +  "type": "string"
        +}
    • Changedsave_variant4 fields changed
      • addedInput schema / properties / archived
        Added value: +{
        +  "description": "Archive (true) or unarchive (false) the variant. An archived variant is kept with its history and stays in the product's variants; it is not deleted.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / items / items / properties / archived
        Added value: +{
        +  "description": "Archive (true) or unarchive (false) the variant. An archived variant is kept with its history and stays in the product's variants; it is not deleted.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / items / items / properties / stocklocationid
        Added value: +{
        +  "description": "Default stock location id for this variant; empty inherits the product's. Pass \"$delete\" to clear it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / stocklocationid
        Added value: +{
        +  "description": "Default stock location id for this variant; empty inherits the product's. Pass \"$delete\" to clear it.",
        +  "type": "string"
        +}
    • Changedsend_document1 field changed
      • addedInput schema / properties / attachpdf
        Added value: +{
        +  "description": "Attach the document's own PDF, drawn at send time from the saved document. Off when absent: stub-web sends true by default. If the PDF cannot be drawn, the email goes without it. The view-online link always stays.",
        +  "type": "boolean"
        +}
    • Changedupdate_journal_line2 fields changed
      • addedInput schema / properties / clientid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
      • addedInput schema / properties / supplierid
        Added value: +{
        +  "description": "PROD-2704. Optional: the customer (clientid) or supplier (supplierid) this line books to, at most one per line. It tags the line and adds no posting; the entry then shows on that contact's statement and balance. The id must be one of this business's clients or suppliers (see list_clients, list_suppliers). Send \"$delete\" to clear it; omit it or send null to leave it alone. Naming one kind clears the other.",
        +  "type": "string"
        +}
    • Addedwrite_off_document
  2. 1 tool update
    • Addedsave_loan
  3. 4 tool updates
    • Changedadd_dashboard_tile3 fields changed
      • addedInput schema / properties / tile / additionalProperties
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "array"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    }
        +  ]
        +}
      • removedInput schema / properties / tile / anyOf
        Removed value: -[
        -  {
        -    "type": "array"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "object"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / tile / type
        Added value: +"object"
    • Changedcreate_dashboard3 fields changed
      • removedInput schema / properties / tiles / anyOf
        Removed value: -[
        -  {
        -    "type": "array"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "object"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / tiles / items
        Added value: +{
        +  "additionalProperties": {
        +    "anyOf": [
        +      {
        +        "type": "array"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "object"
        +      },
        +      {
        +        "type": "string"
        +      }
        +    ]
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / tiles / type
        Added value: +"array"
    • Changedupdate_dashboard3 fields changed
      • removedInput schema / properties / tiles / anyOf
        Removed value: -[
        -  {
        -    "type": "array"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "object"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / tiles / items
        Added value: +{
        +  "additionalProperties": {
        +    "anyOf": [
        +      {
        +        "type": "array"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "object"
        +      },
        +      {
        +        "type": "string"
        +      }
        +    ]
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / tiles / type
        Added value: +"array"
    • Changedupdate_dashboard_tile3 fields changed
      • addedInput schema / properties / tile / additionalProperties
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "array"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    }
        +  ]
        +}
      • removedInput schema / properties / tile / anyOf
        Removed value: -[
        -  {
        -    "type": "array"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "object"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / tile / type
        Added value: +"object"
  4. 4 tool updates
    • Changedevaluate_report1 field changed
      • addedInput schema / properties / comparison
        Added value: +{
        +  "description": "profit-and-loss: \"lastYear\" = two columns, the same period a year earlier and the selected one (no Total column); \"yearly\" = one column per financial year, clamped to the period, at most 12. Takes precedence over monthly and compare; absent = those flags decide. cash-flow: \"yearly\" only, because each column's opening balance chains from the column before it.",
        +  "enum": [
        +    "lastYear",
        +    "yearly"
        +  ],
        +  "type": "string"
        +}
    • Changedevaluate_report_session1 field changed
      • addedInput schema / properties / comparison
        Added value: +{
        +  "description": "profit-and-loss: \"lastYear\" = two columns, the same period a year earlier and the selected one (no Total column); \"yearly\" = one column per financial year, clamped to the period, at most 12. Takes precedence over monthly and compare; absent = those flags decide. cash-flow: \"yearly\" only, because each column's opening balance chains from the column before it.",
        +  "enum": [
        +    "lastYear",
        +    "yearly"
        +  ],
        +  "type": "string"
        +}
    • Addedsave_payroll_settings
    • Changedupdate_business1 field changed
      • changedInput schema / properties / details / properties / payrollsettings / description
        Previous value: -"The business's answers to its country's payroll pack: `settings[].id` -> value, plus \"jurisdiction\" -> a `jurisdictions[].code`. Replace semantics: send the whole map. A key or value the pack does not declare is refused {error, reason \"payrollsettings-invalid\", message} and nothing changes. PROD-2403."New value: +"The business's answers to its country's payroll pack: `settings[].id` -> value, plus \"jurisdiction\" -> a `jurisdictions[].code`. Replace semantics: send the whole map. A key or value the pack does not declare is refused {error, reason \"payrollsettings-invalid\", message} and nothing changes. PROD-2403. To change one setting with a confirm step, use save_payroll_settings."
  5. 12 tool updates
    • Addedadd_dashboard_tile
    • Addedcreate_dashboard
    • Addeddelete_dashboard
    • Addedevaluate_dashboard
    • Addedget_dashboard
    • Addedlist_dashboard_tile_types
    • Addedlist_dashboards
    • Addedremove_dashboard_tile
    • Changedsave_leave_type1 field changed
      • addedInput schema / properties / provision
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedsend_document1 field changed
      • addedInput schema / properties / sendcopy
        Added value: +{
        +  "description": "Send me a copy: BCC the signed-in user who sends this, and nobody else. Off by default. Only a signed-in person gets a copy; an API, agent or MCP token sends none.",
        +  "type": "boolean"
        +}
    • Addedupdate_dashboard
    • Addedupdate_dashboard_tile
  6. 8 tool updates
    • Addedget_payroll_setup
    • Addedpreview_payslip
    • Changedsave_employee7 fields changed
      • addedInput schema / properties / jurisdiction / description
        Added value: +"The employee's jurisdiction id within the business's payroll pack, when the pack has more than one."
      • changedInput schema / properties / packageamount / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "enum": [
        +      "$delete"
        +    ],
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / packageamount / description
        Added value: +"The package amount; see packagekind. \"$delete\" clears it."
      • addedInput schema / properties / packagekind / description
        Added value: +"How the package is paid. annual, monthly and weekly: packageamount is the pay for that period and packagequantity is not sent. hourly and daily: packageamount is the RATE per hour or day and packagequantity is the normal hours or days per week. \"$delete\" clears it."
      • changedInput schema / properties / packagequantity / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "enum": [
        +      "$delete"
        +    ],
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / packagequantity / description
        Added value: +"Normal hours or days per week, for an hourly or daily package only. \"$delete\" clears it."
      • addedInput schema / properties / paysliptemplate / description
        Added value: +"The id of the payslip template whose lines this employee's payslips start from."
    • Changedsave_leave_movement3 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Signed: a positive number grants leave and a negative number uses it."
      • addedInput schema / properties / kind / description
        Added value: +"opening sets an opening balance. adjustment changes the balance."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "adjustment",
        +  "opening"
        +]
    • Changedsave_leave_request2 fields changed
      • addedInput schema / properties / days / description
        Added value: +"The leave taken, in the leave type's unit. Fractions are allowed."
      • removedInput schema / properties / units
        Removed value: -{
        -  "type": "number"
        -}
    • Changedsave_leave_type6 fields changed
      • addedInput schema / properties / accrualmethod / description
        Added value: +"monthly spreads the yearly entitlement across the year. upfront grants it whole at each cycle start. none accrues nothing."
      • addedInput schema / properties / accrualmethod / enum
        Added value: +[
        +  "monthly",
        +  "upfront",
        +  "none"
        +]
      • removedInput schema / properties / accrualrate
        Removed value: -{
        -  "type": "number"
        -}
      • addedInput schema / properties / days / description
        Added value: +"The yearly entitlement per cycle, in the leave type's unit."
      • removedInput schema / properties / payitemid
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "object"
        -    },
        -    {
        -      "type": "string"
        -    }
        -  ]
        -}
      • addedInput schema / properties / unit / enum
        Added value: +[
        +  "days",
        +  "hours"
        +]
    • Changedsave_payslip5 fields changed
      • addedInput schema / properties / lines / items / properties / category / enum
        Added value: +[
        +  "earning",
        +  "deduction",
        +  "contribution",
        +  "benefit"
        +]
      • addedInput schema / properties / lines / items / properties / code / description
        Added value: +"The line's code: letter-led, then letters, digits, _ or -. Formulas and pay values name a line by its code. A reserved code (get_payroll_setup) is refused. Omit it to mint one from the description."
      • addedInput schema / properties / lines / items / properties / formula / description
        Added value: +"A formula over line codes, e.g. \"basic * 0.1\". get_payroll_setup lists the formula names. Null makes the line fixed."
      • addedInput schema / properties / lines / items / properties / role / description
        Added value: +"A pack line role, \"<prefix>-<code>\", e.g. \"sars-3601\". get_payroll_setup lists the roles each category allows."
      • addedInput schema / properties / lines / items / properties / statutory / description
        Added value: +"A statutory id from get_payroll_setup, e.g. \"paye\". The server prices the line and ignores any figure sent."
    • Changedsave_payslip_template8 fields changed
      • addedInput schema / properties / lines / description
        Added value: +"The full set of lines. It replaces the stored set; send the id of every line you keep."
      • addedInput schema / properties / lines / items / properties / category / enum
        Added value: +[
        +  "earning",
        +  "deduction",
        +  "contribution",
        +  "benefit"
        +]
      • addedInput schema / properties / lines / items / properties / code / description
        Added value: +"The line's code: letter-led, then letters, digits, _ or -. Formulas and pay values name a line by its code. A reserved code (get_payroll_setup) is refused. Omit it to mint one from the description."
      • addedInput schema / properties / lines / items / properties / formula / description
        Added value: +"A formula over line codes, e.g. \"basic * 0.1\". get_payroll_setup lists the formula names. Null makes the line fixed."
      • addedInput schema / properties / lines / items / properties / id / description
        Added value: +"The id of a line you keep. Send the id on EVERY line you keep: the lines you send replace the stored set, and a line sent without its id is a new line with a new id."
      • addedInput schema / properties / lines / items / properties / kind / description
        Added value: +"fixed: amount as sent. rate: rate times quantity. formula: the formula prices the line."
      • changedInput schema / properties / lines / items / properties / kind / enum
        Previous value: -[
        -  "fixed",
        -  "rate",
        -  "formula",
        -  "item"
        -]New value: +[
        +  "fixed",
        +  "rate",
        +  "formula"
        +]
      • addedInput schema / properties / lines / items / properties / role / description
        Added value: +"A pack line role, \"<prefix>-<code>\", e.g. \"sars-3601\". get_payroll_setup lists the roles each category allows."
  7. 7 tool updates
    • Changedlist_documents1 field changed
      • addedInput schema / properties / repeating
        Added value: +{
        +  "description": "When true, return only the documents whose repeat schedule is on: each live series' template. Generated copies and stopped series are left out. Pass a row's id to set_recurring_invoice to stop or change that series.",
        +  "type": "boolean"
        +}
    • Addedlist_recurring_schedules
    • Changedsave_client4 fields changed
      • addedInput schema / properties / addresses
        Added value: +{
        +  "description": "The full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "address": {
        +        "type": "string"
        +      },
        +      "address2": {
        +        "type": "string"
        +      },
        +      "city": {
        +        "type": "string"
        +      },
        +      "country": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The address id. Send it to keep and update that address; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "A name for the address, e.g. Head office.",
        +        "type": "string"
        +      },
        +      "postalcode": {
        +        "type": "string"
        +      },
        +      "showoninvoices": {
        +        "description": "True on the ONE address that documents print. More than one is refused.",
        +        "type": "boolean"
        +      },
        +      "suburb": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / contacts
        Added value: +{
        +  "description": "The full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "email": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The contact person id. Send it to keep and update that person; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "ondocuments": {
        +        "description": "True to send documents to this person.",
        +        "type": "boolean"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "role": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / items / items / properties / addresses
        Added value: +{
        +  "description": "The full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "address": {
        +        "type": "string"
        +      },
        +      "address2": {
        +        "type": "string"
        +      },
        +      "city": {
        +        "type": "string"
        +      },
        +      "country": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The address id. Send it to keep and update that address; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "A name for the address, e.g. Head office.",
        +        "type": "string"
        +      },
        +      "postalcode": {
        +        "type": "string"
        +      },
        +      "showoninvoices": {
        +        "description": "True on the ONE address that documents print. More than one is refused.",
        +        "type": "boolean"
        +      },
        +      "suburb": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / items / items / properties / contacts
        Added value: +{
        +  "description": "The full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "email": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The contact person id. Send it to keep and update that person; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "ondocuments": {
        +        "description": "True to send documents to this person.",
        +        "type": "boolean"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "role": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
    • Changedsave_supplier4 fields changed
      • addedInput schema / properties / addresses
        Added value: +{
        +  "description": "The full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "address": {
        +        "type": "string"
        +      },
        +      "address2": {
        +        "type": "string"
        +      },
        +      "city": {
        +        "type": "string"
        +      },
        +      "country": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The address id. Send it to keep and update that address; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "A name for the address, e.g. Head office.",
        +        "type": "string"
        +      },
        +      "postalcode": {
        +        "type": "string"
        +      },
        +      "showoninvoices": {
        +        "description": "True on the ONE address that documents print. More than one is refused.",
        +        "type": "boolean"
        +      },
        +      "suburb": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / contacts
        Added value: +{
        +  "description": "The full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "email": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The contact person id. Send it to keep and update that person; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "ondocuments": {
        +        "description": "True to send documents to this person.",
        +        "type": "boolean"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "role": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / items / items / properties / addresses
        Added value: +{
        +  "description": "The full list of addresses. It replaces the stored list: an address left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "address": {
        +        "type": "string"
        +      },
        +      "address2": {
        +        "type": "string"
        +      },
        +      "city": {
        +        "type": "string"
        +      },
        +      "country": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The address id. Send it to keep and update that address; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "A name for the address, e.g. Head office.",
        +        "type": "string"
        +      },
        +      "postalcode": {
        +        "type": "string"
        +      },
        +      "showoninvoices": {
        +        "description": "True on the ONE address that documents print. More than one is refused.",
        +        "type": "boolean"
        +      },
        +      "suburb": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
      • addedInput schema / properties / items / items / properties / contacts
        Added value: +{
        +  "description": "The full list of contact people. It replaces the stored list: a person left out is removed. Leave the key out to keep the stored list; send [] to clear it.",
        +  "items": {
        +    "properties": {
        +      "email": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "The contact person id. Send it to keep and update that person; leave it out to add a new one.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "ondocuments": {
        +        "description": "True to send documents to this person.",
        +        "type": "boolean"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "role": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  "maxItems": 50,
        +  "type": "array"
        +}
    • Changedset_entity_tags1 field changed
      • changedInput schema / properties / entity / description
        Previous value: -"Entity kind to tag, e.g. \"expense\", \"income\", \"invoice\", \"transaction\", \"client\", \"supplier\"."New value: +"Entity kind to tag, e.g. \"expense\", \"income\", \"invoice\", \"transaction\", \"client\", \"supplier\", \"employee\", \"payslip\"."
    • Changedset_entity_tags_bulk1 field changed
      • changedInput schema / properties / items / items / properties / entity / description
        Previous value: -"Entity kind, e.g. \"expense\", \"income\", \"invoice\", \"client\", \"supplier\"."New value: +"Entity kind, e.g. \"expense\", \"income\", \"invoice\", \"client\", \"supplier\", \"employee\", \"payslip\"."
    • Addedstop_recurring_schedules
  8. 2 tool updates
    • Changedsave_payslip1 field changed
      • removedInput schema / properties / lines / items / properties / payitem
        Removed value: -{
        -  "type": "string"
        -}
    • Changedsave_payslip_template1 field changed
      • removedInput schema / properties / lines / items / properties / payitem
        Removed value: -{
        -  "type": "string"
        -}
  9. 2 tool updates
    • Changedcreate_bank_account1 field changed
      • changedInput schema / properties / accountid / description
        Previous value: -"Linked accounting account ID"New value: +"The ledger account this bank account settles into. PROD-2612: set it to one of the business's own asset accounts to use that account instead of minting a new one; it must not be a control or built-in account or another bank's, and the request must leave out the opening balance and any other currency. Refused with a link-* reason."
    • Changedupdate_bank_account1 field changed
      • changedInput schema / properties / accountid / description
        Previous value: -"Linked accounting account ID"New value: +"The ledger account this bank account settles into. PROD-2612: set it to one of the business's own asset accounts to use that account instead of minting a new one; it must not be a control or built-in account or another bank's, and the request must leave out the opening balance and any other currency. Refused with a link-* reason."
  10. 1 tool update
    • Changedsave_document4 fields changed
      • addedInput schema / properties / items / items / properties / settledaccountid
        Added value: +{
        +  "description": "Where the settle gap posts, when settling an existing document: a Chart of Accounts account name or id (see list_accounts). Omit to post to Settlements, or to Foreign Exchange for a foreign-currency document.",
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / settleddate
        Added value: +{
        +  "description": "Date the settle entry posts, when settling an existing document (ISO 8601, YYYY-MM-DD). Omit for the default date.",
        +  "type": "string"
        +}
      • addedInput schema / properties / settledaccountid
        Added value: +{
        +  "description": "Where the settle gap posts, when settling an existing document: a Chart of Accounts account name or id (see list_accounts). Omit to post to Settlements, or to Foreign Exchange for a foreign-currency document.",
        +  "type": "string"
        +}
      • addedInput schema / properties / settleddate
        Added value: +{
        +  "description": "Date the settle entry posts, when settling an existing document (ISO 8601, YYYY-MM-DD). Omit for the default date.",
        +  "type": "string"
        +}
  11. 3 tool updates
    • Changedcreate_account1 field changed
      • changedInput schema / properties / defaultid / description
        Previous value: -"Numeric id of the built-in/default account this custom account maps to."New value: +"Built-in account id this custom account maps to: a number such as \"410\" or a string such as \"za-coida\" or \"defaultvat\"."
    • Changedsave_document2 fields changed
      • changedInput schema / properties / items / items / properties / settled / description
        Previous value: -"Whether the document has been fully settled/paid."New value: +"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; no tool writes off bad debt, so tell the user to use Write off on the document, which also reverses the VAT."
      • changedInput schema / properties / settled / description
        Previous value: -"Whether the document has been fully settled/paid."New value: +"Set true to settle: closes the balance left after the recorded payments and marks the document settled. Only for a small gap once the payment is recorded: an exchange-rate difference, a bank fee or rounding (the FX difference itself, or a few percent of the total at most); the gap posts to Settlements, or to Foreign Exchange for an FX difference. Before you set it, state the gap amount and where it posts, and ask the user to confirm, even when they already said 'settle it' or 'mark it paid'. No payment recorded yet: use record_document_payment first. Refused while an AI-matched payment is unconfirmed. Not a write-off: a large short payment, or any part the customer will not pay, is never settled; no tool writes off bad debt, so tell the user to use Write off on the document, which also reverses the VAT."
    • Changedupdate_account1 field changed
      • changedInput schema / properties / defaultid / description
        Previous value: -"Numeric id of the built-in/default account this custom account maps to."New value: +"Built-in account id this custom account maps to: a number such as \"410\" or a string such as \"za-coida\" or \"defaultvat\"."

Publisher details

Operator
stub · Publisher source
Vendor relationship
First-party · Publisher source
Restrictions
What you are entitled to via the mcp is the same as what you are entitled to via your appropriate plan. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables Czech freelancers to issue legally complete invoices and credit notes, record expenses and payments, generate VAT and income-tax filings, and manage bookkeeping from an AI chat or a local dashboard.
    25
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Financial data infrastructure for AI agents. Connect to a startup's books to read live P&L and bank balances, review and reclassify transactions, manage the chart of accounts, and connect banking sources.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources