stub
Server Details
stub
Super simple AI Native accounting platform
dext equivalent
- Status
- Healthy
- Uptime
- 75.9% over 61 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 146 tools
The 146-tool surface contains many deliberate near-neighbours (e.g., list_documents vs list_invoices, save_expense vs record_document_payment vs settle_bills, add_entity_salestax vs add_entity_salestaxes vs add_salestax_to_entities, evaluate_report vs evaluate_report_session vs evaluate_report_batch). Descriptions often spell out when to use each, but the sheer number of overlapping CRUD/bulk/reporting variants creates real risk of misselection.
All tool names are snake_case and follow a verb_noun-like shape, with readable families such as list_, get_, save_, create_, update_, delete_, add_ and set_. Some inconsistency remains between save_ (upsert) and create_/update_ (explicit create/update), but the convention is mostly predictable.
146 tools is far beyond a reasonable single-server surface; the rubric treats 50+ tools as an extreme mismatch. Even for a full accounting, payroll, reporting and support suite, this breadth is excessive and creates discoverability and context-load problems.
Coverage is very broad: document and line lifecycle, expenses/income, bank reconciliation, payroll, leave, products, tags, reports, files and support are all represented, often with bulk variants. However there are notable gaps, such as no delete_asset despite create_asset referencing it, no delete_folder despite remove_file mentioning it, and no clear delete lifecycle for accounts, bank accounts or employees.
Available Tools
146 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Sales-tax line id. On update, identifies which sales-tax to change (or pass :salestaxid); omit on add. | |
| name | No | Sales-tax name (e.g. "VAT"). | |
| rate | No | Sales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected. | |
| amount | No | Fixed sales-tax amount, used instead of :rate when :useamount is true. | |
| itemid | No | Id 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. | |
| invoice | No | Alias for the parent document id (see :quinvoice). | |
| parentid | No | Id 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. | |
| exclusive | No | Whether the tax is exclusive (added on top of the line amount) rather than inclusive (already contained in it). | |
| invoiceid | No | Alias for the parent document id (see :quinvoice); takes precedence when several are supplied. | |
| quinvoice | No | Id of the parent document (invoice, quote, credit/debit note). Used to reindex the correct document; aliased by :invoice / :invoiceid. | |
| useamount | No | Use the fixed :amount instead of computing tax from :rate. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| salestaxid | No | Id of the sales-tax to update (alternative to :id). | |
| recoverable | No | Whether this input sales tax / VAT is recoverable. | |
| referencenumber | No | Sales-tax registration / reference number. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line item id. Required on update_document_item; omit on add_document_line. | |
| cost | No | Unit cost (for margin / cost-of-sales), in :costcurrency. | |
| name | No | Line item name / title. | |
| sort | No | Display order of the line within the document (ascending). | |
| unit | No | Unit label for the quantity (e.g. "hours", "kg"). | |
| price | No | Unit price (per-unit selling price) in the document currency. | |
| amount | No | Line total (unit price × quantity), usually derived from :price × :quantity. Accepts a number or a numeric string. | |
| expense | No | Pass "$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. | |
| product | No | Id of a catalog product to link this line to. | |
| variant | No | Id of a catalog product variant to link this line to. | |
| quantity | No | Number of units. Accepts a number or a numeric string. | |
| accountid | No | Per-line chart-of-accounts / expense-category id; bills split cost by category at accrual (see list_accounts). | |
| expenseid | No | Recover 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. | |
| quinvoice | No | Id of the parent document (invoice, quote, bill, etc.) this line belongs to. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| description | No | Line item description. | |
| costcurrency | No | ISO 4217 currency of :cost, when it differs from the document currency. | |
| baseupdatedat | No | Optimistic-concurrency token: the line's last-known updatedat (epoch number or ISO string). A stale value is rejected; omit to skip the check. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | "salestax" | "levy" | "withholding"; blank means salestax. | |
| name | No | Display name of the sales tax (e.g. "VAT"). | |
| rate | No | Sales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected. | |
| order | No | Stack position (default 0); components apply ascending. | |
| amount | No | Explicit sales tax amount; used instead of the rate when useamount is true. | |
| entity | Yes | Entity kind to add the sales tax to, e.g. "expense", "invoice". | |
| compound | No | When true, this tax stacks on lower-order taxes' totals (default false). | |
| entityid | Yes | Id of the entity to add the sales tax to. | |
| parentid | No | Id of an existing salestax definition to link, instead of defining one inline. | |
| exclusive | No | Whether the entity amount excludes this sales tax (tax added on top). | |
| taxsource | No | Stable locale rate-band identity, e.g. "locale:za/standard". | |
| treatment | No | "standard" | "zeroRated" | "exempt"; blank/unknown means infer. | |
| useamount | No | When true, use amount as the tax figure instead of computing from the rate. | |
| recoverable | No | Whether this sales tax is recoverable (claimable as input tax). | |
| referencenumber | No | Sales tax registration/reference number. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity kind to add sales taxes to, e.g. "expense", "invoice". | |
| taxids | Yes | Ids of existing salestax definitions to attach to the entity. | |
| entityid | Yes | Id of the entity to add sales taxes to. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line id (for updating an existing line). | |
| role | No | Optional 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. | |
| debit | No | Debit amount for this line (0 if this is a credit line). | |
| credit | No | Credit amount for this line (0 if this is a debit line). | |
| entryid | No | Id of the parent journal entry this line belongs to. | |
| accountid | No | Chart-of-accounts account id for this line (see list_accounts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is known. The description adds the useful constraint that the parent entry must already EXIST (one line per call), but says nothing about balancing rules, entry status effects, or what happens on failure. With annotations carrying the safety profile, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with what the tool does, followed immediately by the two routing alternatives. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a line-level mutation whose parameters are fully documented in the schema and whose safety profile is in annotations, the description covers what an agent needs to pick it. It omits behavioral detail about debit/credit balancing and the effect on the parent entry's totals, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (including the role sentinel behavior and debit/credit conventions). The description adds no parameter-level detail and only implies the single-line-per-call semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add ONE debit or credit line to an EXISTING journal entry') with clear scope. It explicitly differentiates itself from the two adjacent siblings save_journal_entry and update_journal_line, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternatives by name and gives the exact condition that selects each: whole-entry creation goes to save_journal_entry, modifying an existing line goes to update_journal_line. This is explicit when/when-not guidance with alternatives.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity kind to add the sales tax to: "income" or "expense". | |
| parentid | Yes | Id of the existing salestax definition to apply to every listed entity. | |
| entityids | Yes | Ids of the income/expense records to add the sales tax to. |
TDQS
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.
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.
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.
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.
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.
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.).
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity 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". | |
| fileid | Yes | Id of the uploaded file to attach (see /file/upload). | |
| entityid | Yes | Id of the entity to attach the file to. |
TDQS
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.
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.
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.
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.
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.
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 tagsADestructiveInspect
Clear all tags from an entity.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity kind whose tags to clear, e.g. "expense", "income", "invoice". | |
| entityid | Yes | Id of the entity to clear tags from. |
TDQS
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.
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.
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.
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.
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.
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 currencyARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ISO currency code to convert into (e.g. ZAR). | |
| date | No | The date whose rate to use (YYYY-MM-DD). Defaults to today; a future date uses today's rate. | |
| from | Yes | ISO currency code of the amount (e.g. GBP). | |
| amount | Yes | The amount to convert, in the `from` currency. | |
| target | No | Optional amount in the `to` currency to test the converted amount against (e.g. a bill's outstanding balance). | |
| tolerance | No | Optional 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
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.
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.
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.
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.
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.
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 profileARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 accountInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | The business's own account code (e.g. "4000"). Trimmed; blank means no code. | |
| icon | No | Icon identifier for the account (UI display). | |
| meta | No | Opaque metadata string stored on the account. | |
| name | No | Account name (e.g. "Consulting income", "Rent"). | |
| role | No | Semantic reporting role: "tax" (income-tax expense), "taxprovision" (tax provision/liability), or "salestax" (VAT control account). Omit for an ordinary account. | |
| group | No | Group label the account is organised under in the chart of accounts. | |
| hidden | No | Whether the account is hidden from the chart-of-accounts UI. | |
| deleted | No | Soft-delete flag; true hides the account from active use. | |
| journal | No | Journal number classifying the account; maps to a standard journal name (e.g. sales, purchases, general). | |
| premium | No | Whether the account is a premium-plan-only account. | |
| primary | No | Whether this is the primary account of its kind. | |
| parentid | No | Id of the parent account this nests under in the chart-of-accounts tree. | |
| defaultid | No | Numeric id of the built-in/default account this custom account maps to. | |
| baseaccount | No | Whether this is a base/system account rather than a user-created one. | |
| description | No | Free-text description of what the account is used for. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Asset id. Required on update; omit on create. | |
| name | No | Name of the asset (e.g. "Delivery van"). | |
| notes | No | Free-text notes about the asset. | |
| amount | No | (Deprecated) legacy purchase value; the asset's cost now derives from its linked expense/transaction, so this is ignored. | |
| income | No | Id of an income record linked to this asset (e.g. proceeds from its disposal). | |
| unlink | No | (Legacy) id of a linked transaction to detach from the asset; prefer the dedicated unlink asset-transaction endpoint. | |
| expense | No | Id of the expense record that recorded the asset's purchase (its cost basis). | |
| disposed | No | Whether the asset has been disposed of (sold or retired). | |
| accountid | No | Chart-of-accounts account id categorising this asset (see list_accounts). | |
| usefullife | No | Useful life of the asset in years. | |
| transaction | No | (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. | |
| depreciation | No | Whether this asset depreciates over time. | |
| disposeddate | No | Date the asset was disposed (ISO 8601); defaults to now when :disposed is set without a date. | |
| baseaccountid | No | Chart-of-accounts account id for the asset's accumulated-depreciation / base account (see list_accounts). | |
| depreciationrate | No | Annual depreciation rate as a decimal fraction (e.g. 0.2 = 20% per year); used by the diminishing-balance method. | |
| depreciationtype | No | Depreciation method: a string containing "straight" (straight-line), "diminish" (reducing/diminishing balance), or "fifty" (50/30/20 wear-and-tear). | |
| depreciationstart | No | Date depreciation starts (ISO 8601). | |
| usedefaultdepreciation | No | Whether to use the business/category default depreciation settings instead of the values on this asset. |
TDQS
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.
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.
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.
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.
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.
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 accountInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the bank account, required for updates | |
| bank | No | Name of the bank | |
| sync | No | Whether automatic bank sync is enabled | |
| hidden | No | Whether the account is hidden/soft-deleted (removes its card; also stops sync) | |
| confirm | No | PROD-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. | |
| private | No | Whether this is a private account | |
| syncing | No | Whether sync is currently in progress | |
| archived | No | Whether the account is archived | |
| currency | No | ISO 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. | |
| accountid | No | Linked accounting account ID | |
| swiftcode | No | SWIFT/BIC code for international transfers | |
| branchcode | No | Bank branch code or routing number | |
| accountname | No | Name of the bank account | |
| accounttype | No | Type of account (e.g., checking, savings) | |
| openingdate | No | Date of the opening balance | |
| openingrate | No | PROD-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. | |
| syncenabled | No | Whether this account is enabled for bank sync | |
| accountnumber | No | Bank account number | |
| creditaccount | No | Default credit account ID | |
| creditjournal | No | Default credit journal ID | |
| openingbalance | No | Opening balance for the account | |
| clearopeningbalance | No | PROD-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'. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new folder (required). | |
| parentid | No | Id of the parent folder to nest this one under; omit for a top-level folder. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| income | No | ||
| expenses | No | ||
| transactionid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false / destructiveHint=false, so the description carries most of the behavioral burden — and it delivers: all-or-nothing atomicity, top-level transactionid scope with per-item override precedence, the cont-… id making an expense a bill payment, and return of new ids. Missing only auth/permission or rate-limit context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each carrying a distinct behavioral fact (preference, linking precedence, bill-payment semantics, atomicity/limitation/return). Front-loaded with the primary purpose and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-array bulk mutation with no output schema, the description covers atomicity, precedence, a special id semantic, a limitation, and return values. What is absent is minor — e.g. that both arrays are optional and the empty-required-array shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema's item-level field descriptions are already extensive, but the description adds real meaning the schema does not: the top-level vs per-item transactionid precedence, and the accountid-equals-purchase-document-id interpretation. The top-level transactionid remains undocumented in the schema, and the description covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (bulk-create income and expense records in one transaction) and explicitly distinguishes itself from the single-record siblings save_income / save_expense. An agent can identify the tool's 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit preference rule ('prefer this over repeated save_income / save_expense calls') and a named exclusion with a fallback (per-item salestax is not supported — use save_expense). Both when-to-use and when-not are covered.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Tag id. Present → update that tag; omit → create a new one. | |
| name | No | Display name of the tag. | |
| color | No | Hex colour for the tag (e.g. "#8a8d82"), used for display. | |
| group | No | Free-text group the tag belongs to. On update, passing null or "" clears an existing group; omitting the key leaves it unchanged. | |
| archived | No | Whether the tag is archived. Omit on create to default to unarchived. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| force | No | ||
| decision | Yes | ||
| approveddate | No |
TDQS
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.
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.
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.
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.
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.
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 clientADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One client id to delete. | |
| ids | No | Up 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. | |
| force | No | Delete 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
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.
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.
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.
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.
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.
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_documentDelete documentDestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
delete_document_lineDelete document lineADestructiveIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Line item id to delete (required). | |
| invoice | No | Alias for quinvoice (the parent document id); prefer quinvoice. | |
| invoiceid | No | Alias for quinvoice (the parent document id); prefer quinvoice. | |
| quinvoice | No | Id of the parent document (invoice, quote, bill, etc.) the line belongs to — pass this so the correct document is updated. Required in practice. |
TDQS
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.
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.
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.
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.
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.
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 expenseADestructiveIdempotentInspect
Permanently delete an expense by id. Immediate and irreversible — no linked-record check is performed (the ledger recomputes, so linked bills/transactions stay consistent, but the expense itself is gone). Confirm with the user before deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by detailing side effects: permanent and irreversible deletion, no linked-record check, ledger recomputation, and consistency of linked bills/transactions. It also includes the expectation to confirm with the user, which is behavioral guidance. This fully discloses the impact of invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and information-dense, covering purpose, side effects, and usage guidance in three sentences. No redundancy or extraneous details are present. The structure is ideal for an agent to quickly grasp the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one parameter and no output schema, the description provides all necessary context: what it deletes, how it behaves (permanent, recomputes ledger), and the required user confirmation. An agent can safely and correctly invoke this tool based solely on the description, including understanding its impact on linked data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single required parameter 'id' (string), and the description references 'by id' to indicate what the parameter is. Since the schema already fully covers the parameter definition and the description adds no additional semantic details (e.g., format, source, or validation), the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Permanently delete an expense by id') and distinguishes it from other delete operations by specifying the target resource ('expense'). The scope is unambiguous, and the phrasing immediately tells an agent that this tool removes a single expense record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description instructs the agent to 'Confirm with the user before deleting,' which is a critical usage guideline for a destructive operation. It also notes that no linked-record check is performed and that the ledger recomputes to maintain consistency, informing the agent about when this tool is appropriate (direct deletion without collateral checks). However, it does not explicitly compare against alternative delete tools (e.g., delete_income, delete_journal_entry), leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_incomeDelete incomeADestructiveIdempotentInspect
Permanently delete an income record by id. Immediate and irreversible — no linked-record check is performed (the ledger recomputes, so a linked invoice's outstanding is restored, but the income record itself is gone). Confirm with the user before deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations by explaining immediate irreversibility, the absence of a linked-record check, the ledger recomputation, and the restoration of a linked invoice's outstanding amount. Also instructs user confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense but readable sentences cover the action, consequences, and required user confirmation without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essential side effects and confirmation requirement. No output schema exists, so the lack of return-value detail is acceptable; error cases are not mentioned but are not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, id, is referenced as the income record id. Though the schema provides no field description, the tool description makes the parameter's purpose clear enough for a simple identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: permanently delete an income record by id. Distinguished from related tools like delete_expense and save_income.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: irreversible, no linked-record check, ledger recomputes, and confirm with the user. Does not name alternative tools like restore_deleted or unlink_income_transaction, but the usage context is still clear.
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 entryADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the journal entry |
TDQS
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.
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.
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.
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.
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.
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 messageADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the message. |
TDQS
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.
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.
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.
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.
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.
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 payrunADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | Send true only after the user has agreed to the change the refusal described. |
TDQS
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.
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.
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.
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.
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.
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 payslipsADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| confirm | No | Send true only after the user has agreed to the change the refusal described. |
TDQS
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.
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.
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.
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.
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.
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 productADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One product id to delete. | |
| ids | No | Up to 1000 product ids to delete in one transaction. Partial success: ids this business does not own are skipped and listed in errors. |
TDQS
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.
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.
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.
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.
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.
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 supplierADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One supplier id to delete. | |
| ids | No | Up 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. | |
| force | No | Delete 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
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.
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.
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.
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.
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.
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 tagADestructiveIdempotentInspect
Permanently delete a tag by id. The tag is removed everywhere it is applied (transactions, entries and other records lose the label). Immediate and irreversible — confirm with the user before deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the deletion is permanent and irreversible, which fully discloses the destructive nature of the operation. This aligns with the destructiveHint annotation and provides clear expectations to the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct, with no unnecessary words. It conveys all essential information in two sentences, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key aspects: what happens (permanent deletion), the scope (everywhere applied), and the safety precaution (confirm with user). It does not mention return values or additional side effects, but for a simple delete operation, this is sufficient. A minor gap is that it doesn't specify what happens if the tag does not exist, but that is not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'id' is minimally described in the JSON schema (type string) without additional context in the description. Since the schema already covers the existence and type of the parameter, the description adds no extra semantic meaning, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete), the resource (tag), and the scope (removed everywhere it is applied). It distinguishes itself from sibling tools like create_tag and update_tag without needing to reference them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises confirming with the user before deleting, which is a critical usage guideline for destructive operations. This tells the agent when and how to invoke the tool safely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_variantDelete variantADestructiveIdempotentInspect
Permanently delete a product variant by id. This cannot be undone; to create or edit a variant instead use save_variant.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Id of the variant to delete. Required in practice. | |
| productid | Yes | Id of the parent product the variant belongs to (required). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description reinforces those with 'Permanently delete' and 'This cannot be undone.' It adds a clear irreversibility warning that aligns with, and slightly extends, the structured annotation information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core action, then adds the permanence warning and the save_variant alternative. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main delete semantics and the annotation profile handles safety, but the unresolved id/productid requiredness conflict is left unaddressed. Since there is no output schema, a brief hint about the expected result or confirmation would also improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds no parameter-level meaning beyond saying 'by id.' The schema itself contains an odd 'Required in practice' note for id while productid is the only required property; the description does not resolve this ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb 'delete', the resource 'product variant', and the identifier ('by id'), and adds 'Permanently' to set expectations. It is clearly distinct from save_variant and other delete_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs the agent to use save_variant instead when the goal is to create or edit a variant, while framing this tool as the permanent deletion path. This provides an actionable routing rule and a caution about irreversible consequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_reportEvaluate reportRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asAt | No | For as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd. | |
| mode | No | trial-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). | |
| view | No | An 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. | |
| basis | No | income-tax-summary: "profit" (default) or "turnover". | |
| source | No | A statutory template source, e.g. "locale:za/vat201". Provide this or templateid. | |
| compare | No | profit-and-loss: true = two columns, the equal-length prior period and the current one. | |
| filters | No | Row filters: [{"property": "tags"|"customer"|"supplier"|"product"|"account", "value": ...}]; tags value "none" means untagged. | |
| journal | No | account-totals and entity totals: restrict to one journal (1 income, 2 expenses, 3 assets, 4 liabilities, 5 equity). | |
| monthly | No | Views with columns (profit-and-loss, cash-flow): true = one column per calendar month in the period. | |
| version | No | Template version. Omit for the version in effect at the period end. | |
| payrunid | No | A 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. | |
| constants | No | Constants a template's formulas name ($salesTaxRate → {"salesTaxRate": 0.15}). Undeclared here, coercion would strip them and the formula would silently evaluate with 0. | |
| dimension | No | cash-flow: "category" (default — counterpart categories) or "baseaccount" (per bank/cash account). | |
| periodEnd | No | ||
| employeeid | No | A 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. | |
| snapshotid | No | Evaluate FROZEN against this snapshot's filed listing (the period must sit inside its window) instead of the live books. | |
| templateid | No | A stored user template id. Provide this or source. | |
| periodStart | No |
evaluate_report_batchEvaluate report batchARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| requests | Yes | Up to 24 evaluate bodies ({view|source|templateid, periodStart?, periodEnd, ...}) answered from ONE session dataset build — one round trip paints a dashboard. |
TDQS
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.
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.
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.
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.
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.
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 sessionRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asAt | No | For as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd. | |
| mode | No | trial-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). | |
| view | No | An 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. | |
| basis | No | income-tax-summary: "profit" (default) or "turnover". | |
| source | No | A statutory template source, e.g. "locale:za/vat201". Provide this, templateid, or view. | |
| compare | No | profit-and-loss: true = two columns, the equal-length prior period and the current one. | |
| filters | No | Row filters: [{"property": "tags"|"customer"|"supplier"|"product"|"account", "value": ...}]; tags value "none" means untagged. | |
| journal | No | account-totals and entity totals: restrict to one journal (1 income, 2 expenses, 3 assets, 4 liabilities, 5 equity). | |
| monthly | No | Views with columns (profit-and-loss, cash-flow): true = one column per calendar month in the period. | |
| version | No | ||
| payrunid | No | A 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. | |
| constants | No | ||
| dimension | No | cash-flow: "category" (default — counterpart categories) or "baseaccount" (per bank/cash account). | |
| periodEnd | No | Inclusive period end (YYYY-MM-DD). Required. | |
| employeeid | No | A 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. | |
| templateid | No | ||
| periodStart | No |
finalise_payslipsFinalise payslipsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| confirm | No | Send true only after the user has agreed to the change the refusal described. |
TDQS
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 them, disclosing the dry-run gate, the confirm-required reason token, batch atomicity ('refuses the whole batch'), and side-effect boundaries (no emails, no returns). No auth/permission detail, but the behavioral profile is unusually rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then scope negatives, the confirm workflow, and refusal conditions in a logical order with no filler. A couple of clauses are dense and run-on ('Without confirm true it changes nothing and answers reason confirm-required with what it would post'), but every sentence adds actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation tool with no output schema and minimal annotations, the description supplies the workflow, prerequisite safety gate, failure modes, and side-effect scope. An agent has everything it needs to call this correctly, including the partial-response hint about `reason: confirm-required`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only `confirm` is documented in-schema), so the description carries `ids` by explaining its batch semantics and that a missing or another business's id refuses the whole batch. It also reinforces the confirm gate beyond the schema text. It does not specify the id string format, so it falls just short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (finalise payslips) and the concrete effect ('each posts its journal to the books'), which distinguishes it from siblings like save_payslip, get_payslip, delete_payslips, and populate_payrun. It also scopes what it does NOT do ('Sends no email and files no returns').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit two-step workflow: without confirm=true nothing changes and the tool answers with what it would post; the agent must ask the user, then re-call with confirm=true. Refusal conditions (locked period, self-finalising pay run, missing/foreign id) tell the agent exactly when the call will fail and why.
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 transactionsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| documentid | Yes | The invoice / bill / purchase document id (cont-… or inv-…) to find candidate settling bank transactions for. |
TDQS
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.
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.
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.
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.
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.
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 bulkARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only documents with a due date on/before this date (inclusive, ISO 8601). Documents with no due date are kept. | |
| from | No | Only documents with a due date on/after this date (inclusive, ISO 8601). Documents with no due date are kept. | |
| type | No | Filter the document set by kind (invoice, bill, …). Ignored when :documentids is given. | |
| limit | No | Max 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. | |
| status | No | Filter to documents whose computed status matches (case-insensitive), e.g. "overdue", "due", "partiallypaid". | |
| unpaid | No | When true, only documents with an outstanding balance (excludes fully paid rows). Recommended for reconciliation. | |
| contact | No | Filter to documents for this contact id (a client or supplier). | |
| direction | No | Filter by money direction: "in" (invoices, quotes, credit notes) or "out" (bills, purchase orders, debit notes). | |
| documentids | No | Explicit 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_outstanding | No | Only documents whose outstanding balance is at least this amount (inclusive). |
TDQS
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.
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.
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.
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.
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.
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.
get_action_usageGet action usageRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_bank_profile_statusGet bank profile statusARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 overviewARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 profileARead-onlyInspect
The business's own profile: name, contact details, industry, currency, tax rate and plan. Financials are not included — use get_financial_summary for those, or get_business_overview for profile and financials in one call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a read-only operation. The description adds valuable behavioral context by stating that financials are not included, setting expectations about the response scope beyond what the annotation conveys. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundancy. The core purpose is front-loaded, and the exclusions and alternatives are stated efficiently in the second sentence. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description is complete: it lists what the response contains, explicitly notes what it excludes, and names the exact sibling tools for related use cases. An agent has enough information to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema confirms no required or optional parameters. With no parameters to document, the description does not need to add parameter-level semantics; the baseline for zero-parameter tools is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as retrieving the business's own profile and enumerates its contents (name, contact details, industry, currency, tax rate, plan). It explicitly distinguishes itself from get_financial_summary and get_business_overview, so an agent can tell them apart without inspecting other definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: financials are excluded, and the agent is directed to get_financial_summary for financials alone or get_business_overview for both profile and financials in one call. This clearly communicates when to use this tool versus the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentGet documentRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id. |
get_emailGet emailARead-onlyInspect
Get one sent email's history record by id — subject, recipients, time sent, time received and why it failed if it did.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the email history record. |
TDQS
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.
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.
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.
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.
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.
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 employeeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
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.
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.
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.
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.
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.
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 summaryARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 guideARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The guide id to fetch, e.g. "submit-vat-return" — exactly as returned in a list_guides row's id. |
TDQS
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.
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.
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.
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.
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.
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 articleARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The article slug, exactly as returned in a search_help_articles row. |
TDQS
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.
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.
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.
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.
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.
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_payrunGet payrunARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
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.
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.
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.
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.
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.
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 payslipARead-onlyInspect
One payslip by id, with the same fields list_payslips returns. An id that is not this business's payslip is an error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
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.
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.
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.
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.
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.
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 classificationsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. | |
| periodEnd | No | Period end (YYYY-MM-DD), inclusive. Required for live classifications; defaults to the snapshot's as-of date when snapshotid is given. | |
| snapshotid | No | Evaluate FROZEN: read the period from this snapshot's filed listing with capture-time classification, instead of the live books. | |
| periodStart | No | Period start (YYYY-MM-DD), inclusive. Omit for no lower bound (or the snapshot's window start). |
TDQS
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.
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.
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.
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.
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.
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 codesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Two-letter country code. Defaults to the business's own country. |
TDQS
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.
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.
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.
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.
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.
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 subscriptionARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 teamARead-onlyInspect
The business's team / members — each with their name, email, role and active status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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: they asked for a person, a refund, a legal or privacy request, something broken that needs fixing, a charge that may need money moved, or someone else in their account. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | billing, bank_feed, app, account, accounting, feature or other. | |
| found | No | What you found this turn, plainly, for the team. | |
| tried | No | What you already told them, and why it didn't settle it. | |
| chatid | No | Set automatically — do not supply. | |
| reason | Yes | Why a person must act. One of: person, refund, legal-privacy, fault, billing-error, account-security. | |
| question | Yes | Their question, in their own words, whole. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only reveal readOnlyHint=false and destructiveHint=false. The description adds substantial context: it acts 'as them', attaches the case for the team, opens the support chat, and discloses failure behavior ('Check `sent`: when it is false nothing reached the team'). This is behavioral detail well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage rules, then the important `sent` caveat. All sentences earn their place, though the enumeration of trigger cases is dense. Slightly long but efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the side effects (opens a support conversation, opens chat) and how to verify success via `sent`. Combined with the explicit usage policy, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters (kind, found, tried, chatid, reason, question). The description adds only a soft implication that 'the case' is built from found/tried, and introduces the `sent` field which is a return value rather than a parameter. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Hand the question to the support team with the case written') and a customer-facing benefit. Clearly distinguishable from sibling communication tools like send_feedback or send_team_feedback, since it opens a support conversation on the customer's behalf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit allow-list ('ONLY when a person must act: they asked for a person, a refund, a legal or privacy request, something broken..., money moved, account access') and an explicit exclusion ('Never to avoid a hard question'). The when/when-not criteria are unusually complete.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Ids of the transactions to include (un-ignore) in the general ledger |
TDQS
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.
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.
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.
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.
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.
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.
link_entitiesLink entitiesAInspect
Link two entities of any supported pair (e.g. income+transaction, income+asset, expense+asset, asset+transaction). Fails cleanly if either record doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | First entity's kind, e.g. "income", "asset", "transaction". | |
| entityid | Yes | First entity's id. | |
| linkedentity | Yes | Second entity's kind. | |
| linkedentityid | Yes | Second entity's id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a useful behavioral detail (fails cleanly on missing records) beyond the annotations. However, it does not mention whether the operation is idempotent, whether it overwrites existing links, or any other side effects, so transparency is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, consisting of two sentences with the core purpose stated first and a relevant failure behavior second. No superfluous content is present, and the structure is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter mutation with no output schema, the description adequately covers the main behavior. It mentions the failure case, but omits details about success return values or constraints on supported pairs (beyond examples), which could be useful but are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all four parameters (100% coverage), and the tool description does not add significant extra meaning beyond the schema text. The examples in the description (e.g., 'income+transaction') give some context but don't materially enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Link two entities') and provides examples of supported pairs, making the purpose understandable. However, it does not explicitly distinguish itself from the sibling tool 'unlink_entities', relying on the verb alone to convey the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for creating links between entity pairs and notes the failure behavior, but does not explicitly state when to prefer this over alternatives (e.g., unlink_entities) or mention any preconditions beyond existence of the records.
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 mappingsRead-onlyInspect
The chart-of-accounts category-to-account mapping. For the accounts themselves use list_accounts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
list_accountsList accountsRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
list_appsList appsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_binnedList binnedARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 clientsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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_documentsList documentsARead-onlyInspect
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) and/or min_outstanding (minimum outstanding amount) — 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. Each row carries totals, outstanding, status, type, type_label and contact. Use get_document for one document's full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only 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. | |
| from | No | Only documents with a due date on/after this date (inclusive, ISO 8601, e.g. "2026-01-01"). Documents with no due date are kept. | |
| type | No | The 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.. | |
| limit | No | Max 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. | |
| query | No | Case-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". | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. | |
| status | No | Filter to documents whose computed status matches (case-insensitive), e.g. "overdue", "due", "paid", "partiallypaid", "sent", "draft". Combine with type=bill for overdue-bill analysis. | |
| unpaid | No | When true, return only documents with an outstanding balance (excludes fully paid / zero-outstanding rows). | |
| contact | No | Filter to documents for this contact id (a client or supplier). | |
| currency | No | Filter to documents in this currency (ISO 4217 code, e.g. "USD", "ZAR"). Documents with no stored currency are excluded when set. | |
| direction | No | Money direction filter: "in" for sales documents (invoices, quotes, debit notes), "out" for purchase documents (bills, POs, credit notes, GRNs). | |
| min_outstanding | No | Only documents whose outstanding balance is at least this amount (inclusive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses pagination behavior (50 per page, 200 max), newest-first ordering, the meta.total/truncated pitfall, and that it reads both document stores. It also explains that rows carry totals/outstanding/status fields, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, every clause earns its place: purpose first, then the pagination warning, filters with examples, row fields, and the handoff to get_document. The potential wall-of-text is justified by a 12-parameter tool and is front-loaded with the most important caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, it covers pagination, filter combinations, ordering, row contents, and the alternative for full detail. Nothing needed to call the tool correctly or interpret the response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is already strong. The description adds value by grouping the filters, clarifying the query substring semantics, and giving ready-made combinations. It doesn't go deep on every parameter, but the schema already handles those details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the verb ('List') and the exact resource ('the business's documents'), enumerates every document type, and asserts it is the complete authoritative surface reading both document stores. This also distinguishes it from narrower list tools such as list_invoices and from get_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance ('Use get_document for one document's full detail') and concrete composition examples (type=bill + unpaid + status=overdue, or type=invoice + query=<ref>). It does not explicitly name the 'when not to use' cases for sibling list tools like list_invoices or search_combined, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emailsList emailsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How far back to look, in days. Defaults to 30; pass 0 to read the whole history (slower). | |
| kind | No | Only emails of this kind (e.g. "invoice", "reminder", "quote-accepted", "order-received"). | |
| limit | No | Page size; defaults to 50, capped at 250. | |
| query | No | Case-insensitive substring match on the subject line. | |
| cursor | No | Offset from the previous response's `cursor`; omit for the first page. | |
| status | No | Only emails in this delivery state: sent | delivered | bounced | complained | rejected | delayed | failed. | |
| to-date | No | Only emails sent at or before this epoch-millis timestamp. | |
| contextid | No | Only emails about this entity — e.g. an invoice id, to see that invoice's send history. | |
| from-date | No | Only emails sent at or after this epoch-millis timestamp. Overrides `days`. |
TDQS
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.
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.
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.
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.
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.
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 employeesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 expensesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| max | No | Only rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set. | |
| min | No | Only rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 filesARead-onlyInspect
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: read_file_columns and fold_file_column answer about what is inside one.
| Name | Required | Description | Default |
|---|---|---|---|
| paired | No | PROD-1302 pairing filter. true = only files already cross-linked to their invoice/receipt counterpart; false = only files not yet paired; omit for all. | |
| folderid | No | Only files in this folder. Omit for all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral context beyond the annotations: it states contents are not returned, which prevents the agent from expecting file data, and it clarifies the significance of the 'stub has finished reading it' state. It could also mention pagination or ordering, but for a read-only listing tool, the current disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with front-loaded scope, a clear 'what you get' list, and a routing pointer to sibling tools. There is 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.
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 listing tool with no output schema, the description tells the agent what fields come back, how to widen scope, and how to get file contents. The main gaps are output ordering/pagination and the precise meaning of the 'paired' filter in context, but the schema covers paired and the description covers the essential caller concerns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents folderid and paired. The description adds a little value by repeating the 'omit for all' semantics in prose, and it names the fields returned, but it doesn't add new parameter meaning beyond the schema. This is adequate, not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear resource ('The files in a folder') and enumerates what fields are returned (name, type, stub-read status, classification), which distinguishes this as a metadata-listing tool. It does not explicitly differentiate from sibling list tools like list_documents or list_binned, but the folder-scoped phrasing and the exclusions (contents are not returned) give it a reasonably distinct identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'omit folderid for every file' and tells the agent when to use read_file_columns and fold_file_column instead: when answers about what is inside a file are needed. This is clearer than most sibling definitions, though it does not explicitly enumerate other list tools or say 'use this only when folder-scoped file metadata is needed' as a hard exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_guidesList guidesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is largely covered. The description still adds real behavioral context beyond the annotation: results are scoped to guides 'this business is entitled to,' which explains a non-obvious filtering behavior an agent should expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a definition/example clause, then the next-step pointer. Slightly dense in the single long opening sentence but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only list with no output schema, the description covers what is returned (entitled guides) and what to do next. A brief note on result shape or emptiness would make it fully complete, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description's mention of entitlement scoping is the only implicit input-like constraint, and it is stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the guided walkthroughs available to this business') and immediately defines what a guide is with concrete examples. It clearly differs from the sibling get_guide, which retrieves 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the next step: 'Follow up with get_guide to read a guide's steps.' That gives a clear when-to-use and a named alternative, though it does not state any exclusions or preconditions for calling this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_incomeList incomeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| max | No | Only rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set. | |
| min | No | Only rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 invoicesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| max | No | Only rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set. | |
| min | No | Only rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 entriesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 movementsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 requestsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 typesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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_payrunsList payrunsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 schedulesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 payslipsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 templatesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 productsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| max | No | Only rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set. | |
| min | No | Only rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already discloses the main behavioral trait (safe, read-only operation), and the description's verb 'List' is consistent with it — no contradiction. The description adds no further behavioral context (e.g., determinism, side effects), but for a simple read-only list tool the annotation largely suffices, so the bar is met with only 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The verb and resource are front-loaded in the first sentence, and the sibling differentiation is packed efficiently into the second. Nothing is redundant or extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered/paginated list tool with no output schema, the description covers the essential context: what the tool returns, that it is read-only, and how it differs from the closest money-related siblings. It does not itemize every return field (e.g., id, name) or explicitly distinguish it from the other list_* siblings, but the annotated schema and parameter docs fill most of the gap, so the description is complete enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter (from, to, min, max, limit, query, cursor) carries a rich, self-documenting description, which establishes a baseline of 3. The main description adds domain meaning beyond that by noting products include price, cost, stock, and sales totals, which clarifies how the generic min/max 'amount' filters apply — a modest but real increment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and a clear resource ('the business's products'), then states the returned data (price, cost, stock, sales totals). It explicitly differentiates from the sibling tools list_expenses and list_income by pointing out that those handle recorded money-out and money-in, so an agent can immediately tell this tool apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives explicit when-not-to-use guidance: 'for recorded money-out use list_expenses and money-in use list_income.' This directly names the alternatives and the condition that selects them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_suppliersList suppliersARead-onlyInspect
List the business's suppliers (id and name). Archived suppliers are included and carry archived: true — archiving hides nothing server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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_transactionsList transactionsRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only rows on/before this date (ISO 8601). Rows without a date are kept. | |
| max | No | Only rows whose amount is at most this (inclusive). Rows with no amount are excluded when min/max is set. | |
| min | No | Only rows whose amount is at least this (inclusive). Rows with no amount are excluded when min/max is set. Applied before pagination. | |
| from | No | Only rows on/after this date (ISO 8601, e.g. "2026-01-01"). Rows without a date are kept. | |
| limit | No | Max 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. | |
| query | No | Case-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. | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. | |
| bankaccountid | No | Only 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. |
mark_document_sentMark document sentAInspect
Mark a document as sent without emailing it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the message. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One message id to mark read. | |
| ids | No | Up 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 transactionsADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 destinationRead-onlyInspect
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 a refund, a fault or a privacy request 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.
| Name | Required | Description | Default |
|---|---|---|---|
| chatid | No | Set automatically — do not supply. | |
| destination | Yes | Where to take the customer in the app. Only allowlisted destinations work; today the one available is "support", which opens the support chat. |
open_report_sessionOpen report sessionARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| employees | No |
TDQS
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.
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.
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.
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.
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.
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.
propose_bill_matchesPropose bill matchesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only bills due on/before this date (inclusive, ISO 8601). | |
| from | No | Only bills due on/after this date (inclusive, ISO 8601). | |
| supplier | Yes | The supplier id (sup-…) whose open bills to pair. |
TDQS
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.
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.
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.
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.
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.
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 columnsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fileid | Yes | The file to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read-only operation, matching the readOnlyHint annotation, and describes exactly what information is returned without implying 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with the primary purpose stated first followed by a practical usage note. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no output schema, the description sufficiently explains what the tool returns and why to use it before folding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter fileid is described as 'The file to read,' which matches the schema but adds little beyond the schema's own description. Since schema coverage is complete, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool reads column headings and row counts from an uploaded CSV, and explicitly distinguishes it from folding a column by saying to read before folding.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: read this before folding a column so you name an existing column. This gives clear when-to-use context relative to the sibling fold_file_column tool.
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 paymentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Document 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. | |
| date | No | Date the payment was received (ISO 8601). | |
| name | No | Label for this payment (e.g. "Deposit", "Final payment"). | |
| notes | No | Free-text notes on the payment. | |
| amount | No | Payment amount in the payment's currency. | |
| method | No | Payment method as free text (e.g. "cash", "card", "eft") — no fixed set. | |
| payment | No | Bank/ledger account id the money moved through — received into (money-in) or paid from (money-out) (see list_accounts). | |
| category | No | Income category for the payment; defaults to Sales when omitted. | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| exchangerate | No | Manual FX rate to the business base currency; omit to use the stored/auto rate. | |
| transactionid | No | Bank 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. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_document_contactRemove document contactADestructiveInspect
Detach the contact (client or supplier) from a document. Pairs with set_document_contact.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity 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". | |
| fileid | Yes | Id of the uploaded file to attach (see /file/upload). | |
| entityid | Yes | Id of the entity to attach the file to. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The binned record's id. | |
| entity | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Client id. Present → update that client; omit → create a new one. | |
| city | No | City. | |
| name | No | Display name / description of the client. | |
| No | Client email address. | ||
| items | No | Vector 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. | |
| hidden | No | Whether this client is hidden from lists. | |
| suburb | No | Suburb or district. | |
| address | No | Street address line 1. | |
| confirm | No | PROD-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. | |
| country | No | Client country (ISO code or name). | |
| starred | No | Whether this client is marked as a favourite. | |
| address2 | No | Street address line 2. | |
| archived | No | Whether 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. | |
| vatnumber | No | VAT / tax registration number. | |
| postalcode | No | Postal or ZIP code. | |
| contactname | No | Name of the primary contact person. | |
| openingdate | No | Date the opening balance applies from (ISO 8601). | |
| contactemail | No | Email of the primary contact person. | |
| customercode | No | Your internal customer/account code for this client. | |
| contactnumber | No | Phone number of the primary contact person. | |
| openingbalance | No | Opening balance amount carried for this client at openingdate. | |
| registrationnumber | No | Business registration number. | |
| clearopeningbalance | No | Reserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation nature is already known. The description adds critical behavioral context beyond that: the confirm-required refusal with code confirm-required, the all-or-nothing batch transaction with single ledger recompute, and the return of the new client id on create. These are valuable disclosures not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately detailed but every sentence carries information: the id behavior, the return value, the confirm-required edge case, and the batch transaction. There is slight redundancy between the opening line and the items description, but overall it is tightly written and front-loads the most important operational detail (id presence).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (23 parameters, all optional), the description covers the key behavioral quirks that an agent must know: the confirm flow, batch semantics, and return value. There is no output schema, but the description states the create return value. It does not detail the update or batch return format, but the core behaviors are well covered, making it sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds meaning beyond that by explaining the semantics of the id parameter (present vs omitted), the items array behavior, and the confirm parameter's role in the refusal flow. This is exactly the kind of contextual explanation that helps an agent use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create or update a customer') and explains the id-dependent behavior, which clearly distinguishes it from sibling tools like save_supplier or save_product. It immediately tells an agent what resource this operates on and how the core operation works.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear conditional usage: pass id to update, omit to create; use the items array for batch operations; and use confirm when the opening date is later than the earliest transaction. It does not explicitly name alternatives, but there is no create_client sibling, so this is the only client save tool. The guidance is actionable and complete for the tool's own variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_documentSave documentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Document id. Present → update that document; omit → create a new one (must include type). | |
| date | No | Document date (ISO 8601). | |
| name | No | Display name / title of the document. | |
| sent | No | Whether the document has been sent to the recipient. | |
| type | No | The 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.. | |
| items | No | Vector 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. | |
| notes | No | Free-text notes. | |
| client | No | Client id, or an exact client name to resolve (see list_clients). | |
| locked | No | Whether the document is locked against further edits. | |
| number | No | Document number; auto-generated if omitted. | |
| parent | No | Id of the parent document this one derives from (e.g. the invoice a credit note relates to). | |
| contact | No | Contact id, or an exact client/supplier name to resolve (client for money-in document types, supplier for money-out; see list_clients / list_suppliers). | |
| duedate | No | Payment due date (ISO 8601). | |
| message | No | Message shown to the recipient on the document. | |
| settled | No | Whether the document has been fully settled/paid. | |
| showvat | No | Whether to display the VAT/sales-tax line on the document. | |
| accepted | No | Whether the recipient has accepted the document (e.g. a quote). | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| shipping | No | Shipping amount added to the document total. | |
| showbank | No | Whether 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). | |
| supplier | No | Supplier id, or an exact supplier name to resolve (see list_suppliers). | |
| accountid | No | Bank/ledger account id the payment moved through (see list_accounts). | |
| description | No | Free-text description of the document. | |
| showdeposit | No | Whether to display the deposit line on the document. | |
| accepteddate | No | Date the document was accepted (ISO 8601). | |
| paymentnotes | No | Free-text payment instructions shown on the document. | |
| showdiscount | No | Whether to display the discount line on the document. | |
| showshipping | No | Whether to display the shipping line on the document. | |
| baseaccountid | No | Base/control account id override; rarely needed — defaults from the category. | |
| depositamount | No | Explicit deposit amount; used instead of the percentage when deposituseamount is true. | |
| invoicebankid | No | PROD-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. | |
| accountpayment | No | Amount paid against the document at save time. | |
| depositpercent | No | Deposit as a percentage of the total. | |
| discountamount | No | Explicit discount amount; used instead of the percentage when discountuseamount is true. | |
| discountpercent | No | Discount as a percentage of the subtotal. | |
| showpaymentlink | No | Whether to include an online payment link on the document. | |
| deposituseamount | No | When true, use depositamount instead of the percentage. | |
| discountuseamount | No | When true, use discountamount instead of the percentage. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| city | No | ||
| name | No | ||
| role | No | ||
| No | |||
| notes | No | ||
| number | No | ||
| suburb | No | ||
| address | No | ||
| country | No | ||
| starred | No | ||
| address2 | No | ||
| archived | No | ||
| idnumber | No | ||
| birthdate | No | ||
| taxnumber | No | ||
| department | No | ||
| postalcode | No | ||
| employments | No | ||
| packagekind | No | ||
| jurisdiction | No | ||
| contactnumber | No | ||
| packageamount | No | ||
| packagequantity | No | ||
| paysliptemplate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false and destructiveHint=false; the description adds substantive behavioral detail beyond them: which updates file tax certificates, which do not, and explicitly that it writes no payslip and posts nothing to the ledger. This is exactly the kind of side-effect information an agent needs 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences: purpose first, then create/update semantics, then side-effect conditions, then explicit non-actions. Every sentence adds material information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 25-parameter tool with no required fields, no schema descriptions, and no output schema, the description is strong on behavior but incomplete on parameter semantics. It gives enough to decide create vs update and to understand major side effects, but not enough to correctly populate many of the less obvious fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 25 parameters, so the description carries the burden. It adds real meaning for 'id' (omit vs pass) and groups many fields semantically ('contact and identity details', 'standing package'), but it does not explain most individual parameters, the packagekind enum including '$delete', or the employments nested structure. It partially compensates but leaves major gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create or update a payroll employee') and enumerates the domains of data it covers: name, number, contact and identity details, role, department, employments, and standing package. This clearly distinguishes it from read-only siblings like get_employee and list_employees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit create/update branching: 'Omit id to create; pass an id to update that employee.' It also states the side-effect conditions for updates that end employment versus re-sent end dates or status changes. It does not name alternative tools, but the create/update conditions are precise.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ai | No | Internal: set when the expense was produced by AI enrichment. | |
| id | No | Expense id. Present → update that expense; omit → create a new one. | |
| date | No | Expense date (ISO 8601). | |
| name | No | Display name / description of the expense. | |
| paid | No | Whether this expense has been paid. | |
| alert | No | Alert/reminder note to surface on this expense. | |
| items | No | Vector 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. | |
| notes | No | Free-text notes. | |
| split | No | Whether this expense is one line of a split transaction. | |
| total | No | Total 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. | |
| amount | No | Unit amount before quantity/tax, in the record's currency. | |
| method | No | Payment method as free text (e.g. "cash", "card", "eft") — no fixed set. | |
| unlink | No | Pass the id of a currently-linked transaction/document to detach it. | |
| groupid | No | Group id linking split lines of one real-world transaction together. | |
| taglist | No | Tag ids to set on this expense (replaces the existing set). | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| paiddate | No | Date payment was made (ISO 8601). | |
| quantity | No | Number of units. | |
| salestax | No | Whether sales tax (VAT) applies. May also be an array of salestax refs. | |
| supplier | No | Supplier id, or an exact supplier name to resolve (see list_suppliers). | |
| accountid | No | 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. | |
| exchangerate | No | Manual FX rate to the business base currency; omit to use the stored/auto rate. | |
| showquantity | No | Whether to display the quantity column on the document. | |
| bankaccountid | No | Bank account id the money moved through (see list_accounts). | |
| baseaccountid | No | Base/control account id override; rarely needed — defaults from the category. | |
| transactionid | No | Bank transaction id to reconcile this expense against. | |
| salestaxamount | No | Explicit sales tax amount; used instead of the percentage when salestaxuseamount is true. | |
| salestaxpercent | No | Sales tax rate as a percentage (e.g. 15 for 15%). | |
| salestaxuseamount | No | When true, use salestaxamount as the tax figure instead of computing from the percentage. |
TDQS
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 disclosure burden and does it: the batch path is 'one all-or-nothing transaction with a single ledger recompute', `id` present means update versus absent means create, and setting accountid to a document id makes the expense count toward that document's paid amount. These are non-obvious transactional and linking semantics that go well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core scope/not-scope distinction and routing alternatives before the mechanics, and every sentence carries information. However it runs long and repeats itself — 'each item with an id updates; each without creates' appears twice, and the accountid-to-bill explanation is stated in both the description and the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 29-parameter mutation tool with no output schema and only minimal annotations, the description covers the critical ambiguities: create vs update, single vs batch atomicity, and how to settle documents. Reasonably complete, though it says nothing about permissions/authorisation needs or failure behaviour for a rejected batch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds conceptual meaning the schema states only per-field: the inline-fields vs `items` array choice, the create/update switch on `id`, and the accountid-as-document-id payment linkage. It does not explain the tax fields or the total-vs-amount precedence, which are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and immediately bounds the scope with a negative: 'Record spending that is NOT settling a document, or edit an existing expense's ACCOUNTING ENTRY'. It names the exact sibling tools that handle the excluded cases (record_document_payment, settle_bills, update_transaction), so an agent can distinguish this tool from its neighbours without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance with named alternatives: 'to pay a bill or PO prefer record_document_payment (one document) or settle_bills (several)', 'to change the BANK LINE ... use update_transaction', and 'Use create_income_expenses_bulk to add income and expenses together'. It also chooses between the single-item and batch invocation modes ('this 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_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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Income id. Present → update that income; omit → create a new one. | |
| date | No | Income date (ISO 8601). | |
| name | No | Display name / description of the income. | |
| alert | No | Alert/reminder note to surface on this income. | |
| items | No | Vector 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. | |
| notes | No | Free-text notes. | |
| split | No | Whether this income is one line of a split transaction. | |
| amount | No | Unit amount before quantity/tax, in the record's currency. | |
| client | No | Client id, or an exact client name to resolve (see list_clients). | |
| method | No | Payment method as free text (e.g. "cash", "card", "eft") — no fixed set. | |
| unlink | No | Id of a currently-linked invoice/asset to detach from this income. Ignored unless it is an invoice/asset id. | |
| assetid | No | Asset id to link this income to (e.g. proceeds from an asset). | |
| groupid | No | Group id linking split lines of one real-world transaction together. | |
| product | No | Product id this income is for (see list_products). | |
| category | No | Income category name; forced to "Sales" when linked to an invoice. | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| accountid | No | Chart-of-accounts income category account id, or an exact account name to resolve (see list_accounts). | |
| invoiceid | No | Invoice id this income pays toward. | |
| incometype | No | Income type/classification label. | |
| exchangerate | No | Manual FX rate to the business base currency; omit to use the stored/auto rate. | |
| baseaccountid | No | Base/control account id override; rarely needed — defaults from the category. | |
| transactionid | No | Bank transaction id to reconcile this income against. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds substantial context beyond that: the batch is one all-or-nothing transaction with a single ledger recompute, `id` present updates and omitted creates, and category is forced to "Sales" when invoice-linked. The double-counting rule is genuinely non-obvious behavior an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose, then alternatives, then the settlement edge case, then single-vs-batch mechanics. Every sentence carries information; it is slightly long, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter mutation tool with no output schema, the description covers the create/update/batch semantics and cross-tool routing well. It does not explain what the call returns or validation failure behavior, which is a minor residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter text is already documented (baseline 3). The description goes further by explaining the id/items create-vs-update contract and the non-obvious `accountid`=invoice-id settlement trick, adding meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create/edit) and resource (income accounting entries), and immediately distinguishes itself from update_transaction (bank line) and record_document_payment (invoice payments). An agent can pick the right tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and selection conditions: use update_transaction for bank-line edits, record_document_payment for invoice payments, create_income_expenses_bulk for combined income+expense batches. It even handles the edge case where the bank line already carries its own income (use `id`=income, `accountid`=invoice id) to avoid double-counting.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Journal entry id. Present → update; omit → create a new one. | |
| date | No | Journal entry date (ISO 8601). | |
| name | No | Description of the journal entry. | |
| items | No | Vector 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. | |
| lines | No | Journal lines. Each line debits or credits one account; total debits must equal total credits. | |
| notes | No | Free-text notes. | |
| amount | No | Total amount of the journal entry. | |
| opening | No | Whether this is an opening balance entry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read/write safety profile (readOnlyHint=false, destructiveHint=false); beyond that the description adds real behavior: the returned id on create, and that items are one all-or-nothing transaction with a single ledger recompute. It does not address what happens to existing lines on replace or permission needs, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core action, then routing guidance, then id semantics, then batch behavior. Every sentence carries distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the key return value (new journal entry id on create) and covers single, update, and batch-item flows. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% so the schema already documents all 8 params (baseline 3). The description adds meaning beyond the schema by explaining the id-present/absent create-vs-update rule and the atomic, single-recompute semantics of the items array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (create or replace) plus resource (whole journal entry with all lines) and explicitly names the distinguishing siblings update_journal_line and add_journal_line, so an agent can tell it apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use this vs alternatives ('to fix one line use update_journal_line, to add one use add_journal_line'), how id selects update vs create, and when to prefer the items batch array. Routing is fully specified.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| date | No | ||
| days | No | ||
| kind | No | ||
| notes | No | ||
| employee | No | ||
| leavetype | No |
TDQS
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 real weight here and delivers: the create-vs-edit field contract, the immutability of employee and leave type after creation, the sign convention for days (positive grants, negative consumes leave), and the key side-effect disclosure that movements change leave balances only and post nothing to the ledger. It omits permission/authorization requirements and any indication of what the save returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, and the create/edit split is front-loaded so the agent learns the primary routing rule before the field details. Every clause carries operational information (required inputs, mutable fields, balance-only effect).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the create path, the edit path, immutable fields, and the ledger side-effect, which is close to complete. The one gap is the mismatch with the schema: required is [], yet creation is described as needing employee, leavetype, kind and days; the description never flags that conditional requirement explicitly or states what the tool returns on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description must compensate and largely does: id (edit selector), employee, leavetype, kind with its two enumerated values, days with sign semantics, and date/notes as edit-time fields. Nearly every parameter gets meaning beyond its bare name, which is exactly what a 0%-coverage schema requires.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (create or edit) against a specific resource (a leave opening balance or adjustment / leave movement), and the second sentence pins down exactly what fields exist in each mode. An agent can distinguish this from save_leave_request or save_leave_type purely from the description, since the resource and its effect on leave balances are named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: supply employee/leavetype/kind/days with no id to create, supply an id to edit, and it names exactly which fields are mutable versus fixed on edit (employee and leave type are fixed). It does not name sibling alternatives such as list_leave_movements for lookup or save_leave_request for approvals, so it falls short of a full when/when-not/alternative statement.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| days | No | ||
| notes | No | ||
| units | No | ||
| reason | No | ||
| enddate | No | ||
| archived | No | ||
| employee | No | ||
| sicknote | No | ||
| leavetype | No | ||
| startdate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive write. The description adds real context beyond that: new requests are always filed as 'requested' never 'approved', the approve/decline path lives in decide_leave_request, and no ledger entries are posted. It does not describe edit-side effects on existing fields, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the primary action stated first, then the id-based mode switch, then the status and ledger caveats. No sentence is redundant or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no required params and no output schema, the description covers the workflow, mode selection and side effects well. The remaining gap is three unmentioned parameters (units, archived, sicknote) and unspecified behavior when editing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names employee, leave type, start/end dates, days, reason and notes, and explains the id toggle, but leaves units, archived and sicknote (three of eleven parameters) undocumented anywhere, so coverage is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb pair (file or edit) and resource (leave request) and enumerates the fields involved. It explicitly distinguishes itself from the sibling decide_leave_request, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing rules: omit id to file a new request, pass an id to edit. It names the alternative tool (decide_leave_request) for approve/decline/cancel, and states that a new request is never auto-approved, so when-to-use and when-not are fully specified.
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 or upfront), yearly entitlement in days, cycle months, carry-over and whether it is paid. Omit id to create; pass an id to update that leave type. Leave types are master data and post nothing to the ledger.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| days | No | ||
| name | No | ||
| paid | No | ||
| unit | No | ||
| notes | No | ||
| primary | No | ||
| archived | No | ||
| carryover | No | ||
| payitemid | No | ||
| accrualrate | No | ||
| cyclemonths | No | ||
| accrualafter | No | ||
| carryovercap | No | ||
| accrualmethod | No |
TDQS
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. The description adds genuinely useful behavior the annotations don't: the upsert mechanics and the fact that leave types are master data that post nothing to the ledger. It still says nothing about permissions, whether an update overwrites unspecified fields, or what happens to archived/primary flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the create/update decision, with no filler. The ledger sentence is arguably optional but earns its place by ruling out an accounting side effect in a finance product.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation tool with no parameter descriptions, no output schema, and only minimal annotations, the description handles the high-level semantics well but leaves eight parameters undocumented and gives no guidance on defaults or required combinations (the schema requires nothing). An agent can call it, but not confidently across all fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 15 parameters, so the description must carry the load, and it only covers about half: name, days, cyclemonths, carryover, paid, accrualmethod, and id. It does add real meaning for accrualmethod ('monthly or upfront'), which the schema lacks as an enum, but payitemid, accrualrate, accrualafter, carryovercap, unit, notes, primary, and archived are left entirely undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb pair (create or update) and the exact resource (a leave type), then enumerates the main fields it manages. It is clearly distinct from siblings like list_leave_types, save_leave_request, and save_leave_movement, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The create-vs-update condition is stated explicitly: omit id to create, pass an id to update. What's missing is any pointer to how an id is obtained (e.g., list_leave_types) or when to prefer an alternative tool, so the routing guidance is clear but not complete.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| lines | No | ||
| notes | No | ||
| payrun | No | ||
| paydate | No | ||
| employee | No | ||
| periodend | No | ||
| periodstart | No |
TDQS
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 by disclosing that a created payslip is always a draft, an edit never flips the draft flag, and the operation never posts to the ledger. It also documents the two refusal scenarios, which is exactly the behavioral context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the create-vs-edit rule is front-loaded ahead of the caveats. Every clause adds a constraint an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the critical safety and workflow context (draft-only, no ledger posting, refusal conditions). The remaining gap is input detail — the line object's structure and field formats — which neither the schema nor the description clarifies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the load, and it names the core inputs (employee, pay run, period, pay date, lines, id semantics) plus the earning/deduction/contribution line concept. However, it says nothing about the `notes` field, the line sub-fields (code, role, amount, quantity, statutory, sort, etc.), or the date/number formats, so 8 parameters are only partially explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb(s) and resource (create/edit a DRAFT payslip) and enumerates the entity's scope: employee, pay run, period, pay date, earning/deduction/contribution lines. The create-vs-edit distinction via 'id' is stated explicitly, so it is distinguishable from siblings like finalise_payslips and get_payslip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: omit id to create, pass id to edit. It also states two exclusion conditions — a finalised payslip refuses an edit, and a payslip on a self-finalising pay run is refused — so the agent knows when the call will fail.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| name | No | ||
| lines | No | ||
| notes | No | ||
| archived | No | ||
| statutory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds substantial domain behavior: the template is master data, it changes future payslips only, it posts nothing to the ledger, and updates replace the full line set. It still omits permissions and validation behavior, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: first defines the resource, second gives create/update routing, third gives update replacement semantics, fourth gives ledger/master-data behavior. It is front-loaded and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with 0% schema coverage and no output schema, the description covers core usage and important behavioral context well. It is incomplete on several secondary parameters (notes, archived, statutory) and most nested line fields, leaving the agent to infer their meaning from names alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden. It explains id semantics (omit to create, pass to update) and the replacement behavior of lines, and names several line fields (kind, rate, quantity, amount, formula). However, top-level notes, archived, and statutory are never mentioned, and many line fields (code, role, sort, payitem, prorate, category, description) remain undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or update a payslip template') and defines what the resource is ('a named line set of earnings, deductions and contributions'). This clearly distinguishes it from sibling tools like save_payslip and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit create-vs-update routing ('Omit id to create; pass an id to update that template') and a key update constraint ('On update, lines is the full set'). It does not name alternative tools or when-not-to-use this one, 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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Product id. Present → update that product; omit → create a new one. | |
| sku | No | Stock-keeping unit / product stock code. Canonical product-level SKU (mirrors a variant's sku). | |
| cost | No | Cost price per unit. | |
| name | No | Display name / description of the product. | |
| unit | No | Legacy unit-of-measure label; prefer `units`. | |
| image | No | Product image URL; pass "$delete" to remove the existing image. | |
| items | No | Vector 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. | |
| notes | No | Free-text notes. | |
| price | No | Selling price per unit, in the record's currency. | |
| units | No | Unit of measure label (e.g. "each", "hour", "kg"). | |
| amount | No | Unit amount before quantity/tax, in the record's currency. | |
| starred | No | Whether the product is starred/favourited. | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| quantity | No | Number of units. | |
| trackstock | No | Whether stock levels are tracked for this product. | |
| description | No | Product description. | |
| paymentlink | No | Whether an online payment link is enabled for this product. | |
| salestaxids | No | Sales tax ids to link to this product. | |
| unlinktaxes | No | Sales tax ids to unlink from this product. | |
| costcurrency | No | ISO 4217 currency code for the cost price. | |
| allowoversell | No | Whether the product can be sold beyond available stock. | |
| enablequantity | No | Whether the buyer can choose a quantity for this product. | |
| requireaddress | No | Whether a delivery/billing address is required when this product is purchased. | |
| salestaxexclusive | No | Whether the price excludes sales tax. |
TDQS
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 most of the behavioral load and it does: it discloses the create-vs-update switch on `id`, the returned product id on create, and that batch `items` are one all-or-nothing transaction with a single ledger recompute. It does not mention permission/auth requirements or what a partial-failure response looks like, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences that are front-loaded with the primary purpose, then the sibling exclusion, then the id/batch mechanics. No filler; each clause maps to a decision the agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter, no-required-fields tool with no output schema, the description covers create/update semantics, batch semantics, and the create return value. It omits anything about defaults (e.g. currency defaulting to business currency) and error/rollback behavior beyond 'all-or-nothing', leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented; the description's id and items semantics largely restate what the schema says. Baseline 3 applies, with only marginal added meaning (e.g. batch being preferred over repeated calls).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create or update the catalogue PRODUCT itself') plus the field scope, and explicitly distinguishes itself from the save_variant sibling for size/colour options. An agent can route between save_product and save_variant without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use save_variant for options of an existing product, pass an `id` to update, omit `id` to create, and use the `items` array for batch work instead of repeated calls. Both the alternative tool and the create/update condition are named.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Supplier id. Present → update that supplier; omit → create a new one. | |
| city | No | City. | |
| name | No | Display name / description of the supplier. | |
| No | Supplier email address. | ||
| items | No | Vector 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. | |
| suburb | No | Suburb or district. | |
| address | No | Street address line 1. | |
| confirm | No | PROD-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. | |
| country | No | Supplier country (ISO code or name). | |
| starred | No | Whether this supplier is marked as a favourite. | |
| address2 | No | Street address line 2. | |
| vatnumber | No | VAT / tax registration number. | |
| postalcode | No | Postal or ZIP code. | |
| contactname | No | Name of the primary contact person. | |
| openingdate | No | Date the opening balance applies from (ISO 8601). | |
| contactemail | No | Email of the primary contact person. | |
| contactnumber | No | Phone number of the primary contact person. | |
| openingbalance | No | Opening balance amount carried for this supplier at openingdate. | |
| registrationnumber | No | Business registration number. | |
| clearopeningbalance | No | Reserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, destructiveHint false), the description discloses a critical behavioral edge case: updating with an opening date later than the earliest bill/expense is 'refused, unwritten, with code confirm-required' until confirm=true. It also reveals the batch operation is 'one all-or-nothing transaction with a single ledger recompute', and that create returns the new id. These are exactly the non-obvious behaviors an agent needs to anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the core action, follows with basic id semantics, then the important exception and batch capability. Every sentence conveys a distinct piece of information, with no filler or redundant schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 20 parameters, no output schema, and minimal annotations, the description covers all essential runtime behaviors: create/update distinction, the confirmation requirement for a specific date scenario, and batch transaction semantics. Parameter-level detail is left to the schema, which is fully documented, so 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.
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 adds value beyond the schema by explaining the id parameter's role in update vs create, the items array's batch atomicity, and the confirm parameter's edge-case necessity (including the response code confirm-required and related transaction metadata). This enriches the schema without repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the precise verb 'Create or update' and the resource 'supplier', immediately distinguishing it from sibling save tools like save_client or save_product. It also clarifies the optional id identifies the entity, and the final sentence extends to batch updates, leaving no ambiguity about the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage conditions: 'Pass an id to update that supplier; omit id to create a new one' and 'To create/update many at once, send an items array'. It does not explicitly state when not to use this tool versus alternatives, but given the resource-specific naming and clear create/update semantics, the context is sufficient for an agent to select it correctly.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Variant id. Present → update that variant; omit → create a new one. | |
| sku | No | Stock-keeping unit / product code. | |
| cost | No | Cost price per unit. | |
| name | No | Display name / description of the variant. | |
| image | No | Variant image URL; pass "$delete" to remove the existing image. | |
| items | No | Vector 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. | |
| notes | No | Free-text notes. | |
| price | No | Selling price per unit, in the record's currency. | |
| units | No | Unit of measure label (e.g. "each", "hour", "kg"). | |
| barcode | No | Barcode value for this variant. | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| productid | No | Parent product id this variant belongs to (see list_products). | |
| description | No | Variant description. | |
| salestaxids | No | Sales tax ids to link to this variant. | |
| costcurrency | No | ISO 4217 currency code for the cost price. | |
| salestaxexclusive | No | Whether the price excludes sales tax. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-read-only, non-destructive write, so the safety profile is covered. The description adds genuinely new context: that create returns the new variant id, that a batch is one all-or-nothing transaction, and that it triggers a single ledger recompute. It stops short of stating partial-update semantics (whether omitted fields are cleared or left unchanged), which matters for a 16-param upsert.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core create/update purpose and the sibling disambiguation before the batching detail. The id-present/absent rule is stated twice (once standalone, once for items), a minor redundancy that keeps it just under a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, no-required, no-output-schema upsert, the definition covers purpose, sibling routing, create/update switch, batch atomicity, batch preference, and the create return value. The remaining gap is partial-update semantics and what happens to unmentioned fields, which an agent calling an upsert would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including the `id` present/absent semantics and the `items` batch behaviour. The description largely restates those schema descriptions rather than adding format, constraints, or defaulting rules beyond them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create or update), a precise resource (an OPTION/variant under an existing product, with concrete examples like size, colour, pack), and explicitly routes the agent elsewhere for the parent product via 'for the product itself, use save_product'. An agent can distinguish this from save_product without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection conditions: pass `id` to update, omit `id` to create, and send an `items` array for bulk. It also names the alternative (save_product) and states the preference ('Preferred over repeated calls') for batching, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_combinedSearch combinedARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Upper bound of the date range to match (ISO 8601, YYYY-MM-DD). | |
| max | No | Upper bound of the amount range to match (matched on the kind's primary amount field, absolute value). | |
| min | No | Lower bound of the amount range to match (matched on the kind's primary amount field, absolute value). | |
| from | No | Lower bound of the date range to match (ISO 8601, YYYY-MM-DD). | |
| kind | Yes | Which collection to search. One of: "all" (every collection), "expenses", "income", "transactions", "clients", "suppliers", "products", "invoices". | |
| sort | No | Result 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. | |
| limit | No | Max 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. | |
| query | No | Free-text search query (case-insensitive substring match across all text fields). | |
| cursor | No | Opaque pagination cursor. Omit for the first page; pass the next_cursor from a previous response verbatim to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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 articlesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What the user wants to do, in their words, e.g. "invite my accountant". |
TDQS
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.
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.
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.
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.
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.
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 documentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the document (invoice, quote, credit note, etc.) to email (required). | |
| No | Override recipient address; defaults to the document contact's email on file. | ||
| receiptfileids | No | With includereceipts, send only these receipts (file ids, or the expense id for a legacy receipt). Omit for all; an empty list sends none. | |
| includereceipts | No | Attach the receipts of expenses rebilled on this document's lines. Off by default; receipts that do not fit are sent as download links. |
send_feedbackSend feedbackAInspect
Send feedback about the MCP tools to the Stub team.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Optional: the MCP tool name this feedback is about (e.g. list_invoices). | |
| feedback | Yes | Your feedback about the MCP tools — what worked, what didn't, what's missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only and non-destructive; the description adds that feedback is sent to the Stub team, which is expected from the verb 'send.' No additional side effects, confirmation behavior, or persistence details are disclosed, so it provides only baseline transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It conveys the action, subject, and recipient in a compact form that is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema covers parameters, so the description is mostly sufficient for invocation. However, the existence of a very similar sibling tool, send_team_feedback, creates real selection ambiguity that the description does not address, and there is no mention of what happens after sending.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description does not add parameter-level detail beyond saying feedback is about MCP tools, which aligns with the schema but is not extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (send feedback), the subject (MCP tools), and the recipient (Stub team), so an agent can understand the tool's purpose immediately. However, it does not explicitly distinguish this tool from the similarly named sibling send_team_feedback, relying on the reader to infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'about the MCP tools' implies when the tool should be used, and the schema describes what the feedback should contain. There is no explicit guidance about when not to use it or how it differs from alternatives like send_team_feedback, so the agent must infer the boundary.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chatid | No | Set automatically — do not supply. The conversation this feedback came from. | |
| feedback | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| whatwedo | Yes | A short free-text description of what the business does (its trade/industry in the owner's words). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | The business tag/segment label to set on this business (drives segmentation and routing). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id to attach the contact to (invoice, quote, bill, etc.). | |
| client | Yes | Contact id to attach — a client for money-in documents, a supplier for money-out documents (see list_clients / list_suppliers). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity kind to flag/unflag, e.g. "expense", "income", "transaction". | |
| flagged | Yes | True to flag (e.g. mark for review), false to unflag. | |
| entityid | Yes | Id of the entity to flag/unflag. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Entities to flag/unflag in one call. | |
| flagged | No | Default flag value applied to items that don't set their own. |
TDQS
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.
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.
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.
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.
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.
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). For several entities, prefer set_entity_tags_bulk — one call instead of many.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity kind to tag, e.g. "expense", "income", "invoice", "transaction", "client", "supplier". | |
| taglist | Yes | Tag ids to set on the entity (replaces the existing set; empty clears all tags). | |
| entityid | Yes | Id of the entity to tag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it replaces the existing tag list, a key behavioral trait not captured by the annotations (readOnlyHint=false, destructiveHint=false). This informs the user about the overwriting nature 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a concise single sentence that efficiently states the purpose and the alternative for bulk operations. Parameter descriptions are brief but informative, with no redundant or extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tagging operation, the description provides sufficient context for an agent to select and use the tool correctly. It includes the core behavior, the bulk alternative, and parameter meanings, with no obvious missing information given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have descriptions that clarify their roles: 'entity' as kind, 'taglist' as IDs, and 'entityid' as identifier. The taglist description also notes the replacement behavior and that an empty list clears tags, adding meaning beyond the parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the function (set tags) and that it replaces the existing tag list. It also distinguishes itself from the bulk sibling tool by name, providing immediate clarity on its specific role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to prefer the bulk version for multiple entities ('For several entities, prefer set_entity_tags_bulk — one call instead of many.'), giving a clear condition for when to use this tool versus an alternative.
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). For a single entity use set_entity_tags.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Entities to tag in one call. Each item sets the full tag list on one entity. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, which only say readOnlyHint=false and destructiveHint=false, the description discloses that the call replaces each entity's existing tag list. This is important behavioral context because it warns that prior tags will be overwritten, not appended to.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry the essential behavior and the routing to set_entity_tags. There is no filler, and the most important facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation tool, the description covers the key behavior, the replacement side effect, and the main alternative. The deleted parameter and clear_entity_tags sibling are not mentioned in the description, but the schema covers the parameter and the core routing is still clear enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains entity, entityid, taglist, and deleted. The description adds little parameter-level meaning beyond restating the replacement semantics already captured by the taglist field description, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Set tags on many entities'), states the bulk nature of the operation, and clarifies the key side effect ('replaces each entity's tag list'). It also distinguishes itself from the single-entity sibling tool, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use this for many entities at once, and use set_entity_tags for a single entity. This directly routes the agent to the correct alternative without requiring them to inspect sibling definitions.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| enabled | Yes | ||
| weekday | No | Day of the week (0-6, Sunday=0) to run on, for weekly frequency. Defaults to Monday (1). Ignored for other frequencies. | |
| autosend | No | ||
| frequency | No | How 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_month | No | Day of the month (1-31) to run on, for monthly/yearly frequency. Defaults to the 1st. Ignored for daily/weekly. |
TDQS
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.
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.
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.
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.
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.
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 invoiceInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| enabled | Yes | ||
| weekday | No | Day of the week (0-6, Sunday=0) to run on, for weekly frequency. Defaults to Monday (1). Ignored for other frequencies. | |
| autosend | No | ||
| frequency | No | How 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_month | No | Day of the month (1-31) to run on, for monthly/yearly frequency. Defaults to the 1st. Ignored for daily/weekly. |
settle_billsSettle billsADestructiveIdempotentInspect
Settle a batch of bills in one call — 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.
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | Yes | The confirmed bill↔payment pairs to reconcile. Each is applied independently. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=true). It discloses per-pair independence, safe no-op idempotency on re-runs, undo semantics (expenseid is the undo handle, created=false means unlink never delete), safe-to-delete bankchargeid, and the auto-removal of fxadjustmentid with an explicit do-not-delete warning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and dense with load-bearing detail, so most sentences earn their place. However it is delivered as one long run-on paragraph with nested parentheticals, making the complex FX/bank-charge branches harder to scan than they need to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, destructive mutation tool with no output schema, the description fully describes the return shape (results, status values, ids, counts), the limits (max 100 pairs), and every refusal/proposal branch, leaving no gap an agent needs before invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the OR relationship between expense and transaction, and the exact confirm-and-resend protocol for bankcharge and fxadjustment (amount equals the returned proposal amount, only after user confirmation).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (settle), resource (a batch of bills), and internal mechanism (each pair links a bill/PO/GRN to an expense or bank transaction). It explicitly contrasts itself with the sibling record_document_payment ('this tool instead LINKS an existing expense or bank transaction and settles a whole batch'), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use-vs-alternative: record_document_payment handles ONE bill, this handles a batch by linking. It also states the sequencing precondition ('Only run after the user has confirmed the proposed matches') and the confirm-then-resend workflow for proposed bankcharge/fxadjustment cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_todosSet todosInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| todos | Yes | The FULL checklist (replaces the stored list, not merged). | |
| chatid | Yes | Id of the chat whose todo checklist to replace. |
snooze_messageSnooze messageAInspect
Snooze a notification — resurfaces tomorrow at 08:00 SAST
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the message/notification to snooze. | |
| time | No | Snooze duration hint in minutes; omit to snooze until tomorrow 08:00 SAST. | |
| snooze-until | No | Explicit ISO 8601 timestamp to resurface the message at; overrides `time`. |
TDQS
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.
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | No | The recurring template ids to generate the next copies from now. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | No | The recurring template ids to generate the next copies from now. |
TDQS
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.
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.
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.
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.
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.
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 runADestructiveInspect
Undo a bulk agent run by its job id — reverses every change that run made, skipping anything you've since edited by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| jobid | Yes |
TDQS
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.
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.
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.
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.
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.
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.
unlink_entitiesUnlink entitiesAInspect
Unlink two entities of any supported pair. Safe to call even when the link is already broken or one side was deleted without being unlinked first — this is the primitive for clearing a stuck link state without direct database access.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | First entity's kind, e.g. "income", "asset", "transaction". | |
| entityid | Yes | First entity's id. | |
| linkedentity | Yes | Second entity's kind. | |
| linkedentityid | Yes | Second entity's id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint: false, destructiveHint: false), the description adds meaningful behavioral context. It explicitly states that calling it on an already-broken link is safe, implying it does not raise errors or cause side effects in such cases. The phrase 'without direct database access' clarifies the tool's abstraction level, which is not evident from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that convey the purpose, safety, and rationale. There is no redundant information or fluff. The structure is logical: first states the action, then clarifies its idempotent nature and the intended use case. Every word contributes to understanding the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (4 parameters, no output schema), the description covers the essential aspects: what it does, when it's safe, and why it exists. However, it does not specify the return value or behavior on success/failure (e.g., whether it returns a confirmation or error). This information might be inferred from similar tools but is not explicitly provided. Thus, it is nearly complete but lacks a small detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides descriptions for all four parameters with 100% coverage, so the baseline is 3. The tool description does not add any additional meaning about the parameters themselves; it only refers to 'any supported pair,' which hints at constraints on entity types but does not elaborate on individual parameters. Since the schema already handles parameter details, this score reflects the lack of extra parameter semantics in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to unlink two entities of any supported pair. It uses a specific verb ('unlink') and identifies the resource ('entities'), and the title 'Unlink entities' reinforces this. The context of sibling tools, especially 'link_entities', makes the distinction obvious without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: it is safe to call even if the link is already broken or one side was deleted, making it idempotent. It also frames the tool as a primitive for clearing stuck link states, which helps the agent understand its role compared to other operations like 'link_entities' or database fixes. This is more than a generic statement and gives actionable context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_income_transactionUnlink income transactionAInspect
Detach an income record from its bank transaction. Safe to call even if the transaction was already deleted without being unlinked first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the income record to detach from its bank transaction. | |
| transactionid | Yes | Id of the currently-linked bank transaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses idempotent behavior in the deleted-transaction case, going beyond the annotations. It does not describe all side effects on the income record, but the annotations and description are consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The action and safety note are front-loaded and immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficiently complete for a simple operation with no output schema. It covers the action, parameters, and an important edge case, though it could theoretically mention the effect on the income record's status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes both parameters with clear definitions. The description adds minimal extra meaning beyond 'currently-linked' for transactionid, so it meets but does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Detach' and the specific objects: an income record from its bank transaction. This distinguishes it from broader siblings like unlink_entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful safety guidance for an edge case (transaction already deleted without being unlinked), which helps the agent know when it is safe to call. It does not explicitly compare to alternatives but offers practical usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_accountUpdate accountInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Account id to update (see list_accounts). | |
| code | No | The business's own account code (e.g. "4000"). Trimmed; an empty string clears it; omit to leave it unchanged. | |
| icon | No | Icon identifier for the account (UI display). | |
| meta | No | Opaque metadata string stored on the account. | |
| name | No | Account name (e.g. "Consulting income", "Rent"). | |
| role | No | Semantic reporting role: "tax" (income-tax expense), "taxprovision" (tax provision/liability), or "salestax" (VAT control account). Omit for an ordinary account. | |
| group | No | Group label the account is organised under in the chart of accounts. | |
| hidden | No | Whether the account is hidden from the chart-of-accounts UI. | |
| deleted | No | Soft-delete flag; true hides the account from active use. | |
| journal | No | Journal number classifying the account; maps to a standard journal name (e.g. sales, purchases, general). | |
| premium | No | Whether the account is a premium-plan-only account. | |
| primary | No | Whether this is the primary account of its kind. | |
| parentid | No | Id of the parent account this nests under in the chart-of-accounts tree. | |
| defaultid | No | Numeric id of the built-in/default account this custom account maps to. | |
| baseaccount | No | Whether this is a base/system account rather than a user-created one. | |
| description | No | Free-text description of what the account is used for. |
update_assetUpdate assetAInspect
Update a fixed asset by id — its name, value, purchase date or depreciation settings.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Asset id. Required on update; omit on create. | |
| name | No | Name of the asset (e.g. "Delivery van"). | |
| notes | No | Free-text notes about the asset. | |
| amount | No | (Deprecated) legacy purchase value; the asset's cost now derives from its linked expense/transaction, so this is ignored. | |
| income | No | Id of an income record linked to this asset (e.g. proceeds from its disposal). | |
| unlink | No | (Legacy) id of a linked transaction to detach from the asset; prefer the dedicated unlink asset-transaction endpoint. | |
| expense | No | Id of the expense record that recorded the asset's purchase (its cost basis). | |
| disposed | No | Whether the asset has been disposed of (sold or retired). | |
| accountid | No | Chart-of-accounts account id categorising this asset (see list_accounts). | |
| usefullife | No | Useful life of the asset in years. | |
| transaction | No | (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. | |
| depreciation | No | Whether this asset depreciates over time. | |
| disposeddate | No | Date the asset was disposed (ISO 8601); defaults to now when :disposed is set without a date. | |
| baseaccountid | No | Chart-of-accounts account id for the asset's accumulated-depreciation / base account (see list_accounts). | |
| depreciationrate | No | Annual depreciation rate as a decimal fraction (e.g. 0.2 = 20% per year); used by the diminishing-balance method. | |
| depreciationtype | No | Depreciation method: a string containing "straight" (straight-line), "diminish" (reducing/diminishing balance), or "fifty" (50/30/20 wear-and-tear). | |
| depreciationstart | No | Date depreciation starts (ISO 8601). | |
| usedefaultdepreciation | No | Whether to use the business/category default depreciation settings instead of the values on this asset. |
TDQS
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.
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.
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.
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.
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.
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 accountInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the bank account, required for updates | |
| bank | No | Name of the bank | |
| sync | No | Whether automatic bank sync is enabled | |
| hidden | No | Whether the account is hidden/soft-deleted (removes its card; also stops sync) | |
| confirm | No | PROD-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. | |
| private | No | Whether this is a private account | |
| syncing | No | Whether sync is currently in progress | |
| archived | No | Whether the account is archived | |
| accountid | No | Linked accounting account ID | |
| swiftcode | No | SWIFT/BIC code for international transfers | |
| branchcode | No | Bank branch code or routing number | |
| accountname | No | Name of the bank account | |
| accounttype | No | Type of account (e.g., checking, savings) | |
| openingdate | No | Date of the opening balance | |
| openingrate | No | PROD-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. | |
| syncenabled | No | Whether this account is enabled for bank sync | |
| accountnumber | No | Bank account number | |
| creditaccount | No | Default credit account ID | |
| creditjournal | No | Default credit journal ID | |
| openingbalance | No | Opening balance for the account | |
| clearopeningbalance | No | PROD-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'. |
update_businessUpdate businessInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | This business's id. Optional — defaults to the authenticated token's own business; supply only to target a specific business. | |
| age | No | Age of the business (label, e.g. how long it has been trading). | |
| tag | No | Unique public vanity tag/slug for the business (used in its public page URL and for segmentation). | |
| bank | No | Bank name for the account shown on invoices. | |
| city | No | City / town. | |
| logo | No | Business logo image URL (or data URI). | |
| name | No | Trading / display name of the business. | |
| about | No | Short description / bio of the business shown on public pages. | |
| alert | No | ||
| phone | No | Business contact phone number. | |
| region | No | State / province / region. | |
| suburb | No | Suburb. | |
| address | No | Street address line 1. | |
| charity | No | Whether the business is a charity / non-profit. | |
| country | No | Country (name or code). | |
| details | No | Nested profile details. Currently carries the legal entity type and the subscription billing contact. | |
| product | No | Whether the business sells products (goods). | |
| service | No | Whether the business sells services. | |
| webhook | No | Webhook URL to notify on business events. | |
| website | No | Business website URL. | |
| address2 | No | Street address line 2. | |
| currency | No | Business base currency, ISO 4217 (e.g. "ZAR", "USD"). | |
| industry | No | Industry the business operates in. | |
| referrer | No | How the business was referred (referral source). | |
| salestax | No | Whether sales tax / VAT is enabled for the business. | |
| showbank | No | Whether to show the business's bank details on invoices. | |
| turnover | No | Annual turnover in the base currency. | |
| twitchid | No | Twitch channel id, for the Twitch / streamer integration. | |
| employees | No | Number of employees (as a label / band). | |
| sdlnumber | No | SDL (skills development levy) reference number. | |
| taxregime | No | Tax regime the business is registered under. | |
| uifnumber | No | UIF (unemployment insurance fund) reference number. | |
| vatnumber | No | VAT registration number. | |
| branchcode | No | Bank branch code shown on invoices. | |
| experience | No | Founder's business / industry experience (label). | |
| payenumber | No | PAYE (payroll income-tax) reference number. | |
| postalcode | No | Postal / ZIP code. | |
| quotenotes | No | Default notes text placed on new quotes. | |
| quotetitle | No | Default 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". | |
| accountname | No | Bank account holder name shown on invoices. | |
| accounttype | No | Bank account type (e.g. "cheque", "savings"). | |
| invoicenotes | No | Default notes text placed on new invoices. | |
| invoicetitle | No | Default heading / title used on invoices. | |
| lastreviewed | No | Date the business's books were last reviewed (ISO 8601). | |
| quotemessage | No | Default customer-facing message on new quotes. | |
| salestaxcron | No | Cron expression driving sales-tax return reminders / automation. | |
| salestaxrate | No | Default sales-tax / VAT rate as a decimal fraction (e.g. 0.15 = 15%). | |
| accountnumber | No | Bank account number shown on invoices. | |
| invoicebankid | No | Id of the bank account to display on invoices. | |
| invoiceoffset | No | Starting offset added to auto-generated invoice numbers. | |
| paymentbankid | No | Id of the bank account payments are collected into. | |
| customizations | No | JSON string of UI / branding customizations for the business. | |
| featurepreview | No | Whether the business opts into preview / beta features. | |
| invoicemessage | No | Default customer-facing message on new invoices. | |
| openingbalance | No | Opening cash / bank balance carried into the books, in the base currency. | |
| salestaxdueday | No | Day of the period on which the sales-tax return is due. | |
| salestaxnumber | No | Sales-tax / VAT registration number. | |
| incometaxnumber | No | Income-tax reference number. | |
| paymentpagelogo | No | Logo image URL shown on the hosted payment page. | |
| paymentpagename | No | Display name shown on the hosted payment page. | |
| proofofdelivery | No | Whether proof-of-delivery capture is enabled. | |
| tradesourcecode | No | SARS trade / source code classifying the business's main activity. | |
| autofxadjustment | No | When 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. | |
| salestaxschedule | No | Sales-tax filing schedule (e.g. monthly / bi-monthly). | |
| streamelementsid | No | StreamElements account id, for the StreamElements integration. | |
| vanitypageaction | No | Call-to-action mode for the business's public vanity page, e.g. "donate" or "pay". | |
| financialstartday | No | Day of the month the financial year starts (1-31). | |
| salestaxexclusive | No | Default for whether new invoice / product line items are entered VAT-exclusive (price shown ex-VAT, tax added on top) rather than inclusive. | |
| streamelementsjwt | No | StreamElements JWT credential for the integration. | |
| registrationnumber | No | Company registration number. | |
| financialstartmonth | No | Month the financial year starts (month name or number). | |
| paymentpagedisabled | No | Whether the public payment page is disabled. | |
| salestaxrecoverable | No | Whether input sales tax / VAT is recoverable for the business. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line item id. Required on update_document_item; omit on add_document_line. | |
| cost | No | Unit cost (for margin / cost-of-sales), in :costcurrency. | |
| name | No | Line item name / title. | |
| sort | No | Display order of the line within the document (ascending). | |
| unit | No | Unit label for the quantity (e.g. "hours", "kg"). | |
| price | No | Unit price (per-unit selling price) in the document currency. | |
| amount | No | Line total (unit price × quantity), usually derived from :price × :quantity. Accepts a number or a numeric string. | |
| expense | No | Pass "$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. | |
| product | No | Id of a catalog product to link this line to. | |
| variant | No | Id of a catalog product variant to link this line to. | |
| quantity | No | Number of units. Accepts a number or a numeric string. | |
| accountid | No | Per-line chart-of-accounts / expense-category id; bills split cost by category at accrual (see list_accounts). | |
| quinvoice | No | Id of the parent document (invoice, quote, bill, etc.) this line belongs to. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| description | No | Line item description. | |
| costcurrency | No | ISO 4217 currency of :cost, when it differs from the document currency. | |
| baseupdatedat | No | Optimistic-concurrency token: the line's last-known updatedat (epoch number or ISO string). A stale value is rejected; omit to skip the check. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Sales-tax line id. On update, identifies which sales-tax to change (or pass :salestaxid); omit on add. | |
| name | No | Sales-tax name (e.g. "VAT"). | |
| rate | No | Sales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected. | |
| amount | No | Fixed sales-tax amount, used instead of :rate when :useamount is true. | |
| itemid | No | Id 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. | |
| invoice | No | Alias for the parent document id (see :quinvoice). | |
| parentid | No | Id 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. | |
| exclusive | No | Whether the tax is exclusive (added on top of the line amount) rather than inclusive (already contained in it). | |
| invoiceid | No | Alias for the parent document id (see :quinvoice); takes precedence when several are supplied. | |
| quinvoice | No | Id of the parent document (invoice, quote, credit/debit note). Used to reindex the correct document; aliased by :invoice / :invoiceid. | |
| useamount | No | Use the fixed :amount instead of computing tax from :rate. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| salestaxid | No | Id of the sales-tax to update (alternative to :id). | |
| recoverable | No | Whether this input sales tax / VAT is recoverable. | |
| referencenumber | No | Sales-tax registration / reference number. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items to update; each entry must include the line `id` plus the fields to change. | |
| quinvoice | Yes | Id of the parent document (invoice, quote, bill, etc.) whose line items are being updated (required). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Document 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. | |
| date | No | Date the payment was received (ISO 8601). | |
| name | No | Label for this payment (e.g. "Deposit", "Final payment"). | |
| notes | No | Free-text notes on the payment. | |
| amount | No | Payment amount in the payment's currency. | |
| method | No | Payment method as free text (e.g. "cash", "card", "eft") — no fixed set. | |
| payment | No | Bank/ledger account id the money moved through — received into (money-in) or paid from (money-out) (see list_accounts). | |
| category | No | Income category for the payment; defaults to Sales when omitted. | |
| currency | No | ISO 4217 currency code (e.g. "ZAR", "USD"). Defaults to the business currency. | |
| responseid | No | Internal: correlation id used to return the updated entity to the frontend; omit. | |
| exchangerate | No | Manual FX rate to the business base currency; omit to use the stored/auto rate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, consistent with a non-destructive mutation, so the safety profile is covered elsewhere. The description adds the crucial id-disambiguation behavior, but says the change affects 'amount, date or account' while the schema exposes eleven optional fields, and it never states whether this is a partial update, whether omitted fields are preserved, or what permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence carrying the core scope and disambiguation, plus a short second sentence on affected fields. Very little waste, though the second sentence's partial field list is slightly under-informative for an 11-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an all-optional mutation tool with full schema coverage and no output schema, the description supplies the routing and identity information an agent most needs. Remaining gaps (partial-update semantics, FX/currency interaction with exchangerate) 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.
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 value by clarifying that the id parameter means the payment id on update (the schema text itself is ambiguous, mixing document-on-create and payment-on-update semantics). It does not otherwise enrich the remaining parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Correct a payment ALREADY recorded against a document') and pins down the identity of the target ('payment id, not the document id'). It also names the sibling it is not (record_document_payment), so 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when-to-use condition (payment already recorded, correct it) and names the alternative with its triggering condition ('to record a new payment, use record_document_payment'). No inference is required to route between the two tools.
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 salestaxInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the sales tax to update. | |
| kind | No | "salestax" | "levy" | "withholding"; "$delete" clears it. | |
| name | No | Display name of the sales tax (e.g. "VAT"). | |
| rate | No | Sales tax rate as a DECIMAL FRACTION, e.g. 0.15 = 15% (NOT 15). A rate of 1.0 (100%) or higher is rejected. | |
| order | No | Stack position (default 0); components apply ascending. | |
| amount | No | Explicit sales tax amount; used instead of the rate when useamount is true. | |
| compound | No | When true, this tax stacks on lower-order taxes' totals (default false). | |
| parentid | No | Id of one of this business's salestax definitions to move the tax to; the record then reports under that tax. | |
| exclusive | No | Whether the entity amount excludes this sales tax (tax added on top). | |
| taxsource | No | Stable locale rate-band identity, e.g. "locale:za/standard"; "$delete" clears it. | |
| treatment | No | "standard" | "zeroRated" | "exempt"; blank/unknown means infer, "$delete" clears it. | |
| useamount | No | When true, use amount as the tax figure instead of computing from the rate. | |
| recoverable | No | Whether this sales tax is recoverable (claimable as input tax). | |
| referencenumber | No | Sales tax registration/reference number. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the folder to update (required). | |
| name | No | New name for the folder; omit to leave it unchanged. | |
| parentid | No | New parent folder id to move this folder under; omit to leave it where it is. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line id (for updating an existing line). | |
| role | No | Optional 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. | |
| debit | No | Debit amount for this line (0 if this is a credit line). | |
| credit | No | Credit amount for this line (0 if this is a debit line). | |
| entryid | No | Id of the parent journal entry this line belongs to. | |
| accountid | No | Chart-of-accounts account id for this line (see list_accounts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is covered. The description adds genuine context beyond that: the update is in-place and scoped to exactly one line, and the line is addressed by id. It stops short of stating permission needs or how omitted fields behave, but with annotations present this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the core action and scope before the sibling routing. It is dense but every clause earns its place; style is slightly run-on with the mid-sentence sibling diversion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six optional parameters at full schema coverage, no output schema, and no enums means the schema carries the field-level burden. The description supplies the routing and scope information the schema cannot, leaving only minor gaps such as permission or side-effect detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented. The description only restates that account and debit/credit amounts can change and that id identifies the line, adding no syntax, format, or partial-update detail beyond the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change/update), the exact resource (one debit or credit line of an existing journal entry), and the scope constraint 'ONE ... in place'. It explicitly differentiates from two named siblings, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use save_journal_entry to rewrite the whole entry, add_journal_line to add a line, and this tool for editing a single existing line. The when-to-use and when-to-use-something-else conditions are both stated.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the message to update. | |
| text | No | New message body text. | |
| alert | No | Alert level/label. | |
| contextid | No | Id of the related entity (e.g. an expense/invoice/file id). | |
| contexttype | No | Kind of entity `contextid` refers to. | |
| notification | No | Whether this surfaces as a notification. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Tag id. Present → update that tag; omit → create a new one. | |
| name | No | Display name of the tag. | |
| color | No | Hex colour for the tag (e.g. "#8a8d82"), used for display. | |
| group | No | Free-text group the tag belongs to. On update, passing null or "" clears an existing group; omitting the key leaves it unchanged. | |
| archived | No | Whether the tag is archived. Omit on create to default to unarchived. |
TDQS
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.
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.
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.
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.
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.
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 transactionADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the transaction to update. Omit when sending items. | |
| date | No | Transaction date, YYYY-MM-DD | |
| items | No | Several 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. | |
| notes | No | Additional notes about the transaction | |
| value | No | Transaction amount in the base currency | |
| ignored | No | Whether to exclude this transaction from the ledger | |
| description | No | Description of the transaction |
TDQS
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.
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.
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.
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.
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.
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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
decide_leave_request1 field changed- added
Input schema / properties / forceAdded value: +{ + "type": "boolean" +}
- Added
delete_payrun - Added
delete_payslips - Changed
evaluate_report1 field changed- added
Input schema / properties / payrunidAdded value: +{ + "description": "A 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.", + "type": "string" +}
- Changed
evaluate_report_session1 field changed- added
Input schema / properties / payrunidAdded value: +{ + "description": "A 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.", + "type": "string" +}
- Added
finalise_payslips
8 tool updates
- Added
decide_leave_request - Added
populate_payrun - Added
save_employee - Added
save_leave_movement - Added
save_leave_request - Added
save_leave_type - Added
save_payslip - Added
save_payslip_template
1 tool update
- Changed
update_entity_salestax1 field changed- added
Input schema / properties / parentidAdded value: +{ + "description": "Id of one of this business's salestax definitions to move the tax to; the record then reports under that tax.", + "type": "string" +}
3 tool updates
- Added
cortex_profile - Added
hand_over - Changed
update_business1 field changed- added
Input schema / properties / details / properties / payrollsettingsAdded value: +{ + "additionalProperties": { + "anyOf": [ + { + "type": "array" + }, + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "null" + }, + { + "type": "number" + }, + { + "type": "object" + }, + { + "type": "string" + } + ] + }, + "description": "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.", + "type": "object" +}
16 tool updates
- Changed
create_account1 field changed- added
Input schema / properties / codeAdded value: +{ + "description": "The business's own account code (e.g. \"4000\"). Trimmed; blank means no code.", + "type": "string" +}
- Changed
create_bank_account2 fields changed- changed
Input schema / properties / clearopeningbalance / descriptionPrevious value: -"PROD-1200: when true, fully REMOVE the opening balance — retracts both openingbalance and openingdate (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'."New value: +"PROD-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'." - added
Input schema / properties / openingrateAdded value: +{ + "description": "PROD-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.", + "type": "number" +}
- Added
get_employee - Added
get_payrun - Added
get_payslip - Added
list_employees - Added
list_leave_movements - Added
list_leave_requests - Added
list_leave_types - Added
list_payrun_schedules - Added
list_payruns - Added
list_payslip_templates - Added
list_payslips - Changed
save_document2 fields changed- added
Input schema / properties / invoicebankidAdded value: +{ + "description": "PROD-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.", + "type": "string" +} - added
Input schema / properties / items / items / properties / invoicebankidAdded value: +{ + "description": "PROD-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.", + "type": "string" +}
- Changed
update_account1 field changed- added
Input schema / properties / codeAdded value: +{ + "description": "The business's own account code (e.g. \"4000\"). Trimmed; an empty string clears it; omit to leave it unchanged.", + "type": "string" +}
- Changed
update_bank_account2 fields changed- changed
Input schema / properties / clearopeningbalance / descriptionPrevious value: -"PROD-1200: when true, fully REMOVE the opening balance — retracts both openingbalance and openingdate (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'."New value: +"PROD-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'." - added
Input schema / properties / openingrateAdded value: +{ + "description": "PROD-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.", + "type": "number" +}
1 tool update
- Changed
create_bank_account1 field changed- added
Input schema / properties / currencyAdded value: +{ + "description": "ISO 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.", + "type": "string" +}
2 tool updates
- Changed
evaluate_report1 field changed- added
Input schema / properties / employeeidAdded value: +{ + "description": "A 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.", + "type": "string" +}
- Changed
evaluate_report_session1 field changed- added
Input schema / properties / employeeidAdded value: +{ + "description": "A 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.", + "type": "string" +}
3 tool updates
- Changed
add_journal_line1 field changed- added
Input schema / properties / roleAdded value: +{ + "description": "Optional 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.", + "type": "string" +}
- Changed
save_journal_entry2 fields changed- added
Input schema / properties / items / items / properties / lines / items / properties / roleAdded value: +{ + "description": "Optional 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.", + "type": "string" +} - added
Input schema / properties / lines / items / properties / roleAdded value: +{ + "description": "Optional 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.", + "type": "string" +}
- Changed
update_journal_line1 field changed- added
Input schema / properties / roleAdded value: +{ + "description": "Optional 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.", + "type": "string" +}
2 tool updates
- Changed
add_document_item_salestax1 field changed- added
Input schema / properties / parentidAdded value: +{ + "description": "Id 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.", + "type": "string" +}
- Changed
update_document_item_salestax1 field changed- added
Input schema / properties / parentidAdded value: +{ + "description": "Id 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.", + "type": "string" +}
2 tool updates
- Changed
add_document_line1 field changed- added
Input schema / properties / expenseAdded value: +{ + "description": "Pass \"$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.", + "type": "string" +}
- Changed
update_document_item1 field changed- added
Input schema / properties / expenseAdded value: +{ + "description": "Pass \"$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.", + "type": "string" +}
3 tool updates
- Changed
add_document_line2 fields changed- changed
Input schema / properties / expenseid / descriptionPrevious value: -"Rebill this expense onto a sales invoice. The line's name, amount and tax come from the expense: a VAT-registered business bills the net amount plus its own output VAT; otherwise the gross amount, untaxed. An expense already on a live invoice is refused."New value: +"Recover 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." - removed
Input schema / properties / markuppercentRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - } - ], - "description": "Markup on a rebilled expense, as a percentage of its base (10 = 10%). Only read with expenseid." -}
- Added
get_action_usage - Added
propose_bill_matches
7 tool updates
- Changed
create_income_expenses_bulk1 field changed- added
Input schema / properties / expenses / items / properties / totalAdded value: +{ + "description": "Total 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.", + "type": "number" +}
- Added
get_help_article - Changed
save_expense2 fields changed- changed
Input schema / properties / items / items / properties / total / descriptionPrevious value: -"Total amount including quantity; overrides amount×quantity if set."New value: +"Total 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." - changed
Input schema / properties / total / descriptionPrevious value: -"Total amount including quantity; overrides amount×quantity if set."New value: +"Total 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."
- Added
search_help_articles - Changed
send_document2 fields changed- added
Input schema / properties / includereceiptsAdded value: +{ + "description": "Attach the receipts of expenses rebilled on this document's lines. Off by default; receipts that do not fit are sent as download links.", + "type": "boolean" +} - added
Input schema / properties / receiptfileidsAdded value: +{ + "description": "With includereceipts, send only these receipts (file ids, or the expense id for a legacy receipt). Omit for all; an empty list sends none.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
settle_bills1 field changed- added
Input schema / properties / pairs / items / properties / fxadjustmentAdded value: +{ + "description": "Confirms a proposed FX gain/loss line (:transaction case). A bank payment in another currency from a base-currency bill, worth within 3% of the outstanding at the payment date's rate, comes back \"proposed\" with the FX line and writes nothing. Re-send the pair with fxadjustment = that proposal's amount, only after the user confirms, to settle the bill and post the difference to the Foreign Exchange account.", + "type": "number" +}
- Changed
update_business1 field changed- added
Input schema / properties / autofxadjustmentAdded value: +{ + "description": "When 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.", + "type": "boolean" +}
1 tool update
- Changed
record_document_payment1 field changed- added
Input schema / properties / transactionidAdded value: +{ + "description": "Bank 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.", + "type": "string" +}
11 tool updates
- Changed
add_document_line2 fields changed- added
Input schema / properties / expenseidAdded value: +{ + "description": "Rebill this expense onto a sales invoice. The line's name, amount and tax come from the expense: a VAT-registered business bills the net amount plus its own output VAT; otherwise the gross amount, untaxed. An expense already on a live invoice is refused.", + "type": "string" +} - added
Input schema / properties / markuppercentAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + } + ], + "description": "Markup on a rebilled expense, as a percentage of its base (10 = 10%). Only read with expenseid." +}
- Changed
delete_client3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Client id of the client to delete."New value: +"One client id to delete." - added
Input schema / properties / idsAdded value: +{ + "description": "Up 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.", + "items": { + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[]
- Removed
delete_clients_bulk - Changed
delete_product3 fields changed- added
Input schema / properties / id / descriptionAdded value: +"One product id to delete." - added
Input schema / properties / idsAdded value: +{ + "description": "Up to 1000 product ids to delete in one transaction. Partial success: ids this business does not own are skipped and listed in errors.", + "items": { + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[]
- Changed
delete_supplier3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Supplier id of the supplier to delete."New value: +"One supplier id to delete." - added
Input schema / properties / idsAdded value: +{ + "description": "Up 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.", + "items": { + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[]
- Removed
delete_suppliers_bulk - Changed
mark_message_read3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Id of the message."New value: +"One message id to mark read." - added
Input schema / properties / idsAdded value: +{ + "description": "Up to 1000 message ids to mark read in one transaction. Partial success: ids this business does not own are skipped and listed in errors.", + "items": { + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[]
- Removed
mark_messages_read_bulk - Removed
match_transaction - Changed
update_transaction10 fields changed- removed
Input schema / properties / basecurrencyRemoved value: -{ - "description": "The base currency of the business", - "type": "string" -} - removed
Input schema / properties / creditjournalRemoved value: -{ - "description": "ID of the account to credit", - "type": "string" -} - changed
Input schema / properties / date / descriptionPrevious value: -"Transaction date"New value: +"Transaction date, YYYY-MM-DD" - added
Input schema / properties / date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - removed
Input schema / properties / debitjournalRemoved value: -{ - "description": "ID of the account to debit", - "type": "string" -} - removed
Input schema / properties / exchangerateRemoved value: -{ - "description": "Exchange rate if transaction currency differs from base currency", - "type": "number" -} - changed
Input schema / properties / id / descriptionPrevious value: -"ID of the transaction, only required for updates"New value: +"ID of the transaction to update. Omit when sending items." - changed
Input schema / properties / ignored / descriptionPrevious value: -"Whether to ignore this transaction in reports"New value: +"Whether to exclude this transaction from the ledger" - added
Input schema / properties / itemsAdded value: +{ + "description": "Several 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.", + "items": { + "properties": { + "date": { + "description": "Transaction date, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "description": { + "description": "Description of the transaction", + "type": "string" + }, + "id": { + "type": "string" + }, + "ignored": { + "description": "Whether to exclude this transaction from the ledger", + "type": "boolean" + }, + "notes": { + "description": "Additional notes about the transaction", + "type": "string" + }, + "value": { + "description": "Transaction amount in the base currency", + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - removed
Input schema / properties / transactioncurrencyRemoved value: -{ - "description": "The currency of the transaction if different from base currency", - "type": "string" -}
- Removed
update_transactions_bulk
3 tool updates
- Added
convert_currency - Changed
match_transaction1 field changed- added
Input schema / properties / currencyAdded value: +{ + "description": "The entry's ISO currency (e.g. ZAR). When given, a candidate in another currency is converted at its own date's rate and kept only within 3% of the amount; such a match is capped below 0.9, carries requires_confirmation=true and the FX gain/loss proposal. Omit for same-currency matching.", + "type": "string" +}
- Changed
settle_bills1 field changed- added
Input schema / properties / pairs / items / properties / bankchargeAdded value: +{ + "description": "Confirms a proposed bank-charges line (:transaction case). A payment above the bill by at most 3% of its outstanding comes back \"proposed\" with the fee and writes nothing. Re-send the pair with bankcharge = that proposal's amount, only after the user confirms, to settle the bill and post the fee to Bank Charges.", + "type": "number" +}
1 tool update
- Changed
settle_bills1 field changed- changed
Input schema / properties / pairs / items / properties / transaction / descriptionPrevious value: -"A bank transaction id to settle the bill from — a new expense is created linking the transaction to the bill. Provide this OR :expense, not both."New value: +"A bank transaction id to settle the bill from. A bank-feed transaction's own unallocated expense is re-pointed at the bill; an unlinked transaction gets a new expense linking it to the bill. Provide this OR :expense, not both."
2 tool updates
- Changed
save_client4 fields changed- changed
Input schema / properties / archived / descriptionPrevious value: -"Whether this client is archived (hidden from active lists)."New value: +"Whether 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." - added
Input schema / properties / clearopeningbalanceAdded value: +{ + "description": "Reserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked.", + "type": "boolean" +} - added
Input schema / properties / confirmAdded value: +{ + "description": "PROD-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.", + "type": "boolean" +} - changed
Input schema / properties / items / items / properties / archived / descriptionPrevious value: -"Whether this client is archived (hidden from active lists)."New value: +"Whether 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."
- Changed
save_supplier2 fields changed- added
Input schema / properties / clearopeningbalanceAdded value: +{ + "description": "Reserved, mirrors update_bank_account: when true the opening-date confirmation below is not asked.", + "type": "boolean" +} - added
Input schema / properties / confirmAdded value: +{ + "description": "PROD-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.", + "type": "boolean" +}
Publisher details
- Operator
- stub · Publisher source
- Operator website
- https://stub.africa/ · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://stub.africa/guide/set-up-mcp · Publisher source
- Trust center
- https://stub.africa/resources/privacy-policy · 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
AI agents for bookkeeping, reconciliation, and financial close for SMBs.
AI bookkeeper for Swiss small companies: books invoices, reconciles the bank, keeps VAT current.
AI-powered bookkeeping and tax filing for entrepreneurs at the heart of the European economy.
Open-source AI accounting skills verified by licensed accountants (tax, VAT, payroll).
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceTurn any receipt into structured, accounting-ready JSON or clean Markdown with one API call. AI-powered vision extracts merchant, date, line items, tax, totals, and suggests GL accounts for instant bookkeeping. 50 free credits on signup.MIT
- AlicenseAqualityBmaintenanceAI agents that automate bookkeeping, bank reconciliation, and month-end financial close for SMBs and CA firms.261MIT
- FlicenseNot gradedqualityCmaintenanceFinancial 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.-
- AlicenseCqualityCmaintenanceFree, open-source (MIT), local-first Swiss accounting MCP server: an AI agent posts double-entry journal entries, categorises and chases invoices, and prepares the MWST-Abrechnung (the Swiss VAT return), with a minimalist Studio for human oversight. Posted entries are append-only and immutable, corrections are reversing entries, and every query is tenant-scoped.50031 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.