stub
Server Details
stub
Super simple AI Native accounting platform
dext equivalent
- Status
- Healthy
- Uptime
- 64.7% over 41 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 123 tools
Many tools have overlapping purposes differentiated only by arity or bulk vs single (e.g., add_entity_salestax, add_entity_salestaxes, add_salestax_to_entities, update_entity_salestax; match_transaction vs match_transactions vs match_suppliers). The sheer number of near-duplicate save_* and update_* tools makes selection error-prone despite clear individual descriptions.
Most tools follow a clear verb_noun pattern (list_*, save_*, update_*, delete_*) with consistent plural/singular usage. Minor deviations like add_salestax_to_entities (verb after noun) and mixing save_client (create+update) with create_* tools prevent a perfect score.
123 tools is an extreme count for any MCP server, far beyond typical scope. Even a comprehensive accounting system would be better served by fewer, more composable tools rather than this many specialized ones.
The surface covers the major domains well: documents, expenses/income, journal entries, bank transactions, reconciliation, reporting, files, tags, messages, and business profile. Minor gaps like no explicit list_messages or delete_account exist, but they are workable around via existing tools.
Available Tools
123 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). | |
| 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?
No contradiction with annotations (readOnlyHint=false, destructiveHint=false). The description conveys a write operation but does not disclose side effects such as reindexing or total recalculation, which are mentioned only in parameter descriptions. The behavior is generally expected for an 'add' 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 two sentences, concise and well-structured. It front-loads the core action and target, then adds the pairing note. No unnecessary detail or 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?
The description provides enough context for the core add scenario, including document types and item identification. It does not explain output (no output schema), which is acceptable. The parameter descriptions fill in most contextual gaps. Minor omission: the description does not mention that the tool can also update via providing an id, but that is covered in the parameter semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 14 parameters have detailed descriptions, including aliases, precedence rules, decimal-fraction rate clarification, and internal use. The schema description coverage is 100%, and the parameter docs add significant guidance beyond names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (add a sales-tax/VAT line), the target (a single line item on a document), and the document types. It also mentions the pairing with the update tool, providing a 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?
The description names the sibling update tool, but does not explicitly distinguish when to use this tool versus other sales-tax tools like add_entity_salestax. It implies document-item scope but lacks an explicit 'use this when' or 'don't use that' statement.
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 a line item to a document (invoice, quote, bill, etc.).
| 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. | |
| 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?
The annotations already indicate readOnly=false and destructive=false, and the description confirms this is a mutating 'Add' operation. However, the description does not disclose additional behavioral traits such as optimistic-concurrency behavior, validation rules, or whether a parent document must already exist.
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 with no filler. It includes useful examples of document types in parentheses, making it concise and scannable.
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 is minimal and relies heavily on the input schema for context. It does not mention key operational constraints—such as the need for a parent quinvoice, how line totals are derived, or interaction with tax/cost fields—so despite the rich schema, the high-level description leaves some 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 input schema has 100% coverage with detailed per-parameter descriptions, so the baseline is 3. The main description does not add extra meaning to the parameters; it only labels the operation generically, while the schema carries the semantic weight.
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: adding a line item to a document, with explicit document types (invoice, quote, bill). The verb 'Add' and the resource 'line item' are specific enough to distinguish this from update or delete operations.
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—it says 'Add' and targets line items—but it does not explicitly contrast with sibling tools like update_document_item or delete_document_line. The parameter description for 'id' mentions 'Required on update_document_item; omit on add_document_line,' which provides indirect guidance but not a full when-to-use statement.
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 a line (a debit or credit against one account) to an existing journal entry. Pairs with update_journal_line. To create a whole new entry use save_journal_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line id (for updating an existing line). | |
| 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 indicate readOnlyHint=false and destructiveHint=false. The description only says 'Add', which is implicit from the tool name and annotations. It does not disclose additional behavior such as validation of the parent entry, effect on totals, or failure modes. No extra transparency 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 two concise sentences, front-loading the core purpose and immediately providing sibling context. 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 simple mutation with 5 clear parameters, the description provides enough to understand the operation. However, it omits any mention of parameter requirements (all are listed optional in schema) and does not explain return behavior or error conditions. Adequate but not fully 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 cover each parameter with 100% coverage, so the description adds little. It does not clarify that entryid, accountid, and one of debit/credit are logically required even though the schema lists no required parameters. This is a minor gap but not severe given the 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?
States a specific action ('Add a line') on a specific resource ('existing journal entry') and clearly distinguishes from sibling tools by naming update_journal_line and save_journal_entry. The purpose 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?
Explicitly tells when to use this tool versus update_journal_line (pairs with) and save_journal_entry (for whole new entry). It does not cover other potential alternatives or prerequisites, but the given guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
create_accountCreate accountAInspect
Create a new chart-of-accounts ledger account (an income, expense, asset, liability or equity account used to categorise transactions). Not a bank account — for that use create_bank_account.
| Name | Required | Description | Default |
|---|---|---|---|
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=false, and the description's 'create' action aligns with these. The description also clarifies the nature of the account (ledger vs bank), which helps set expectations. No contradictions or hidden side effects are described, which is appropriate given the simple create 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 two sentences, front-loaded with the core purpose and immediately providing the key differentiation from a bank account. There is no redundant text or unnecessary detail—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?
The description provides sufficient context for a create operation: what it creates, what it is not, and where to go for the alternative. Since there is no output schema and the input schema is fully documented, no further context is needed at the tool level.
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 the 14 parameters with descriptive text, including examples (e.g., role: 'tax', 'taxprovision', 'salestax') and explanations of nested relationships (parentid, defaultid). Since schema coverage is high, the baseline is 3, but the parameter descriptions are detailed and add practical meaning, justifying a 4.
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: 'Create a new chart-of-accounts ledger account' and distinguishes it from a bank account. The verb 'create' and resource 'account' are explicit, and the clarification about it not being a bank account removes 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 explicitly says 'Not a bank account — for that use create_bank_account,' which directly guides the user away from misuse and points to the correct sibling tool. It does not explicitly mention when to use this tool over update_account, but the creation context is clear enough for a write operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assetCreate assetAInspect
Create a new fixed asset — an item of equipment, property or similar that the business owns and depreciates over time. Use when recording a capital purchase you want to depreciate over its useful life rather than expensing outright; link it to the originating purchase via :expense (see list_expenses) so its cost basis flows from the ledger. To amend an existing asset use update_asset; to remove one use delete_asset.
| 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 accountAInspect
Create a new bank account for the business (a real account money moves through — used for reconciliation and cashflow). Not a chart-of-accounts ledger account.
| 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 | |
| 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 both openingbalance and openingdate (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutation (readOnlyHint=false) and not destructive (destructiveHint=false). The description adds the semantic distinction of being a real money-movement account, but does not disclose any additional behavioral traits such as side effects, reversibility, or required fields for a successful creation. Given the annotations cover the safety profile, the description adds modest value but could have mentioned that creation is a write operation that persists an account.
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-crafted sentence that front-loads the core purpose ('Create a new bank account for the business') and immediately follows with the critical distinction ('Not a chart-of-accounts ledger account'). Every word earns its place, with no fluff or repetition. Excellent conciseness.
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 20 parameters and no output schema, the description provides minimal guidance on how to use the tool effectively. It doesn't outline typical creation flows, which fields are commonly required (even though none are marked required), or what the response contains. The schema descriptions are thorough, but the overall context for an agent—such as whether openingbalance is needed for reconciliation or how confirm interacts—is missing. The description could have summarized typical usage or mentioned that it returns the created account details. It is adequate but not complete for such a complex 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 schema already documents all 20 parameters in detail. The description does not add any parameter-specific meaning beyond the schema. Per the rubric, the baseline is 3 when the schema carries the load; the description adds nothing extra here, so a 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 verb (create) and the resource (bank account), and immediately distinguishes it from a chart-of-accounts ledger account, which is a key differentiator from the sibling tool create_account. This gives an agent precise understanding of what the tool does and what it is not.
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 notes 'Not a chart-of-accounts ledger account,' which steers the agent away from using this for ledger entries. It does not explicitly mention when to use this versus update_bank_account, but the verb 'create' makes that obvious. The context of reconciliation and cashflow also gives a usage signal. Slightly more explicit guidance on when to use it instead of other create tools would push it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderCreate folderAInspect
Create a new folder for organising the business's uploaded files and documents. To rename or re-parent an existing folder use update_folder instead.
| 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?
The description discloses important behavioral traits beyond the annotations: it is all-or-nothing (atomic), top-level transactionid links all records while per-item overrides, expense accountid can record a payment against a purchase document, and it returns the new ids. This adds substantial operational context not available 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, using four sentences to cover the core purpose, usage guidance, key behavioral details, and return value. It is front-loaded with the primary purpose and avoids unnecessary fluff or 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?
Given the tool's complexity (nested income and expenses arrays with numerous fields) and the absence of an output schema, the description provides only high-level guidance. It covers atomicity, reconciliation, and payment behavior, but does not address many parameters like currency, amount, or supplier behavior, leaving gaps for an agent to infer from 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 description explains the top-level transactionid behavior and the special meaning of expense accountid, but does not elaborate on the income and expenses arrays or other parameters. Since the schema has 0% description coverage for the top-level parameters, the description only partially compensates; many parameters remain unexplained beyond their schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's primary function: creating many income and expense records in one transaction. It explicitly distinguishes this tool from its siblings by stating 'prefer this over repeated save_income / save_expense calls', making the unique 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 provides explicit guidance on when to use this tool ('prefer this over repeated save_income / save_expense calls') and when not to ('per-item salestax is not supported (use save_expense)'). This gives clear usage boundaries and alternative recommendations.
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.
delete_clientDelete clientADestructiveIdempotentInspect
Delete a customer by id (soft-delete to bin). By default refuses when the client still has linked (non-deleted) quotes/invoices — matching delete_clients_bulk — so linked documents aren't orphaned. Pass force:true to override, or archive via update_client.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Client id of the client to delete. | |
| 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?
Beyond the annotations (destructiveHint, readOnlyHint, idempotentHint), the description adds critical behavior: soft-delete semantics, the default refusal due to linked documents, the force override, and the exact effect (moving to bin). This fully discloses side effects and conditions, exceeding what annotations alone 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 well-structured and information-dense, but it is slightly longer than strictly necessary, repeating the phrase 'linked (non-deleted) quotes/invoices' and 'so linked documents aren't orphaned' twice. Still, every sentence carries meaningful information, and the structure is 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?
Given there is no output schema, the description adequately covers what the agent needs to know: the action, default behavior, override condition, and an alternative. It lacks only an explicit note about return behavior (e.g., success response), but this is not critical given the tool's simplicity and the sibling 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 schema already covers both parameters (id and force) with descriptions, so coverage is 100%. The description adds context by explaining the force parameter's purpose and the default behavior, though it does not introduce new parameter-specific details beyond what the schema provides. The added context justifies a score above the baseline of 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?
The description states a specific verb and resource ('Delete a customer by id'), clarifies it is a soft-delete to bin, and explicitly distinguishes itself from delete_clients_bulk by noting matching behavior. This makes the tool's purpose unambiguous and differentiates it from the sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool (default behavior), when to override with force:true, and when to use an alternative (update_client for archiving). It also explains the consequence of the default refusal (preventing orphaned documents), giving the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_clients_bulkDelete clients bulkADestructiveIdempotentInspect
Delete multiple customers in one transaction (soft-delete to bin). All-or-nothing: the whole request fails if any id is unknown or any customer still has linked (non-deleted) invoices. Body: {clients: [{id} ...]}. For a single customer use delete_client.
| Name | Required | Description | Default |
|---|---|---|---|
| clients | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true and idempotentHint=true, so the description adds crucial nuance beyond those flags: soft-delete to bin (reversible deletion), transactional all-or-nothing semantics, and two precise failure prerequisites (unknown ids, linked non-deleted invoices). This is exactly the behavioral context annotations cannot express, particularly the distinction between a soft-delete and a permanent delete.
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 with zero filler: the core operation and soft-delete behavior are front-loaded, followed by failure semantics, then body format and the alternative tool. Every sentence earns its place by adding information neither the schema nor the annotations contain.
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 bulk operation with annotations covering the safety profile, the description covers the operation, transactionality, failure modes, body shape, and the alternative tool. There is no output schema so the success response is unspecified, and the interaction between idempotentHint and retrying an already-binned client is left unresolved — minor gaps in an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It shows the exact body shape '{clients: [{id} ...]}' and clarifies that the single parameter is a list of customer IDs. It could add detail on id format or duplicate handling, but the structure is sufficiently specified for a correct call.
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: 'Delete multiple customers in one transaction,' which clearly differentiates it from the single-customer sibling delete_client. Adding 'soft-delete to bin' further specifies the operation's nature and scope. An agent can immediately identify what this tool does and how it differs from nearby alternatives.
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 routes to the alternative: 'For a single customer use delete_client.' It also provides strong when-not-to-use guidance via the all-or-nothing failure conditions — the request fails if any id is unknown or any customer has linked non-deleted invoices — telling the agent which scenarios make this tool unsuitable. The resource term 'customers' also cleanly separates it from delete_suppliers_bulk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentDelete documentADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond annotations: it explains that the document and its settling payments are moved to the bin together, that list_binned shows them, and that restore_deleted brings them back. This enriches the destructiveHint and idempotentHint annotations with concrete outcomes and recovery steps.
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. It front-loads the action and scope, then provides critical behavioral details (reversibility and bin) 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?
The description fully covers what an agent needs to know to call this tool: the effect (delete and move to bin), the associated payments, and how to reverse it. With no output schema, no return value explanation is needed, and the behavioral details are complete for safe 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?
With 0% schema description coverage, the description must compensate. It mentions 'by id' but does not elaborate on the id format, source, or any constraints. Since the only parameter is a required string id, the description adds minimal meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Delete a document' and specifies the resource types (invoice, quote, credit note, etc.), distinguishing it from sibling delete tools like delete_document_line and delete_expense. The verb+resource structure 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?
The description gives clear context on when to use this tool by noting reversibility and the bin system, implicitly guiding an agent that deletion is not permanent and can be undone via restore_deleted. It does not explicitly list exclusions or alternative tools, but the context 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.
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_productDelete productADestructiveIdempotentInspect
Permanently delete a product by id. Document lines that used the product keep their own copies of name/price. To remove one product from a catalogue call this per id; there is no bulk variant yet.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond annotations: permanence, and that document lines retain copies of name/price. This reassures about side effects. 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?
Three sentences, each adding distinct value: the action, the dependency behavior, and the absence of a bulk option. Information is front-loaded with the primary 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 one-parameter destructive tool, the description covers all necessary details: permanence, effect on dependent data, and no bulk alternative. No output schema exists, so no return info 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 only parameter, id, is referenced as 'by id' in the description, which clarifies its role. Schema coverage is 0%, but the description adequately compensates for a single simple parameter.
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 resource (product by id). The mention of no bulk variant distinguishes it from sibling bulk-delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: to delete a single product by id, and notes the absence of a bulk variant, preventing search for a non-existent sibling.
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 a supplier by id (soft-delete to bin). By default refuses when the supplier still has linked (non-deleted) bills/expenses — matching delete_suppliers_bulk — so linked expenses aren't orphaned. Pass force:true to override, or archive via save_supplier.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Supplier id of the supplier to delete. | |
| 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?
The annotations already mark the tool as destructive and idempotent, and the description adds important behavioral details: soft-delete to bin, refusal when non-deleted links exist, and force override semantics. This gives the agent a clear picture of side effects beyond the annotation 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 concise and front-loaded, with the main action stated first and behavior details efficiently packed into two sentences. No redundant or filler content 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?
Given the moderate complexity of a delete operation, the description provides sufficient context: default behavior, override, soft-delete destination, and the archive alternative. The lack of an output schema is not a gap because the operation's expected side effects are clearly described.
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 both parameters fully, so the baseline is high. The description adds meaningful context beyond the schema, especially for force, explaining the default false behavior and the reason linked expenses aren't orphaned, which helps the agent choose the correct 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 the action: delete a supplier by id with soft-delete behavior. It also distinguishes this tool from the bulk delete and save/archive alternatives by naming delete_suppliers_bulk and save_supplier explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool versus alternatives, referencing the bulk counterpart and the archive via save_supplier. It also clarifies the default refusal behavior with linked bills/expenses and how to override it with force:true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_suppliers_bulkDelete suppliers bulkADestructiveIdempotentInspect
Delete multiple suppliers in one transaction (soft-delete to bin). All-or-nothing: the whole request fails if any id is unknown or any supplier still has linked expenses. Body: {suppliers: [{id} ...]}. For a single supplier use delete_supplier.
| Name | Required | Description | Default |
|---|---|---|---|
| suppliers | Yes | Suppliers to delete; each item requires :id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and idempotent. The description goes further by disclosing that deletion is a soft-delete to bin, that the operation is transactional and all-or-nothing, and exactly which conditions trigger failure. This is rich behavioral context beyond the annotations with no 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?
Three sentences with zero filler. The core purpose and semantics are front-loaded, the body format follows, and the sibling alternative is given last. 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 one-parameter destructive operation with no output schema, the description covers all necessary behavioral aspects: soft-delete, transaction semantics, failure conditions, body shape, and the single-supplier alternative. An agent can invoke this tool correctly without needing additional 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 input schema has 100% coverage: the 'suppliers' array and each item's required 'id' are fully documented. The description's 'Body: {suppliers: [{id} ...]}' essentially restates the schema structure without adding new semantic detail. 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?
The description states a specific verb and resource ('Delete multiple suppliers') and the scope ('in one transaction'). It also explicitly differentiates from the single-supplier sibling: 'For a single supplier use delete_supplier.' 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 clearly says when to use this tool versus delete_supplier, naming the alternative and the condition that selects it. It also states important usage constraints: all-or-nothing behavior, failure on unknown IDs, and failure when linked expenses exist. This leaves no 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_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 reportARead-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. | |
| 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 | ||
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds valuable behavioral context: snapshot evaluation is immutable, live evaluation reads current books, and constants coercion behavior is disclosed ('Undeclared here, coercion would strip them and the formula would silently evaluate with 0'). This goes beyond what annotations provide, though it doesn't enumerate every possible side-effect (none expected for a read).
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 well-organized: it leads with the primary purpose, then breaks down templates vs. views, then addresses snapshot vs. live. Every sentence contributes useful information, and the examples are concise. It is long, but the complexity (16 parameters, two modes) justifies the length. There is no redundancy or 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?
Given the tool's complexity (16 parameters, no required fields, no output schema), the description covers most essential aspects: it explains both evaluation modes, the snapshot behavior, and gives concrete examples of what several views return. It also hints at the output's downstream use ('feeds stub-web's screens render'). However, it does not specify the exact response structure or error conditions, which would be needed for a fully self-contained definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so most parameters are documented in the schema. The description adds semantic value beyond the schema: it explains the meaning of `view` values with concrete output examples (payables returns every outstanding bill...), clarifies the `source` format, and details the `snapshotid` behavior. It also provides context for `constants` and `mode` that enriches the bare schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement of what the tool does: 'Resolve a report template OR an insight view against a period.' It explicitly distinguishes two modes (template vs. view) and further differentiates frozen vs. live evaluation, with concrete examples for both. This is far more specific than the tool name and leaves no ambiguity about the tool's core function.
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 strong usage context: it explains when to use a template (statutory or stored) vs. a view, and the frozen vs. live distinction with snapshotid. It also notes the mutual exclusivity of `view` and `template`/`source` ('Provide this OR a template, not both'). However, it does not explicitly contrast with sibling tools like evaluate_report_batch or evaluate_report_session, so the guidance stops short of naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 sessionARead-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 | ||
| 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. | |
| templateid | No | ||
| periodStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavior beyond that: it operates on the cached dataset, runs in tens of milliseconds, and is limited to live books. This discloses the mechanism and a key limitation without contradicting the read-only 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 carry a dense but well-organized amount of information. The core behavior and performance distinction are front-loaded, and the second sentence covers interactive use and the frozen-period alternative. There is 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 15-parameter tool with no output schema, the description covers purpose, speed, and usage boundaries well. However, it never explains how the report session is identified—there is no session parameter in the schema—and periodEnd is marked Required in its parameter description while the schema says required: []. These gaps could confuse an agent deciding how to invoke 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?
Schema coverage is 73% and most parameters already have meaningful descriptions, so the description does not need to re-explain them. It adds context that template/source and view are alternatives and that evaluation uses cached data, but it does not fill gaps for undocumented parameters like version, constants, templateid, and periodStart. 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 action and resource: evaluating a template or insight view against a period from the report session's cached dataset. It also distinguishes itself from /report/evaluate by noting identical answers but much faster execution. An agent can clearly understand what this tool does and how it differs from its sibling evaluate_report.
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 this is for interactive use cases such as period slides, template/view switches, and constant tweaks. It also gives a clear exclusion: frozen periods should use /report/evaluate with snapshotid. This names the alternative and the condition for choosing it, 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.
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 via settle_bills for bills or record_document_payment for invoices; the adjusting line is for the user to confirm). 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?
Although the annotation readOnlyHint=true already indicates the tool does not modify data, the description adds critical behavioral context beyond that: it explicitly states 'READ-ONLY: it suggests a match and the adjusting line, never records either' and explains the implications of cross-currency matches (requires_confirmation=true, FX gain/loss handling). This provides valuable transparency that helps the agent understand side effects and constraints, going 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 comprehensive but somewhat long. It front-loads the key purpose and criteria, then provides detailed output structure and behavioral notes. While every sentence adds value, the description could be tightened by removing minor redundancies (e.g., repeating the read-only theme). However, it is well-structured and not wordy enough to be penalized heavily.
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 (returns candidates, best match, proposal, handles FX, requires confirmation), the description is remarkably complete. It explains the output structure, confidence thresholds, the proposal types, and the conditions for each. It also covers edge cases (indeterminate FX rate) and example usage. The agent has all necessary information to call and interpret results correctly, and the absence of an output schema is compensated by the description's detailed return format.
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 parameter documentid with 100% coverage. The description reinforces the format (cont-… or inv-…) and explains what the id represents (invoice/bill/purchase document). While it doesn't add entirely new information beyond the schema, it contextualizes the parameter within the tool's logic, adding slight value over the schema alone.
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 surface candidate bank transactions that could settle an outstanding or overdue invoice or bill. It specifies the exact criteria (OPEN transactions within ±7 days, amount matches outstanding balance) and distinguishes it from related tools like settle_bills and record_document_payment, making it 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 provides explicit guidance on when to use this tool: 'Run this whenever you report an overdue/outstanding invoice or bill so the likely payment is offered alongside it.' It also states what the tool is not for (it is read-only and does not record matches, implying use of settle_bills for bills or record_document_payment for invoices) and gives the required input format (document id). This effectively differentiates it from alternatives.
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 via settle_bills for bills or record_document_payment for invoices).
| 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?
Beyond the readOnlyHint annotation, the description reveals key behaviors: the call never records matches, it is capped at limit with default 50 and hard max 200, it reports truncated and matched counts, it silently drops foreign/missing ids, and filter fields are ignored when documentids is given. This is rich, useful behavioral disclosure and is consistent with 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 long but appropriately structured: purpose, selection modes, limits/truncation, return shape, and side-effect disclaimer each earn their place. For a complex tool with 10 optional parameters and no output schema, the density is justified and the core purpose 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?
With no output schema, the description supplies the full return envelope including results, count, matched, truncated, and limit, as well as the paging/narrowing behavior. It also clarifies the read-only nature and names sibling settlement tools, so an agent has everything needed to invoke it correctly and safely.
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 meaningful semantic context by framing documentids vs the list_documents filter set as alternative selection modes and by providing a concrete example combination like type=bill + unpaid + status=overdue. This goes slightly beyond the schema's individual 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 opens with 'BULK / multi-document version of find_candidate_transactions' and explicitly states it returns each document with candidate settling bank transactions and best match in one read-only call. This clearly names a specific verb, resource, and scope, and distinguishes it from the single-document sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly says when to use the tool: for many outstanding documents or a large AP/AR backlog where one call replaces one round-trip per bill. It also explains the two selection modes and explicitly routes settlement actions to settle_bills or record_document_payment, making the boundary with alternatives obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_profile_statusGet bank profile 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 documentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already in annotations, the description adds value by detailing what the returned document includes (totals, status, line items, contact, money direction) and clarifying the range of accepted ids across document types. This goes beyond the annotation and helps set expectations for the response content.
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 wasted words. The core action and returned fields are front-loaded in the first sentence, and the second sentence clarifies the input scope 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 single-parameter read tool with no output schema, the description discloses the key return fields and the full range of acceptable ids. It does not mention error cases or auth, but these are not critical for correct invocation given the read-only annotation and simple input.
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 only describes the id as 'Document id', while the description adds meaningful semantics: it accepts any business-owned document id, including invoice, quote, and credit-note ids from list_documents and list_invoices. This is useful guidance beyond the 100% 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 states a specific verb and resource ('Get one document by id'), lists the returned fields (totals, status, line items, contact, money direction), and distinguishes itself from list_documents/list_invoices by clarifying it accepts the ids those tools return.
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 context on the accepted scope ('any document id this business owns') and points to list_documents and list_invoices as sources of valid ids, which implicitly signals when to use this tool. However, it does not explicitly state when to prefer alternatives over get_document, such as using list_documents for bulk retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_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_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 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?
The readOnlyHint annotation indicates no side effects, and the description does not contradict that. No additional behavioral details, such as return shape or error behavior, are disclosed, but none are strictly required given the simple read-only nature.
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 and includes useful sibling guidance, but the phrase 'stub subscription' and 'pay stub for' is awkward and reduces clarity. The wording could be tightened without adding length.
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 conveys the tool's main purpose and mentions related tools, which is helpful given there is no output schema. However, it does not clarify what the returned subscription data would include or what 'stub' means in this 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 no parameters, so there is nothing for the description to clarify. Per the baseline for zero-parameter tools, this is adequate.
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 subscription/billing line items for the business. It also distinguishes it from related profile and financial-summary tools, though the repeated use of 'stub' makes the wording somewhat confusing.
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 directs users to get_business_profile for profile data and get_financial_summary for trading financials, providing useful when-not-to-use guidance. It only implies when to use this tool, but the purpose statement makes that reasonably clear.
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.
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 mappingsARead-onlyInspect
The chart-of-accounts category-to-account mapping. For the accounts themselves (with balances) use list_accounts.
| 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 the safety profile is covered. The description adds useful behavioral context by clarifying that this tool returns mappings rather than account balances, which is not evident from 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?
Two short sentences with no filler. The core definition comes first, and the sibling distinction is provided in the second sentence. 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 zero-parameter, read-only list tool with no output schema, this description is complete. It tells the agent what is returned and how to get the alternative resource, leaving no important 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 parameter semantics are not a concern. The baseline for zero-parameter tools is 4, and the description adds no irrelevant parameter information.
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 identifies the resource precisely ('chart-of-accounts category-to-account mapping') and explicitly distinguishes it from list_accounts. It lacks an explicit verb in the body, but the tool name supplies 'list', so the purpose 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?
The description names the sibling tool list_accounts and states the condition for choosing it instead ('accounts themselves (with balances)'). This gives the agent 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.
list_accountsList accountsARead-onlyInspect
The full chart of accounts including linked bank accounts (names and balances). For the category-to-account mapping instead use list_account_mappings.
| 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?
The readOnlyHint annotation already covers the safety profile, so the description doesn't need to repeat that. It adds scope details (full chart, linked bank accounts, names and balances) but does not disclose additional behavioral traits such as authentication needs, rate limits, or pagination behavior beyond what the schema already documents.
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 tool's purpose and followed by a targeted alternative. Every sentence earns its place and there is no repetition of schema or annotation 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 a fully documented schema, the description is complete: it defines the scope, notes included data, and routes to the relevant sibling. Nothing needed to call the 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 every parameter is already described in the input schema. The description adds no parameter-level meaning beyond that, which matches the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List') on a specific resource ('accounts') and defines the result as 'the full chart of accounts including linked bank accounts (names and balances).' It also explicitly distinguishes itself from the sibling tool list_account_mappings.
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 alternative tool (list_account_mappings) and the exact condition where it should be used instead ('For the category-to-account mapping'). This gives clear routing guidance and leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_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_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 transactionsARead-onlyInspect
List the business's bank/feed transactions with signed amount, date, description, reference, running balance, linked income/expense ids and reconciliation status. 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds valuable context: these are raw bank-feed lines, not normalized income records, and it lists the fields returned. This meaningfully enriches the agent's understanding 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 waste. The first sentence front-loads the resource and returned fields; the second sentence provides sibling routing. 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 zero required params and no output schema, the description compensates by listing the returned fields, clarifying the raw bank-feed nature, and routing to relevant siblings. Combined with the schema's thorough param documentation, nothing essential 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%, and every parameter has detailed semantics including pagination, filtering before pagination, and inclusive date/amount behavior. The description adds no parameter-level details, 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 ('List') and resource ('the business's bank/feed transactions'), enumerates the returned fields, and explicitly distinguishes itself from siblings list_income and list_invoices. An agent can immediately tell what this tool returns and how it differs from nearby alternatives.
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 these are raw bank-feed lines and directs the agent to list_income for recorded income and list_invoices for invoices/quotes. This gives clear when-to-use and when-not-to-use guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_document_sentMark document sentAInspect
Mark a document as sent without emailing it.
| 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 message as read by current user. For several messages, prefer mark_messages_read_bulk — one call instead of many.
| 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 adds the behavioral detail that the message is marked 'by current user', which is not in the annotations. Since annotations already indicate non-read-only and non-destructive, this extra context is a slight bonus, though it does not cover all potential side effects like return values or persistence.
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 concise sentences with no redundant information. It front-loads the core action and directly follows with the usage alternative, making it easy to parse and act on.
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 tool with a single parameter and no output schema, the description provides sufficient context: the action, the scope (current user), and a clear alternative for multiple messages. No additional context is necessary for an agent 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?
The input schema fully describes the single required parameter 'id' with a clear description. The tool description does not add any additional parameter-specific meaning beyond the schema, so it meets the baseline for full 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 verb 'Mark' and the resource 'message as read', and it explicitly distinguishes this tool from the bulk variant by naming mark_messages_read_bulk. An agent can immediately understand the tool's purpose and 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 guidance: for several messages, prefer mark_messages_read_bulk with one call instead of many. This directly tells the agent when to use this tool versus the alternative, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_messages_read_bulkMark messages read bulkAInspect
Mark multiple messages as read by current user
| Name | Required | Description | Default |
|---|---|---|---|
| messages | Yes | The messages to mark read — each item is {id}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the contextual detail 'by current user' beyond the annotations. However, it does not disclose potential side effects, such as whether already-read messages are skipped or whether the operation fails for invalid IDs. The readOnlyHint and destructiveHint are consistent with the described write-but-non-destructive 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 a single clear sentence with no unnecessary words. The schema is compact and directly focused on the single required parameter.
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's purpose and parameters are well defined. While there is no output schema, the expected behavior of marking messages read is straightforward; no further context appears necessary 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 covers 100% of properties with descriptions. The top-level description explicitly clarifies that each array item is an object with an 'id', reinforcing the schema structure. No enums or nested objects add 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 clearly states the action ('Mark'), the target ('multiple messages'), the state change ('as read'), and the scope ('by current user'). This distinguishes it from singular variants like mark_message_read and other message actions such as mark_message_alerted.
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 the singular mark_message_read. The plural 'multiple messages' in the description implies bulk usage, but no direct comparison or alternative mention is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_suppliersMatch suppliersAInspect
Attribute every supplier-less expense to a supplier: dedupe the supplier records first, then let 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?
The description goes beyond the minimal annotations by revealing the internal dedupe-first step, the SuperCat prediction criteria, and the distinction between auto-applied and confirmation-only outcomes. It does not explicitly enumerate every side effect (e.g., updating expense records), but 'auto-applied' and the readOnlyHint=false annotation convey that writes occur.
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 front-loads the main purpose before giving precise thresholds. Every clause carries useful information, and no redundant or filler wording 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?
For a tool with no input schema, the description gives enough procedural context: dedupe first, predict with SuperCat, apply only if strong, otherwise surface for confirmation. It does not describe the return format or confirmation UI, but the essential behavior is sufficiently 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 input schema is empty, so the baseline of 4 applies; the description does not need to explain parameters that do not exist. It indirectly clarifies that the tool operates over the current set of supplier-less expenses in the environment.
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—'Attribute every supplier-less expense to a supplier'—and distinguishes the tool by detailing the dedupe-then-predict workflow and auto-apply versus confirmation behavior. This makes it clear how match_suppliers differs from siblings like suggest_suppliers or dedupe_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?
It explicitly states the target scenario (supplier-less expenses) and provides concrete thresholds for when predictions are auto-applied versus surfaced for confirmation. It does not name alternative sibling tools, but the context and criteria make intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_transactionMatch transactionARead-onlyInspect
Deterministically match one income/expense entry to its bank transaction. Given the entry (name/amount/date/direction) and amount-filtered candidate transactions, returns {transactionid, confidence 0.0-1.0, reason}. confidence >= 0.9 is a confident link; below that, escalate to a human/LLM judge.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The entry's date (YYYY-MM-DD); used for date-proximity scoring. | |
| name | No | The entry's name/description text; used for text-similarity scoring against each candidate. | |
| amount | No | The entry's amount to match on (required). Compared against each candidate's value. | |
| currency | No | 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. | |
| direction | Yes | Which side the entry sits on: "expense" or "income" (required). | |
| candidates | No | Candidate bank transactions to weigh, typically from search_amount — each a map with at least id, value, date and description. Required in practice; an empty or absent list yields no match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses deterministic behavior and the confidence threshold, adding value beyond the readOnlyHint annotation. It explains the confidence cutoff and escalation, but does not mention edge cases like empty candidate lists or exact behavior when no match is found. Given annotations cover read-only safety, 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?
Two sentences with no filler. The main purpose is front-loaded, and the threshold and escalation rule are stated 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?
With no output schema, the description explains the return structure and confidence threshold adequately. It also covers how candidates are expected to be provided. Minor omissions like empty-candidate behavior are acceptable given the tool's simplicity and the schema's richness.
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 detailed parameter descriptions, so the description adds little new semantics. It does note 'amount-filtered candidate transactions' in the text, which is a usage hint, but overall the schema already carries the meaning. 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 ('match') and resource ('one income/expense entry to its bank transaction'), and clearly distinguishes from sibling tools like find_candidate_transactions by specifying it operates on pre-filtered candidates. It also details the output structure, making the tool's function 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 provides clear context on when to use the tool: after obtaining amount-filtered candidates (typically from search_amount) and includes an explicit escalation rule when confidence < 0.9. However, it does not explicitly contrast with the sibling tool match_transactions (plural) or other alternatives, 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.
match_transactionsMatch transactionsADestructiveInspect
BUSINESS-WIDE, DESTRUCTIVE, NO UNDO. 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?
The description goes well beyond the annotations (destructiveHint, readOnlyHint) by detailing that it 'PERSISTED immediately,' has 'NO UNDO,' and 'Matches deterministically where it can and escalates only what it cannot confidently link.' This provides concrete behavioral insights that help the agent understand side effects and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with critical warnings ('BUSINESS-WIDE, DESTRUCTIVE, NO UNDO') and clearly organized around the three steps (dedupe, categorise, link). However, it repeats phrases like 'all PERSISTED immediately across ALL candidate entries at once' and 'There is NO single-record targeting and NO undo,' which is slightly redundant but not excessively verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides complete context: its scope ('whole business'), its destructive nature, the actions it performs, and the caveat about deterministic matching and escalation of uncertain links. Even without an output schema, the description sufficiently informs the agent about expected behavior and potential outcomes.
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 no parameters, so the schema coverage is trivially 100%. The description does not need to explain any parameter semantics, and none are missing. The absence of parameters is consistent, and the description does not imply any hidden inputs.
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: it reconciles the entire business's books by deduping, categorising, and linking income/expense entries to bank transactions. It explicitly says 'BUSINESS-WIDE' and 'NO single-record targeting,' distinguishing it from similar tools like match_transaction (singular) or categorize_entries, 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?
The description provides strong usage cues by highlighting that it is destructive, has no undo, and operates across all candidate entries at once. It explicitly states 'There is NO single-record targeting,' implying that for single-record operations one should use a different tool, but it does not explicitly name that alternative. This gives clear context on when to use the tool (for full reconciliation) versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_destinationOpen destinationARead-onlyInspect
Open an allowlisted place in the app for the customer. Use this when they ask to reach a human or switch to support — "can I speak to someone", "switch me to support", "talk to a person" — by passing destination "support", which pops open the support chat. 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, and the description adds useful behavioral context: opening 'support' pops up the support chat, unknown destinations produce an error, and the agent should reply warmly and briefly. It doesn't contradict annotations and gives enough beyond them to score high, though it could mention any UI side effects more 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?
Three compact sentences, each earning its place: purpose is first, then usage triggers and constraints, then the required response behavior. No filler or repetition; information is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one required parameter, no output schema, and no nested objects, the description fully covers what an agent needs: when to use it, what it does, what can go wrong, and how to respond. Nothing 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 coverage is 100%, so the schema already documents both parameters. The description adds value by illustrating the destination parameter with the actual value 'support', explaining the allowlist behavior, and warning that chatid is set automatically—semantics beyond the bare schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Open an allowlisted place in the app') and immediately provides the concrete use case (opening support chat) with example phrases. It is distinct from any sibling tool—no other tool opens app destinations—and an agent can understand exactly what action this performs.
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 conditions ('when they ask to reach a human or switch to support') with exact phrasing examples, and states the constraint that only allowlisted destinations work and unknown ones return an error to relay. This is clear when-to-use guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_report_sessionOpen report 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.
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 paymentAInspect
Record a payment against any document, in either direction. 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.
| 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?
The annotations already indicate readOnlyHint=false and destructiveHint=false, meaning the tool performs a write but is not destructive. The description does not disclose additional behavioral aspects beyond what the annotations state, such as authentication requirements, rate limits, or side effects like creating a payment record. It adds no 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 a single sentence that front-loads the main verb and action. It could be slightly more concise, as it repeats 'either direction' and lists document types twice, but it remains well-structured and immediately understandable. It earns a 4 for being largely succinct while still thorough.
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 core action and the document types involved, which is sufficient given there is no output schema. It doesn't mention return values or postconditions, but the absence of an output schema reduces the need for that. It is complete enough for the tool's 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 schema provides 100% description coverage for all parameters, so the baseline is 3. The description repeats some parameter details (e.g., the 'id' field meaning the payment id on update) but does not add significant new semantics beyond the schema's own descriptions. It is neither redundant nor insufficient.
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 explicitly states the action 'Record a payment against any document' and clarifies the two directions (money-in vs money-out) with specific document types. It is distinct from sibling tools like settle_bills or save_expense by focusing on recording a payment rather than settling or saving. This fully clarifies 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 clearly defines the tool's own scope, but it does not explicitly mention when to use this tool over alternatives (e.g., when to use settle_bills vs record_document_payment). It lacks explicit 'when not to use' guidance, so it meets the baseline but does not exceed it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_business_dataRefresh business dataAInspect
Clear the business's cached data so the next read recomputes from source. Call when data appears stale — e.g. a recent change isn't reflected in reads.
| 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 documentAInspect
Create or update document(s) 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. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only readOnlyHint=false and destructiveHint=false, which already indicate mutation but not destructiveness. The description adds valuable behavioral context: 'the whole batch is one all-or-nothing transaction with a single ledger recompute' and explains the create/update distinction based on id presence. It also notes that batch is atomic. While it doesn't cover error handling or success returns, it adds meaningful transparency beyond the sparse annotations, so a 4 is warranted.
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 given the tool's complexity, spanning about five sentences. It front-loads the core scope (all document types) and then flows logically through batch vs single, create vs update, and sibling tool routing. There is no fluff or repetition of schema details. It could be slightly more structured into paragraphs for readability, but it earns its length.
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 37 parameters, no output schema, and many sibling tools, this description covers all critical decision points: single vs batch, create vs update, parent relationships for notes, and explicit alternatives for line-item editing. It addresses the whole-document scope and gives routing guidance. The schema handles parameter-level detail, and the description bridges the gaps, making it 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?
Schema description coverage is 100%, so each parameter already has a description. The tool description does not repeat those but adds essential inter-parameter semantics: how `parent` relates notes to existing documents ('where it relates to an existing document, its id as parent'), the batch behavior via `items`, and the requirement that creating items without id must include `type`. This significantly enriches understanding beyond the schema, justifying a 4.
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 scope: 'Create or update document(s) of ANY kind' and enumerates all eight document types, distinguishing it from invoice-only tools. It uses a specific verb (create/update) and resource (document), and explicitly contrasts with siblings like update_document_item, making its purpose unambiguous. The batch capability and parent logic further clarify what it 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 explicitly says when to use this tool vs alternatives: 'This manages the document as a whole; to edit individual line items... use update_document_item (or update_document_items_bulk).' It also prescribes when to use batch (items array preferred over repeated calls) and when to create vs update (id present vs omitted). These are clear, actionable usage directives with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_expenseSave expenseAInspect
Create or update expense(s). 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 update_expenses_bulk when you only need to recategorise/relink existing expenses, or 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 amount including quantity; overrides amount×quantity if set. | |
| 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?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description adds concrete behavioral context: inline vs items batching, single all-or-nothing transaction with one ledger recompute, and id-based create/update semantics. It does not detail error/validation behavior, but the annotations already establish the mutation profile, so this is a strong but not exhaustive 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?
Four sentences, all substantive and well ordered: core operation, batching, payment routing, and sibling alternatives. No filler and no repetition of schema boilerplate; 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 29-parameter write tool with rich schema descriptions, the description covers the essential operational context: single vs batch, atomicity, ledger recompute, and payment settlement via accountid. It stops short of describing return shape or error behavior, but the schema plus description give an agent enough 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%, with every parameter already documented in the schema, including the detailed accountid payment semantics and the items batch description. The tool description reinforces the important accountid and items behaviors but does not introduce new parameter-level facts beyond what the schema already carries, so the high-coverage baseline 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 opens with a precise verb and resource ('Create or update expense(s)') and immediately distinguishes the tool from siblings by naming update_expenses_bulk, create_income_expenses_bulk, and record_document_payment. An agent can tell when save_expense is the right tool 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?
It gives explicit routing: prefer the items array over repeated calls, use update_expenses_bulk for recategorising/relinking, and use create_income_expenses_bulk for mixed income/expense transactions. It also gives the exact accountid pattern for paying bills/POs/GRNs, so the when-to-use guidance is unambiguous.
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 update income record(s). 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 update_income_bulk when you only need to recategorise/relink existing income, or 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 provide readOnlyHint=false and destructiveHint=false. The description adds meaningful behavior: id presence controls create-vs-update, batch operations are all-or-nothing, and a single ledger recompute occurs. It does not cover partial-update semantics or return value, but it exceeds what annotations alone 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 compact and front-loaded: core behavior first, then batch mode, then transactional guarantee, then sibling alternatives. Every sentence earns its place and there is 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 22-parameter tool with no output schema, the description covers the essential mode distinction, transaction semantics, and sibling routing. It is slightly incomplete in not stating the return shape and not explicitly saying whether inline fields and items can be combined, but the rich schema compensates for most parameter-level 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?
Schema description coverage is 100%, so the schema already documents all 22 parameters. The description's id/items semantics are useful but largely duplicate what the items schema description already states, so the description adds little beyond marginal guidance like preferring the batch form.
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 operation, 'Create or update income record(s)', and clearly distinguishes single vs batch modes. It also names sibling tools (update_income_bulk, create_income_expenses_bulk), so an agent can tell exactly what this tool is for.
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 when to use inline fields vs an items array, states that items are preferred over repeated calls, and names the exact conditions for choosing update_income_bulk or create_income_expenses_bulk instead. This is unambiguous routing guidance.
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 update a journal entry. 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?
The description discloses mutation semantics, the all-or-nothing transaction behavior, the single ledger recompute, and the return of the new id on create. Annotations already establish that this is not read-only and not necessarily destructive; the description adds useful behavioral context without contradicting 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 three dense sentences with no filler. The core create/update behavior is front-loaded, and the batch guidance and return behavior each earn their 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?
The description covers create/update behavior, batch operation, atomicity, and return behavior on single create. However, it does not specify return values for updates or batches, nor how top-level fields interact with the items array, leaving minor 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?
Schema coverage is 100%, so the baseline is 3, but the description adds value by clarifying the id presence/absence convention and framing the items array as a single atomic transaction with one ledger recompute. This goes beyond the per-field schema 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 (create or update) and resource (journal entry), and also covers the batch variant. It does not explicitly contrast with line-level siblings such as add_journal_line or update_journal_line, so it is clear but not fully sibling-differentiating.
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 concrete usage guidance: pass an id to update, omit it to create, and use the items array for many-at-once writes with an all-or-nothing transaction. It does not state when not to use this tool versus line-level alternatives, but the context is otherwise clear.
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 a product. 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?
With readOnlyHint=false and destructiveHint=false already declaring the safety profile, the description still adds real behavior: the items batch is an all-or-nothing transaction with a single ledger recompute, and the create path returns the new product id. It omits permission requirements and partial-update semantics for omitted fields, 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?
Three tight sentences: the upsert contract first, the return value second, the batch escape hatch third. No restatement of the title 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 24-parameter upsert with no output schema, the description covers the mode switch, the return value on create, and batch atomicity. It does not note that items entries accept fields the top-level object lacks, or what happens to existing values when a field is omitted, which is the main 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 the baseline is 3. The description earns above baseline by explaining the id create-vs-update semantics and the transaction semantics of items, which the schema describes only as a vector of objects. The field-level descriptions (e.g. "$delete" for image, legacy unit vs units) remain the schema's job.
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 product') and immediately disambiguates the two modes via the id parameter. An agent can distinguish this from save_variant, save_supplier, and save_client without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit mode selection (pass id → update, omit → create) and steers batch work to the items array ('Preferred over repeated calls' is echoed in the schema). It stops short of naming sibling alternatives or stating when not to use this tool, but the create-vs-update routing is unambiguous.
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 a variant. 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?
The description discloses the all-or-nothing transaction behavior for the items array and the single ledger recompute, which are behavioral traits beyond the annotations. It also mentions the return of the new variant id on create. It doesn't fully describe what happens on update (e.g., response format), but given the readOnlyHint:false and destructiveHint:false annotations, the write nature is known and the description adds useful 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?
The description is a single, dense paragraph with no fluff. It leads with the primary action (create/update), then the id logic, then the batch behavior. Every sentence serves a purpose and is front-loaded with the most important 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 16-parameter tool with no output schema, the description covers the essential decision points: how to create vs update, batch behavior, and return on create. It does not mention what is returned on update (possibly nothing or the updated variant), which is a minor gap. However, given the complexity and that all parameters are documented in the schema, the description is sufficiently complete for an agent 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 100% with each parameter described. The description adds critical semantic meaning for the id parameter (presence indicates update vs create) and the items array (batch all-or-nothing). It also highlights the image '$delete' mechanism indirectly via schema, but the description's explanation of id and items goes beyond the schema. This adds value without redundancy.
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: create or update a variant, with explicit distinction between create (no id) and update (with id). It also covers the batch mode via items array. This clearly differentiates from sibling tools like save_product or save_client by its focus on variants and the upsert pattern.
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 id vs omit id for create/update, and explains when to use the items array for batch operations. It doesn't explicitly mention alternatives (e.g., save_product for products), but the resource name and context make it clear. It could mention when not to use this tool, but the guidance is otherwise strong.
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.
send_documentSend documentAInspect
Email a document (invoice, quote, credit note, etc.) to its contact. Works on any document id. This actually sends the email — to flag a document as sent without emailing use mark_document_sent, and to log a payment against it use record_document_payment.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key behavioral trait by stating that it actually sends the email, going beyond the annotations (readOnlyHint=false, destructiveHint=false). It does not mention potential side effects like email delivery failure or permissions, but the main side effect is clearly communicated. 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 concise and well-structured: three sentences that cover purpose, a constraint, and the side-effect distinction. No fluff or repetition; it gets straight to the point and is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple action with no output schema, the description covers the core aspects: what it does, that it actually sends the email, and what alternatives exist. It does not mention error cases or what happens if no email is on file, but given the simplicity, the description is reasonably 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 provide clear explanations for both parameters (id and email), and the tool description does not add significant meaning beyond them. With 100% schema coverage, the baseline is 3, and there is little extra semantic value added by 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 action: it emails a document to its contact. It specifies the resource (document) and the verb (send/email), and explicitly distinguishes it from related actions like marking as sent or logging a payment, so an agent can easily understand its 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 explicitly tells when to use this tool: 'This actually sends the email' and contrasts it with mark_document_sent and record_document_payment, providing clear guidance on when to choose this over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 the business's own description of what it does. 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?
The description openly states the consequence of setting the description: it affects classification and dashboard tailoring. This, combined with readOnlyHint=false and destructiveHint=false, gives a full picture of the tool's impact 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 two sentences long, direct, and free of unnecessary detail. It front-loads the primary action and follows with the purpose, making it efficient and 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 setter operation, the description covers the action, its purpose, and its downstream effects. No output schema is needed, and the context is sufficient for an agent to use 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 single parameter 'whatwedo' is fully described in the schema with a clear explanation of its content and purpose. The tool description also reinforces its meaning as the business's own description, providing complete semantic 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 tool sets the business's own description, with a specific verb and resource. It distinguishes itself from siblings like set_business_tag or update_business by focusing narrowly on the 'whatwedo' field.
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 explains why one would use this tool (to classify the business and tailor dashboard/defaults), giving clear context. It does not explicitly contrast with alternative tools like update_business, but the specific purpose is evident.
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 invoiceAInspect
Set up, update, or disable a recurring schedule on an invoice so it repeats automatically. Pass the invoice 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. |
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, so the description carries most of the behavioral burden. It adds meaningful context by explaining that the invoice 'repeats automatically' and that autosend emails generated invoices to the client, going beyond what the annotations alone reveal. It does not detail effects like overwriting an existing schedule or whether disabling preserves history, but the core behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler: purpose first, then invocation guidance, then the autosend behavior. Every sentence adds actionable information, and the most important scoping detail ('on an invoice') 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 six-parameter mutation tool with no output schema, the description plus schema covers the essential invocation details: required fields, frequency options, day-of-month/weekday defaults, and autosend behavior. It is complete enough for correct use, though it could be stronger by explicitly noting that enabled=false disables an existing schedule and by distinguishing trigger_recurring_invoice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description must compensate for undocumented parameters. It clarifies autosend and the frequency/day/weekday relationship well, but it only minimally explains 'id' and 'enabled' and could mislead by implying frequency is always required even though only id and enabled are required 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 uses a specific verb set ('Set up, update, or disable') tied to a clear resource ('a recurring schedule on an invoice'), so an agent immediately knows what the tool does. It also implicitly distinguishes itself from siblings like set_recurring_contract and trigger_recurring_invoice by focusing on invoice schedules and configuration rather than contracts or manual triggering.
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 the general use case and provides step-by-step invocation guidance, but it never explicitly says when to prefer this tool over related siblings such as trigger_recurring_invoice or set_recurring_contract. The usage context is clear, but exclusions and alternative routing are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. Returns {results [{bill, status "settled"|"already-settled"|"proposed"|"failed", expenseid, created, bankchargeid, 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). 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?
Annotations carry the basic profile (write, idempotent, destructive); the description goes far beyond — spelling out the idempotency mechanism (already-settled bills are safe no-ops on rerun), per-pair independent failure, the 'proposed'/bank-charge flow that writes NOTHING until re-confirmed, owner-scoping, the 3% over-settle rule, and the 100-pair cap. Undo semantics (unlink, never delete; bankchargeid safe to delete) add context no annotation captures. 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?
Purpose is front-loaded and every sentence earns its place — the tool's complexity justifies the length. The weakness is structural: it is one dense unbroken paragraph, and separating the proposal flow, the return format, and the limits would materially improve scanability.
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 fully specifies the return structure and its semantics (expenseid as undo handle, created flag, bankchargeid, proposal object, statuses, reason). Covers limits, failure modes, prerequisites, and edge cases (3% over-settle threshold, allocated-elsewhere failures, max 100 pairs). Nothing an agent needs to invoke this complex 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 coverage is 100%, so the baseline is 3; the description raises it by clarifying execution semantics — how the :transaction case re-points a bank-feed expense vs mints a new one, how bankcharge interacts with a 'proposed' result, and how the confirmation gate drives re-invocation. This is workflow meaning beyond the field descriptions, though the schema already documents each field well.
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 — 'Settle a batch of bills in one call' — and lays out both settlement modes (linking an existing expense or a bank transaction). Explicitly differentiates itself from the sibling record_document_payment (single vs batch, linking vs minting), so an agent can tell them apart without any schema inspection.
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 alternative tool explicitly (record_document_payment) and gives the selection criterion: batch settlement with existing payments vs one-at-a-time with minted expenses, including a note that the chat loop cannot use N single settles. Also provides a hard gate: 'Only run after the user has confirmed the proposed matches.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_todosSet todosAInspect
Create or replace the todo checklist for the current chat. Pass the FULL list of items every time (the stored list is replaced, not merged). Each item has text and a status of "pending", "in_progress", or "done". Use this to plan and track multi-step work — mark an item "in_progress" before starting it and "done" when finished — so progress is visible to the user and survives across sessions. Requires a chatid from an ACTIVE Ask-stub chat session — the id cannot be minted via MCP, so this tool applies only when operating inside a chat.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnly and destructive hints, neither indicating any destructive effect. The description transparently explains the replace behavior and the requirement of an active chatid, so no 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 slightly repetitive in emphasizing 'full list' and 'replaces', but it remains concise and focuses on essential usage and constraints. The main purpose is stated up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with only two parameters and no return schema, the description covers all necessary context: what it does, how to use it, and the constraint on chatid. Nothing important 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?
Both parameters are fully described in the schema, and the description adds important semantics: 'full list' emphasizes the replacement behavior, and the chatid requirement is reinforced with the 'active chat' condition.
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 or replaces a todo checklist for a chat, specifying the action and resource. It distinguishes itself from sibling tools by focusing on chat-based todo management.
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 instructs to pass the full list every time, that the list is replaced not merged, and defines allowed statuses. Also notes the chatid must come from an active chat, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snooze_messageSnooze messageAInspect
Snooze a notification — resurfaces tomorrow at 08:00 SAST
| 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 accountAInspect
Update a chart-of-accounts ledger account by id — its name, description, group or settings. See list_accounts for ids.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Account id to update (see list_accounts). | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, so the mutation nature is known. The description adds 'by id' and the list_accounts reference, but does not disclose potential side effects of setting fields like 'deleted' or 'hidden' which affect visibility. The description could mention soft-delete behavior but is not contradictory.
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 front-loaded: it states the action and resource in the first sentence and provides a practical pointer for ids in the second. No redundant information or 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 update operation, the description is complete: it names the resource, the identifier, and the common updatable aspects (name, description, group, settings). No output schema exists, so no return spec is needed. The id lookup hint covers the only prerequisite.
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 15 parameters, covering 100% of them. The tool description adds no extra parameter semantics beyond the schema, so 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 (update), the resource (chart-of-accounts ledger account), and the key identifier (by id). It also differentiates from list_accounts by pointing to it for ids, which helps an agent know this is for modifying existing accounts.
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 useful hint on obtaining ids via list_accounts, but does not explicitly contrast with create_account or delete_account for when to use update vs. alternatives. The description could be more explicit about partial updates (all fields optional) but the schema implies this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assetUpdate assetAInspect
Update a fixed asset by id — its name, value, purchase date or depreciation settings.
| 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 accountAInspect
Update an existing bank account by id — its name, bank, account number or opening balance. Changing the opening balance regenerates the account's synthetic opening-balance entry. An opening date later than the account's own earliest transaction is refused, unwritten, with code confirm-required until the same call is repeated with confirm true. To add a brand-new account use create_bank_account.
| 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 | |
| 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 both openingbalance and openingdate (clears the Insights banner). Distinct from setting the balance to 0, which stays 'set'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive hints, the description discloses a side effect (regenerating the synthetic opening-balance entry) and a guarded failure mode (late opening date refused unless confirm=true). It does not describe all side effects such as hidden soft-deletion, but those are covered in the schema's parameter descriptions.
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 purpose, a behaviorally important edge case, and a pointer to the create sibling with no filler. The critical confirmation nuance is included without burying the main 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 20-parameter tool with no output schema, the main description cannot restate every field, but the 100%-covered schema handles that. The description supplies the high-level scope, the key edge-case behavior, and the create alternative; it only lacks an explicit statement of partial-update semantics or the response 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?
Schema coverage is 100%, so the baseline is 3, and the description adds extra meaning by explaining what happens when opening balance changes and how the confirm parameter interacts with a late opening date. It highlights the core fields but leaves detailed per-field semantics to the already-rich 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 names a specific operation and resource ('Update an existing bank account by id') and lists the primary mutable fields. It also points to create_bank_account for a brand-new account, separating it from the nearest 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?
It clearly frames the tool for updating an existing account and explicitly routes new-account creation to create_bank_account. It does not contrast with other update_* siblings, but the bank-account resource makes the target obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_businessUpdate businessAInspect
Update the business's own profile fields (name, contact details, industry, currency, tax rate, and the like). To change only the free-text description use set_business_description, or only a single tag use set_business_tag.
| 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. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a mutating (readOnlyHint=false) but non-destructive (destructiveHint=false) operation. The description adds little behavioral context beyond the 'own profile fields' scoping; it does not mention partial-update semantics, side effects on public pages, or permission requirements. With annotations covering the core 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?
Two sentences with no filler: the first states the operation and scope, the second routes to the two relevant siblings. Every word earns its place, and the key information 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?
Given the enormous 72-parameter schema, the description cannot and need not cover field details; it orients the agent with scope and sibling routing. It stops short of stating update semantics (e.g., whether unspecified fields are preserved) or the response shape, and there is no output schema to fill that gap. Still, it is complete enough for an agent to select and begin using 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?
Schema description coverage is 99%, so the schema already documents every parameter in detail. The description only enumerates a few examples (name, contact details, industry, currency, tax rate) that mirror the schema fields and adds no extra semantic or format information. Baseline 3 applies because 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?
The description uses a specific verb ('Update') and resource ('business's own profile fields'), then lists representative fields (name, contact details, industry, currency, tax rate) so the agent knows exactly what the tool covers. It also differentiates from siblings by naming set_business_description and set_business_tag for narrower single-field edits, making the tool's identity 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 states when to use this tool (broad profile updates) and names two alternatives with the conditions that select them ('To change only the free-text description use set_business_description, or only a single tag use set_business_tag'). This is crisp routing guidance that 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_itemUpdate document itemAInspect
Update a line item on a document (invoice, quote, bill, etc.). To change several lines on one document, prefer update_document_items_bulk — one call instead of many. To create the document or change its header/dates/totals, use save_document.
| 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. | |
| 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 already indicate this is a mutating but non-destructive operation (readOnlyHint=false, destructiveHint=false), so the bar for additional disclosure is lower. The description adds scope context about what kind of entity is updated, but it does not disclose partial-update semantics, recalculation side effects, or behavior when required fields like id are omitted. 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 three sentences with no filler: the first states the core operation, the second gives a bulk alternative, and the third points to save_document for related-but-different scenarios. It is front-loaded 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 tool with 16 parameters and no output schema, the description does well to scope the operation and route to the correct siblings. The rich input schema fills in most remaining operational detail, while the description covers the key decision of when this tool versus bulk or save_document is appropriate. Minor gap: it does not state what the response is, but no output schema exists and the schema/description are otherwise strong.
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% description coverage and provides detailed parameter documentation, including special notes like id being required on this tool and amount being derived from price × quantity. The description itself adds no parameter-level meaning, so the schema carries the load; the score is at 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 clearly states the action ('Update a line item on a document') and identifies the resource type ('invoice, quote, bill, etc.'). It explicitly distinguishes itself from sibling tools by naming update_document_items_bulk and save_document, so an agent can 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?
The description gives explicit usage guidance: use this tool for a single line item update, prefer update_document_items_bulk for multiple lines, and use save_document for creating a document or changing header/dates/totals. This clearly routes the agent to the correct alternative based on the task shape.
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). | |
| 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 indicate the operation is not read-only and not destructive. The description adds that the operation changes a single line item's rate or amount and requires identifying the item by id, but it does not explain side effects such as document reindexing, validation failures, or how id resolution behaves when multiple id fields are supplied.
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-loaded with purpose and scope, and ends with a useful sibling pointer. There is no filler or repetition of schema details.
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 14 parameters, zero required fields, multiple id aliases, and conditional resolution rules described only in the schema, the concise description is adequate for selection but not fully sufficient for invocation. The agent must rely heavily on schema text for id precedence and required/optional update semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to compensate for undocumented parameters. It adds only general context ('change the rate or amount', 'Identify the item by its id'), which maps to the rate, amount, and id parameters but adds little 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?
Description states a specific verb ('Update'), a precise resource ('sales-tax (VAT) on a single line item of a document'), supported document types, and the two changeable aspects (rate or amount). It also differentiates from add_document_item_salestax by explicitly scoping the operation to updates.
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 last sentence explicitly instructs the agent to use add_document_item_salestax when the goal is to add a new sales-tax line rather than update. This gives a clear selection rule between the two most relevant siblings.
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
Update an existing payment recorded against a document (invoice, quote, credit note, debit note) — change its amount, date or account. Identify the payment by its id. To record a new payment use record_document_payment.
| 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 already declare readOnlyHint=false and destructiveHint=false, so the mutation is expected. The description adds that this is an update to an existing payment identified by id, but does not disclose whether omitted parameters are preserved (partial update) or reset, nor any response behavior. 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?
Two sentences, front-loaded with the core action and scope, then a precise id instruction and sibling routing. Every sentence earns its place 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 an 11-parameter update with no output schema and minimal annotations, the description plus schema is enough to attempt a call but leaves gaps: it does not explain partial-update semantics, return value, or side effects. It is minimally viable but incomplete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 11 parameters in detail. The description adds only a brief mention of amount, date, and account, which does not materially exceed what the schema 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?
States a specific verb and resource: update an existing payment recorded against a document, enumerating document types and typical fields. Explicitly distinguishes from the sibling record_document_payment, so an agent can tell them 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?
Gives an explicit usage rule: use this tool for existing payments and names the alternative for new payments. Also instructs that the payment is identified by its id, removing ambiguity about which identifier to pass.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_entity_salestaxUpdate entity salestaxAInspect
Update an existing sales tax already on an entity. To add a new sales tax use add_entity_salestax (one entity), add_entity_salestaxes (several taxes on one entity), or add_salestax_to_entities (one tax across many entities).
| 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). | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, indicating a mutation that is not destructive. The description adds the precondition that the sales tax must already exist on the entity, but does not disclose whether the update is partial or full replacement, or any side effects. This meets the reduced bar but adds only modest 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?
Two sentences, no filler. The action is front-loaded, and the alternative routing is given in the second sentence. 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 13-parameter mutation tool with full schema coverage and no output schema, the description is sufficient: it states the operation, the precondition, and routes additions to the correct siblings. The lack of return-value documentation is a minor gap since no output schema exists.
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 fully documents all 13 parameters. The description only re-emphasizes that 'id' refers to an existing sales tax, which the schema already states ('Id of the sales tax to update'). 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 ('Update') and resource ('existing sales tax on an entity'), and explicitly differentiates from the add_* siblings by the 'already on an entity' qualifier. This is immediately distinguishable from add_entity_salestax and related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the three addition alternatives and the condition that selects them: 'To add a new sales tax use ...'. It clearly tells the agent when to use this tool (update existing) vs when not (adding new).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_folderUpdate folderAInspect
Update a file folder by id — rename it or change its parent. To create a brand-new folder use create_folder instead.
| 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
Update a single debit/credit line on an existing journal entry — change its account, debit or credit amount. Identify the line by its id. Pairs with add_journal_line; to edit the whole entry use save_journal_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Line id (for updating an existing line). | |
| 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 indicate readOnlyHint=false and destructiveHint=false. The description adds context that only the account and debit/credit amounts are changed, and that the line is identified by id. It doesn't mention side effects or error behavior, but for a simple update tool with non-destructive annotations, this is adequate 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 two sentences, concise and front-loaded with the core action. It includes the key identification method ('Identify the line by its id') and sibling relationships 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?
Given the low complexity (5 optional parameters, no output schema) and the presence of sibling guidance, the description fully covers what an agent needs to know to correctly invoke the tool: what it does, which fields can change, how to identify the line, and when to use alternatives.
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 cover all 5 parameters with clear definitions (e.g., 'Line id (for updating an existing line)' and 'Debit amount for this line (0 if this is a credit line)'). The main description adds high-level context but does not enhance parameter-specific semantics beyond the schema. Since coverage is 100%, 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 clearly states the tool's action: 'Update a single debit/credit line on an existing journal entry — change its account, debit or credit amount.' It specifies the resource (journal line) and distinguishes it from siblings: 'Pairs with add_journal_line; to edit the whole entry use save_journal_entry.'
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 tells when to use this tool versus alternatives: 'Pairs with add_journal_line; to edit the whole entry use save_journal_entry.' This gives clear guidance on when to choose this tool over adding a line or editing the whole entry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_messageUpdate messageAInspect
Update an existing message's text, context, notification flag or alert level by id.
| 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 indicate readOnlyHint=false and destructiveHint=false, so the description adds no additional behavioral context. It does not disclose side effects, error behavior (e.g., missing id), or any requirements beyond the basic update action, but this is acceptable given the annotations cover the core traits.
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 directly states the action and the affected fields. It is well-structured and contains no unnecessary information, making it easy for an agent 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 is sufficient for a simple update operation. Since there is no output schema, return values are not expected. However, it does not mention what happens if the id does not exist or if no updateable fields are provided, which could be useful context, but is not strictly necessary 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?
All six parameters are described in the schema with 100% coverage, and the tool description enumerates the fields that can be updated. Parameter purposes are clear enough for an agent to understand what each field represents, including the separate alert level and notification flag.
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 updates an existing message's text, context, notification flag, or alert level by id. It uses the specific verb 'Update' and the resource 'message', distinguishing it from create_message, delete_message, and other message-related tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly mention when to use this tool versus alternatives, such as create_message or mark_message_read. It implies usage for modifying an existing message, but provides no direct comparison or conditions to guide selection among sibling tools.
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 transactionAInspect
Update a transaction by id. To update several transactions at once, prefer update_transactions_bulk.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the transaction, only required for updates | |
| date | No | Transaction date | |
| notes | No | Additional notes about the transaction | |
| value | No | Transaction amount in the base currency | |
| ignored | No | Whether to ignore this transaction in reports | |
| description | No | Description of the transaction | |
| basecurrency | No | The base currency of the business | |
| debitjournal | No | ID of the account to debit | |
| exchangerate | No | Exchange rate if transaction currency differs from base currency | |
| creditjournal | No | ID of the account to credit | |
| transactioncurrency | No | The currency of the transaction if different from base currency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide basic safety hints (readOnlyHint=false, destructiveHint=false), indicating this is a write operation but not destructive. The description does not add further context about side effects, partial vs full updates, or error behavior. Since the bar is lowered by the presence of annotations, but the description itself adds no extra behavioral detail, a score of 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?
The description is exceptionally concise, consisting of two sentences. It leads with the core action ('Update a transaction by id') and then immediately offers the alternative for bulk updates. There is no redundant information, making it well-structured and 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 update operation, the description is sufficiently complete. It states the primary action and the key alternative. It does not specify return values or error handling, but given the absence of an output schema and the straightforward nature of the tool, these omissions are minor. The context is adequate for an agent to understand the tool's role.
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 includes 11 parameters, all with descriptions, achieving 100% coverage. The tool description adds no extra meaning to these parameters beyond what the schema already provides. Given the high schema coverage, a baseline score of 3 is warranted.
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: 'Update a transaction by id.' It is specific about the action and the resource, and it distinguishes the single-update tool from the bulk variant. This makes the purpose immediately obvious without needing to inspect 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 explicitly says when not to use this tool: 'To update several transactions at once, prefer update_transactions_bulk.' This provides clear guidance on choosing between the single and bulk operations. The distinction from other entity-specific update tools is implicit from the resource name, but the bulk alternative is explicitly called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transactions_bulkUpdate transactions bulkAInspect
Update many transactions in one call (description, date, value, ignored, notes, deleted per item) — prefer this over repeated single-transaction updates. For a single transaction use update_transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| transactions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, setting the mutating-but-not-destructive baseline. The description adds that updates are applied per item but does not disclose behavior like whether omitted fields are left unchanged, partial failure handling, or limits on batch size. It 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?
Two sentences, zero filler. The action and scope come first, the field list is compact, and the routing guidance is immediately relevant. 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 single-parameter bulk update tool with a simple inline schema and no output schema, the description provides the essential calling context: what to update, how to batch, and the alternative for single updates. Missing only minor details like partial-failure behavior and whether omitted fields are untouched, which are not critical for a straightforward update.
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 all updatable fields (description, date, value, ignored, notes, deleted), which helps, but it does not explain the required 'id' field's role as the transaction identifier or clarify semantics like 'deleted: true' meaning soft-delete. It adds some meaning over the bare schema but does not fully carry the burden.
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 verb and resource: 'Update many transactions in one call', and enumerates the exact fields (description, date, value, ignored, notes, deleted). It immediately distinguishes itself from the single-transaction sibling update_transaction, 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?
Explicit usage guidance is given: 'prefer this over repeated single-transaction updates' and 'For a single transaction use update_transaction.' This clearly instructs an agent when to use this bulk tool and when to route to the alternative, with no inference needed.
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.
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" +}
3 tool updates
- Changed
evaluate_report2 fields changed- changed
Input schema / properties / asAt / descriptionPrevious value: -"For as-at views (account-totals-as-at, balance-sheet): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd."New value: +"For as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd." - changed
Input schema / properties / view / descriptionPrevious value: -"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. Provide this OR a template, not both."New value: +"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."
- Changed
evaluate_report_session2 fields changed- changed
Input schema / properties / asAt / descriptionPrevious value: -"For as-at views (account-totals-as-at, balance-sheet): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd."New value: +"For as-at views (account-totals-as-at, balance-sheet, clearing-residual): the position date (YYYY-MM-DD), inclusive. Synonym for periodEnd." - changed
Input schema / properties / view / descriptionPrevious value: -"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. Provide this OR a template, not both."New value: +"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."
- Changed
update_business1 field changed- added
Input schema / properties / quotetitleAdded value: +{ + "description": "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\".", + "type": "string" +}
2 tool updates
- Changed
find_candidate_transactions1 field changed- changed
Input schema / properties / documentid / descriptionPrevious value: -"The invoice / bill / purchase document id (cont-…) to find candidate settling bank transactions for."New value: +"The invoice / bill / purchase document id (cont-… or inv-…) to find candidate settling bank transactions for."
- Changed
find_candidate_transactions_bulk1 field changed- changed
Input schema / properties / documentids / descriptionPrevious value: -"Explicit list of document ids (cont-…) to fetch candidates for. When given, the filter fields below are ignored. Foreign/missing ids are silently dropped."New value: +"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."
1 tool update
- Changed
save_journal_entry2 fields changed- changed
Input schema / properties / items / items / properties / lines / items / requiredPrevious value: -[ - "accountid", - "debit", - "credit" -]New value: +[] - changed
Input schema / properties / lines / items / requiredPrevious value: -[ - "accountid", - "debit", - "credit" -]New value: +[]
2 tool updates
- Changed
create_bank_account1 field changed- added
Input schema / properties / confirmAdded value: +{ + "description": "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.", + "type": "boolean" +}
- Changed
update_bank_account1 field changed- added
Input schema / properties / confirmAdded value: +{ + "description": "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.", + "type": "boolean" +}
1 tool update
- Added
open_destination
3 tool updates
- Added
get_source_codes - Added
include_transactions_bulk - Changed
restore_deleted1 field changed- changed
Input schema / properties / entity / descriptionPrevious value: -"The binned record's kind: \"expense\", \"income\", \"invoice\", \"client\", \"supplier\", \"transaction\", \"product\", \"variant\", \"journal-entry\", \"message\" or \"tag\"."New value: +"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\"."
1 tool update
- Changed
save_product2 fields changed- added
Input schema / properties / items / items / properties / skuAdded value: +{ + "description": "Stock-keeping unit / product stock code. Canonical product-level SKU (mirrors a variant's sku).", + "type": "string" +} - added
Input schema / properties / skuAdded value: +{ + "description": "Stock-keeping unit / product stock code. Canonical product-level SKU (mirrors a variant's sku).", + "type": "string" +}
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 staff accountant for QuickBooks: transactions, reports, receivables, payables, month-end close
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 gradedqualityDmaintenanceFinancial 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.50074 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.