AccountsOS
Server Details
AI accounting: ask about your live AccountsOS books in plain English. Read-only tools for transactions, cash balances, invoices, bills, VAT, filing deadlines and reports across 31 countries. OAuth sign-in; free 14-day trial at accounts-os.com.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 82 tools
Many tools overlap in purpose: get_expenses vs get_expense_claims, get_statement_checks vs get_reconciliation_status, get_vat_summary vs calculate_vat_period vs get_vat_periods, and get_financial_snapshot vs multiple reporting tools. An agent can often pick a reasonable tool, but several boundaries require careful description-reading and some descriptions even reference missing companion tools.
The set is overwhelmingly snake_case and mostly uses predictable verb_noun patterns: get_*, list_*, search_*, lookup_*, calculate_*, find_*. There are minor deviations such as month_close_summary, integration-prefixed deel_* tools, and mixed get/list/read for read-only operations, but the convention remains readable.
Eighty-two tools is an extreme mismatch for a single MCP server, far beyond the 3-15 well-scoped range. The surface spans accounting reports, VAT, payroll, Deel, integrations, tax knowledge, wikis, companies, projects, tasks, and documents, creating severe cognitive load and high misselection risk.
Coverage is broad for reading/reporting, but core accounting lifecycle operations are missing: no create/update invoice, bill, contact, transaction, categorization, or VAT lock/submit actions. Several tools also point to companion actions that are not present, such as merge_bank_accounts, auto_match_receipts, and lock_vat_period, leaving dead ends.
Available Tools
82 toolsadd_documentAdd DocumentAInspect
Add a file the user attached in this chat to their AccountsOS books: a bank statement, a receipt, a supplier bill or a sales invoice. AccountsOS reads it the same way as an emailed document: a bank statement is imported into a bank account (created if it does not exist yet), a receipt or bill is read and matched. Use it whenever the user attaches or mentions a financial document and wants it in their books. The result says what was found and what happened.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The file the user attached: a bank statement (PDF, CSV or spreadsheet), a receipt, a bill or an invoice. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important side effects: bank statements are imported into a bank account that may be auto-created, and receipts or bills are read and matched. It also says the result reports what was found and what happened, giving the agent useful behavioral context for a write 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 front-loaded with the main action and is generally efficient. It includes some repetition of document types when explaining behavior, but every part remains useful 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?
For a non-idempotent write tool with a nested file object and no output schema, the description gives sufficient context about input expectations, side effects, and result shape. Minor gaps around duplicate handling or error behavior remain, but the core details an agent needs are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description adds context about supported file types but does not add meaningful guidance beyond the schema for the company parameter or file object fields. 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 begins with a specific verb and resource: 'Add a file ... to their AccountsOS books,' and clarifies the document types handled. This clearly separates it from read/search siblings, though it does not explicitly name or contrast with an alternative 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?
It provides a clear usage condition: 'Use it whenever the user attaches or mentions a financial document and wants it in their books.' It does not explicitly state when not to use it or name alternatives such as search_documents, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_vat_periodCalculate Vat PeriodARead-onlyIdempotentInspect
Preview the 9-box VAT breakdown for a period WITHOUT locking it. Computes the boxes from the period's transactions using the same logic as the VAT page, so the user can review the figures before locking. Use when the user says "what's my VAT for this quarter", "show me the 9 boxes", or before lock_vat_period so they can check first. Read-only: does not change anything.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| period_id | Yes | VAT period ID (UUID). Use get_vat_periods to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds meaningful context: it previews without locking, uses the same logic as the VAT page, and does not change anything. It could go slightly further by describing the response shape or whether figures are cached, but the behavioral profile is well 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 tightly written and front-loads the key distinction: preview without locking. Every sentence contributes to purpose, usage, or safety context, with no redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description explains that the tool returns a 9-box VAT breakdown derived from the period's transactions. Combined with the safety annotations, this is enough for an agent to call it correctly, though it does not detail the structure of the returned figures.
Complex tools with many parameters or behaviors need more documentation. 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 schema. The description does not add syntax or formatting details about period_id or company beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: previews a 9-box VAT breakdown for a period without locking it. It distinguishes itself from related tools like lock_vat_period and explains the calculation basis, so an agent can identify its role 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?
Explicitly names when to use it, including example user phrases such as "what's my VAT for this quarter" and the pre-lock review workflow. It also positions it relative to lock_vat_period, leaving no ambiguity about when this preview tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_vat_numberCheck Vat NumberARead-onlyIdempotentInspect
Check a UK VAT registration number against HMRC's live Check-a-UK-VAT-number register and return the registered trader name and address. GB only. A "not registered" answer is a real answer from HMRC, not an error. Use this when the user asks whether a VAT number is valid, when adding or editing a supplier or customer with a VAT number, and when a VAT number appears on a document and the user wants it confirmed. Report the registered name back to the user, and point out when it does NOT match the contact's name: a mismatch is the actual thing worth flagging.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| contact_id | No | Optional. The contact this VAT number belongs to, so the result can be reported against them. | |
| vat_number | Yes | UK VAT registration number, 9 digits, with or without the GB prefix. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: it hits a live external register and a 'not registered' response is a legitimate HMRC answer rather than an error — exactly the kind of detail that prevents an agent from retrying or reporting failure. It stops short of describing service-unavailable or rate-limit behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it does and where the data comes from, then the caveat, then usage. Every sentence carries information, though the final sentence blends reporting instructions with description and could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description states what comes back (registered trader name and address) and how to interpret a negative result. Combined with full schema coverage, an agent has everything needed to call it and act on the response.
Complex tools with many parameters or behaviors need more documentation. 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 the 9-digit format, optional GB prefix, company selection, and contact_id purpose. The description adds only the GB-only constraint, which largely restates what the vat_number description implies. Baseline 3 is appropriate when the schema does all the parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check), a precise resource (a UK VAT registration number), the authoritative source (HMRC's live Check-a-UK-VAT-number register), and the return content (registered trader name and address). The 'GB only' scope and the external-source framing make it clearly distinct from sibling tools like get_hmrc_vat_liabilities or get_vat_summary, which concern the account's own VAT position.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates three concrete trigger scenarios (validity question, adding/editing a supplier or customer, confirming a VAT number on a document). It also tells the agent what to do with the result: report the registered name and flag a mismatch with the contact name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_calculate_employment_costDeel Calculate Employment CostARead-onlyIdempotentInspect
Calculate the total cost of hiring someone in a specific country through Deel EOR. Use when the user asks "how much would it cost to hire in [country]?" or about employment costs abroad.
| Name | Required | Description | Default |
|---|---|---|---|
| salary | Yes | Annual gross salary in the country's currency | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| country | Yes | Full country name (e.g., "Portugal", "Germany", "Ireland"). Must be the full name, not a code. | |
| currency | Yes | Currency code (e.g., "EUR", "USD") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that it is specifically for 'Deel EOR' (employer of record), which is useful context, but it does not disclose rate limits, external API dependencies, or whether the result is an estimate versus a binding quote. With annotations present, 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?
The description is two concise sentences, front-loaded with the core action and followed by a clear usage example. Every sentence 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?
Given the rich annotations and full schema coverage, the description is largely complete for an agent to select and invoke the tool. It could be improved by explicitly contrasting with the take-home pay sibling, but the core information is sufficient.
Complex tools with many parameters or behaviors need more documentation. 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 four parameters are fully documented in the input schema. The description adds no additional parameter-level details (e.g., format hints or defaults). When schema coverage is this high, the baseline score is 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 uses a specific verb 'Calculate' and resource 'total cost of hiring someone in a specific country through Deel EOR', making the purpose clear. It does not explicitly differentiate from the sibling tool 'deel_calculate_take_home_pay', but the distinction between employer cost and take-home pay is reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage trigger: 'Use when the user asks "how much would it cost to hire in [country]?" or about employment costs abroad.' This gives explicit context without exclusions. It does not mention alternative tools like deel_calculate_take_home_pay, which would be helpful for disambiguation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_calculate_take_home_payDeel Calculate Take Home PayARead-onlyIdempotentInspect
Calculate take-home pay for a given salary in a specific country. Use when the user asks about net pay, take-home salary, or deductions in a country.
| Name | Required | Description | Default |
|---|---|---|---|
| salary | Yes | Annual gross salary | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| country | Yes | Two-letter ISO country code (e.g., "IE" for Ireland, "PT" for Portugal) | |
| currency | Yes | Currency code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds nothing behavioral beyond them — for a calculation tool it never says whether results are estimates, what tax year or assumptions apply, or how precise the output is, which is the context that actually matters here.
Agents need to know what a tool does to the 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 padding, with the core purpose front-loaded before the usage cue. Nothing to trim and nothing displaced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 should say what comes back (net amount only vs. a breakdown of deductions, currency of the result). It covers inputs adequately via the schema but leaves the return shape unspecified for an agent that must report the result to a user.
Complex tools with many parameters or behaviors need more documentation. 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%, including the useful note on the optional company parameter referencing list_companies. The description adds no meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (calculate take-home pay) plus the scoping inputs (salary, country). It does not distinguish itself from the closely related sibling deel_calculate_employment_cost, so an agent comparing the two gets no disambiguation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 trigger conditions are given: net pay, take-home salary, or deductions questions in a country. There is no guidance on when NOT to use it or how it differs from other Deel calculation tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_get_invoicesDeel Get InvoicesARead-onlyIdempotentInspect
Get invoices from the user's Deel account. Shows contractor payment invoices. Use when the user asks about Deel payments, contractor invoices, or payment history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| statuses | No | Filter by status: paid, pending, overdue |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description contributes only the content scope (contractor payment invoices); it says nothing about result volume, pagination, or default limit behavior. Adequate but not additive.
Agents need to know what a tool does to the 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 the purpose front-loaded and no padding. The second sentence partially restates the first ("Shows contractor payment invoices" vs. "Get invoices"), which is mild redundancy but it also narrows scope usefully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 three optional params and no output schema, the description should at least hint at what comes back or how results are bounded. Annotations cover the safety profile, but an agent gets no signal on return shape, ordering, or whether the default limit of 20 applies silently.
Complex tools with many parameters or behaviors need more documentation. 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 limit, company, and statuses fully documented in the schema itself. The description adds no parameter meaning beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get invoices) scoped to the Deel account and to contractor payment invoices, which separates it from the generic get_invoices. It never names the closest siblings (deel_get_payment_receipts, get_invoices) for explicit contrast, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user asks about Deel payments, contractor invoices, or payment history" gives a clear triggering context. It offers no exclusions or alternative-tool routing, such as when to prefer deel_get_payment_receipts, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_get_payment_receiptsDeel Get Payment ReceiptsARead-onlyIdempotentInspect
Get payment receipts from Deel showing payments made to contractors. Use when the user asks about specific Deel payments or needs payment proof.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is fully covered by structured data. The description adds nothing behavioral beyond that — no indication of pagination defaults, whether receipts include downloadable file links, or how results are ordered. With the annotation bar already met, this is a missed opportunity rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first, usage second, zero filler. Nothing is redundant with the title and nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 two-parameter list tool with rich annotations, the definition is adequate. However, there is no output schema, so the agent gets no notion of what a receipt record contains (IDs, dates, amounts, download URLs) or how results are paginated — a gap the description could have closed in one clause.
Complex tools with many parameters or behaviors need more documentation. 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 'company' parameter even points at list_companies, so the schema does the real work. The description contributes no detail about 'limit' behavior (default 20) or company selection, matching the 3 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?
Names a specific verb and resource ('Get payment receipts from Deel') and scopes it to contractor payments, so the agent knows it is not invoices or contracts. It does not explicitly distinguish itself from the near-sibling deel_get_invoices, leaving the receipts-vs-invoices boundary to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user asks about specific Deel payments or needs payment proof' gives a concrete triggering condition rather than none. It offers no exclusions or alternative routing (e.g. when to prefer deel_get_invoices), so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_get_peopleDeel Get PeopleARead-onlyIdempotentInspect
List people (contractors and employees) in the user's Deel organization. Use when the user asks about their Deel team, workforce, or contractor list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the organizational scoping ('in the user's Deel organization'), but says nothing about the default page size of 20, pagination behavior, or how results are ordered — all relevant for a list 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 short sentences with zero redundancy; the resource definition is front-loaded and the usage trigger follows immediately. Nothing is padded or repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only, two-parameter list tool with no output schema and complete annotation coverage, the description is sufficient to call it correctly. The only gap is not clarifying its relationship to the sibling 'list_employees' 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%: 'limit' (default 20) and 'company' (which company to read, pointing to list_companies and describing the default behavior) are fully documented in the schema. The description adds no parameter meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List people (contractors and employees) in the user's Deel organization', with a useful parenthetical clarifying what 'people' covers. However, it never distinguishes itself from the sibling tool 'list_employees', which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user asks about their Deel team, workforce, or contractor list' gives clear triggering context, so the agent knows when this tool is relevant. It gives no exclusions and, notably, no routing away from 'list_employees', so the agent is left to guess between the two similar list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deel_list_contractsDeel List ContractsARead-onlyIdempotentInspect
List contracts from the user's Deel account. Use when the user asks about their Deel contracts, contractors, or team members managed through Deel.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| statuses | No | Comma-separated statuses: active, completed, cancelled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds no behavioral context beyond that – nothing about pagination, default ordering, or what a 'contract' record contains – so it earns only a baseline-with-annotations score.
Agents need to know what a tool does to the 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, purpose front-loaded, zero filler. No repetition of the title beyond what is needed to name the resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 and clear annotations, the description covers what the tool does and when to reach for it. The only gap is disambiguation from sibling people/employee/invoice tools, which matters given how many Deel-adjacent siblings exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (limit, company, statuses) are already documented in the schema, including the pointer to list_companies. The description adds no parameter meaning of its own, making the baseline 3 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+resource ('List contracts from the user's Deel account') and clarifies the domain (contractors/team members managed through Deel). It does not explicitly distinguish itself from nearby siblings such as deel_get_people, list_employees, or deel_get_invoices, so the boundary is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a when-to-use trigger ('when the user asks about their Deel contracts, contractors, or team members'), which is real guidance. However, it offers no exclusions or alternatives, and its overlap with deel_get_people / list_employees means an agent cannot tell from the description which of those to pick for people-vs-contract questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_duplicate_bank_accountsFind Duplicate Bank AccountsARead-onlyIdempotentInspect
Find manual bank accounts that look like the same real-world account as a live bank feed (Revolut Business, Starling, Wise, Mercury, Qonto, Airwallex, Stripe Treasury) already connected — the classic case where a user uploaded statements into a manual account, then later connected the live feed for the same account, leaving duplicate transactions that double-count cash and inflate the P&L. Returns candidate pairs with matched/unmatched transaction counts, date ranges, sample matched pairs, and an AI same-account verdict. Use when the user says their cash or balance looks wrong after connecting a bank, mentions a duplicate account, or asks why a P&L looks inflated. Read-only — use merge_bank_accounts to actually merge a pair.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description corroborates rather than contradicts them while adding the business consequence (cash double-counted, P&L inflated) and the return shape. The only redundancy is restating 'Read-only', which the annotations already carry, so it falls just short of the top mark.
Agents need to know what a tool does to the 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 the failure mode, then the trigger phrases and the sibling routing. The parenthetical list of seven integrations is long but does establish scope. Slightly dense prose, but essentially 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?
With no output schema, the description steps in to define the return value (candidate pairs, matched/unmatched counts, date ranges, sample matched pairs, AI same-account verdict), and the single optional param is fully covered by the schema. Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter with 100% schema description coverage, so the schema already explains the company selection and the list_companies fallback. The description adds nothing about the parameter, which is acceptable at this coverage level but not value-adding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a precise verb and resource (find duplicate bank accounts) and defines the exact scenario: a manual account mirroring a connected live feed, causing double-counted cash. It also distinguishes itself from the mutation path by naming merge_bank_accounts as the tool that performs the merge, so an agent can tell the two apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions (user says cash/balance looks wrong after connecting a bank, mentions a duplicate account, or asks why P&L looks inflated) and an explicit exclusion/routing note ('Read-only — use merge_bank_accounts to actually merge a pair'). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accounts_statusGet Accounts StatusARead-onlyIdempotentInspect
Get the status of annual accounts preparation for the current company. Returns the current accounting period, preparation status, and next steps. Use when the user asks about their annual accounts, Companies House filing, year-end accounts, or corporation tax deadline.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this to be a safe, idempotent, read-only, closed-world operation. The description adds useful behavioral context by stating that it returns the current accounting period, preparation status, and next steps. It does not mention permissions, rate limits, or failure behavior, but those are less critical for a simple read-only status 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 two sentences, front-loaded with the core action and followed immediately by return contents and usage triggers. Every sentence adds useful information with no repetition 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 a simple read-only tool with one fully documented optional parameter and no output schema, the description provides enough context to call it correctly. It explains the returned information and when to use it. Minor gaps remain around sibling differentiation and explicit exclusions.
Complex tools with many parameters or behaviors need more documentation. 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 one optional parameter, and its schema description fully explains how to use it, including the default behavior when omitted. The tool description adds no parameter-specific meaning beyond the schema, so the baseline score of 3 is appropriate given 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: getting the status of annual accounts preparation for the current company. It also lists what is returned, making the tool's purpose clear. It does not explicitly differentiate this from nearby siblings such as get_filed_accounts_history or get_deadlines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage context by naming several triggers: annual accounts, Companies House filing, year-end accounts, and corporation tax deadline. It does not explicitly state when not to use it or name alternative tools for overlapping questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aged_creditorsGet Aged CreditorsARead-onlyIdempotentInspect
Aged creditors report: outstanding bills grouped by supplier, bucketed by days past due (current/not-yet-due, 1-30, 31-60, 61-90, 90+). Use when the user asks "who do I owe", "what bills are due", "show aged payables", or is planning supplier payments. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| as_of_date | No | Ages TODAY's open bills as at this date (YYYY-MM-DD). It is not a historical snapshot: bills paid since that date are not included. Defaults to the end of the user's working period, which is today when they are in the current period. | |
| contact_id | No | Optional supplier contact ID to scope the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety behavior is covered. The description adds useful report semantics by explaining supplier grouping and the specific aging buckets, though it does not describe permissions, pagination, or return format beyond that structure.
Agents need to know what a tool does to the 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 tight sentences with the report definition front-loaded ahead of usage guidance. Every sentence carries useful information 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 three-optional-parameter report tool with rich annotations and full schema coverage, the description is largely complete: it defines the report, its aging buckets, and when to use it. The main minor gap is that it does not explicitly distinguish this from get_bills or get_aged_debtors as 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 description coverage is 100%, so company, as_of_date, and contact_id are already fully documented in the schema. The description does not add parameter-specific meaning beyond what the schema provides, 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 states a specific report resource and scope: outstanding bills grouped by supplier and bucketed by days past due. It distinguishes itself from related siblings such as get_aged_debtors and get_bills through the creditor/owe-focused framing and explicit aging buckets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 concrete user phrases that should trigger the tool, such as "who do I owe", "what bills are due", and "show aged payables", plus the planning-supplier-payments scenario. It does not explicitly name when not to use it or point to alternatives such as get_bills or get_aged_debtors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aged_debtorsGet Aged DebtorsARead-onlyIdempotentInspect
Aged debtors report: outstanding invoices grouped by contact, bucketed by days past due (current/not-yet-due, 1-30, 31-60, 61-90, 90+). Use when the user asks "who owes me money", "what's in our debtors book", "show aged receivables", or wants to pick which clients to chase. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| as_of_date | No | Ages TODAY's open invoices as at this date (YYYY-MM-DD). It is not a historical snapshot: invoices paid since that date are not included. Defaults to the end of the user's working period, which is today when they are in the current period. | |
| contact_id | No | Optional contact ID to scope the report to a single client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description's 'Read-only' line is redundant but not harmful. It adds useful behavioral context by explaining the grouping and aging-bucket structure of the result, though it does not discuss limitations like date semantics or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the report purpose and structure come first, followed by concise usage examples. Every sentence contributes relevant 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?
There is no output schema, but the description sufficiently describes the report's grouping and aging buckets, giving an agent a clear picture of what it returns. Combined with the rich input schema and annotations, the definition is complete 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?
Schema description coverage is 100%, so all three parameters are fully documented in the schema. The description adds no parameter-level detail beyond what the schema already provides, which meets the baseline for high 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 names a specific report ('Aged debtors report'), explains exactly what it contains, and details the aging buckets. This distinguishes it clearly from siblings such as get_aged_creditors or get_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?
It explicitly states when to use the tool with several user-intent examples ('who owes me money', 'show aged receivables', picking clients to chase). This gives an agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attentionGet AttentionARead-onlyIdempotentInspect
Return the proactive, ranked list of everything that currently needs the user's attention across their whole account: missing bank statements, unreconciled transactions, upcoming tax/filing deadlines, a month-end ready to close, annual accounts ready to file, overdue invoices to chase, and open tasks. Use whenever the user asks what they need to do, what's outstanding, what's missing, whether anything needs them, for a status check or 'what should I focus on'. Each item includes a plain-English reason and where to fix it. Proactively offer to help with the most important ones.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond them: the list is proactive and ranked, each item includes a plain-English reason and a location to fix it, and the agent should proactively offer help with the most important items.
Agents need to know what a tool does to the 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 purpose and scope, then follows with usage guidance and output expectations. It is somewhat long but the enumerated categories earn their place by defining the aggregation scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining what comes back. It does so adequately by listing item categories and saying each item includes a reason and a fix location, though it does not describe the exact result shape or empty-state 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?
Schema description coverage is 100%, and the single optional 'company' parameter is fully documented there. The description does not add parameter-level detail beyond the schema, 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?
The description states a specific verb and resource: return a proactive, ranked attention list across the whole account. It enumerates the categories included (missing statements, unreconciled transactions, deadlines, close tasks, overdue invoices, open tasks), making it clearly distinct from sibling tools that each cover only one domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 strong when-to-use guidance with concrete user phrasings such as 'what do I need to do', 'what's outstanding', 'status check', and 'what should I focus on'. It stops short of naming explicit alternatives or when-not-to-use conditions, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet BalanceCRead-onlyIdempotentInspect
Get current account balance
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| account_id | No | Specific account (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds only the word 'current,' which weakly implies live data but does not clarify freshness, currency, whether it's a book balance vs. bank balance, or what the return shape is. It does not contradict annotations but adds little 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?
A single front-loaded sentence with no filler. It is efficient, though its brevity edges toward under-specification rather than optimal conciseness for a tool in a 70-sibling surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 (2 optional params, rich annotations, no output schema), but the description leaves the critical ambiguity unresolved: which balance (bank, ledger, DLA, trial?) and against which company/account default. In a crowded finance toolset, that ambiguity matters more than the tool's structural 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?
Schema description coverage is 100%, and the company parameter's schema description is notably richer than the tool description, naming list_companies as a dependency. Per the rubric, baseline 3 applies when the schema carries the parameter documentation; the description itself adds nothing to parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain 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 current account balance'), so the core action is unambiguous. However, it does nothing to distinguish this from siblings like get_accounts_status, get_financial_snapshot, get_bank_accounts, or get_dla_balance, all of which could plausibly return a 'balance.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus the many balance-adjacent siblings (get_financial_snapshot, get_trial_balance, get_accounts_status, get_bank_accounts). The schema hints at a company/account selector, but the description offers neither context nor exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balance_sheetGet Balance SheetCRead-onlyIdempotentInspect
Get Balance Sheet report as at a given date.
| Name | Required | Description | Default |
|---|---|---|---|
| as_at | No | Report date (YYYY-MM-DD). Default: today | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds essentially nothing beyond restating the as_at parameter as 'as at a given date' – no mention of what the report contains, currency/units, whether comparatives are included, or how a missing company resolves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is efficiently sized, though the terseness is part of why other dimensions score low rather than being a conciseness flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both optional parameters are fully documented in the schema and the read-only annotations cover safety, but with no output schema the description should say something about the report's contents (assets/liabilities/equity sections, period comparatives, currency) so the agent knows what it will receive.
Complex tools with many parameters or behaviors need more documentation. 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%: as_at is documented with format and default, and company is documented with a pointer to list_companies and fallback behavior. The description adds no meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get Balance Sheet report') plus a scope qualifier ('as at a given date'), which is unambiguous about what the tool produces. It does not distinguish itself from close siblings such as get_trial_balance, get_profit_and_loss, or get_financial_snapshot, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over get_trial_balance, get_profit_and_loss, or get_financial_snapshot, nor any prerequisites or exclusions. The only implicit hint is point-in-time reporting, which the agent must read into the phrase 'as at a given date'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_accountsGet Bank AccountsBRead-onlyIdempotentInspect
List bank accounts connected to the company.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only the scope that accounts are connected to the company; it does not mention return format, pagination, or behavior when no accounts are found.
Agents need to know what a tool does to the 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 filler. For a simple list tool, this is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 a simple read-only list operation with full schema coverage and rich annotations. The description is close to complete, though without an output schema it could still clarify what account fields are returned or whether results are paginated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single company parameter is thoroughly documented in the schema, including fallback behavior. The description itself adds no parameter meaning beyond the schema, so 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 and resource: 'List bank accounts connected to the company.' An agent can understand the operation immediately. It does not distinguish this tool from the similarly named sibling find_duplicate_bank_accounts, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what the tool lists but gives no explicit when-to-use guidance, prerequisites, or alternatives. The presence of find_duplicate_bank_accounts among siblings makes the absence of routing guidance a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_billsGet BillsBRead-onlyIdempotentInspect
Get supplier bills/invoices owed by the company. Shows what you owe to suppliers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| status | No | Filter: draft, received, paid, overdue, all | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| contact_id | No | Filter by supplier contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description only adds the payable-vs-receivable conceptual framing, with no detail on pagination, filtering defaults, or return behavior 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?
Two short sentences, front-loaded with purpose. The second sentence ('Shows what you owe to suppliers') partially restates the first, a minor redundancy, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 full schema coverage and annotations, the description is largely sufficient—purpose and direction are clear. The main gap is explicit routing versus the receivables tool, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters (limit, status, company, contact_id) are already documented in the schema. The description adds nothing about parameters, which is acceptable given the complete schema 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 verb and resource ('Get supplier bills/invoices') and clarifies direction with 'owed by the company... what you owe to suppliers', which separates it from a receivables tool like get_invoices. It does not name the sibling explicitly, but the payable framing is a genuine differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when-to-use or when-not-to-use guidance, and no alternative is named. The distinction from get_invoices or get_expenses must be inferred entirely from the 'you owe' phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_budget_vs_actualGet Budget Vs ActualARead-onlyIdempotentInspect
Budget vs actual: how the company is doing against its budget. Use when the user asks about budget, against budget, over budget, under budget, budget vs actual, budget variance, are we on track, or how a month, quarter or the year compares with the plan. Returns, for each income, cost of sales and expense account, the budget, the actual from the ledger, the variance (actual minus budget) and the variance percent, plus totals and net profit. Income above budget is good, costs below budget are good. hasBudget false means the company has not set a budget: say so and point them to /reports/budget, never present zeros as a result. Budgets are set on the Reports page, Budget vs actual tab. Quote figures from the result only.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_month | No | Last month of the period, inclusive (YYYY-MM). Defaults to the current month. | |
| from_month | No | First month of the period (YYYY-MM). Defaults to the start of the current financial year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds substantial context beyond that. It explains what the result contains, how to interpret favorable variances, what hasBudget false means, where budgets are set, and that figures must be quoted from the result only.
Agents need to know what a tool does to the 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 definition is front-loaded with the core purpose, then provides useful trigger phrases, return semantics, and the crucial hasBudget caveat. Despite being detailed, every sentence supports correct tool selection or interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description sufficiently explains the return structure and interpretation rules. Combined with the read-only annotations and fully documented input schema, an agent has what it needs to call and explain 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 coverage is 100%, so the schema already documents company, to_month, and from_month with formats and defaults. The description only indirectly connects month/quarter/year phrasing to the period parameters, so it adds little parameter-level 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 states the resource and purpose directly, then specifies the exact returned fields: budget, actual, variance, variance percent, totals, and net profit for income, cost of sales, and expense accounts. This clearly distinguishes it from general P&L or balance-sheet 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?
It gives explicit trigger phrases such as 'against budget', 'over budget', 'budget variance', and 'are we on track,' plus month/quarter/year comparison guidance. It also states the important exception: when hasBudget is false, say so and point to /reports/budget rather than presenting zeros.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capital_allowance_hintGet Capital Allowance HintARead-onlyIdempotentInspect
Get a tax capital allowance hint for a fixed asset (book depreciation vs tax relief). GB companies get AIA/WDA guidance from official rates; other countries get a jurisdiction note. Use when the user asks about capital allowances, AIA, or tax relief on a specific asset — not a filing computation.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| asset_id | Yes | Fixed asset ID from get_fixed_assets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond annotations: GB companies receive AIA/WDA guidance from official rates, while other countries receive a jurisdiction note, and the output is framed as a hint rather than a computation.
Agents need to know what a tool does to the 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 are front-loaded with the core purpose, scope, jurisdiction behavior, and the key usage condition. There is no redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 low-complexity, read-only hint tool with full schema coverage and rich annotations, the description supplies enough context: what it returns conceptually, how UK vs non-UK behavior differs, and what it explicitly is not. No output schema is present, but the description adequately frames the expected result.
Complex tools with many parameters or behaviors need more documentation. 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 schema. The description reinforces that the hint applies to a specific fixed asset, but it does not add parameter-level meaning beyond 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?
The description states a specific verb and resource: retrieving a tax capital allowance hint for a fixed asset, with the book-depreciation-vs-tax-relief distinction. It clearly bounds the tool as guidance rather than a filing computation, which separates it from computation and reporting 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 gives explicit trigger conditions: when the user asks about capital allowances, AIA, or tax relief on a specific asset. It also states a clear exclusion — not a filing computation — but does not name a specific sibling alternative for that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cash_flow_forecastGet Cash Flow ForecastARead-onlyIdempotentInspect
13-week cash-flow forecast. Returns current bank balance, projected weekly inflows/outflows/running balance for the next 13 weeks, projected low point, recurring patterns detected from history, outstanding invoices expected to clear, recurring invoice projections, and tax deadlines that could draw cash. Use when the user asks about cashflow, runway, "can I afford X", "when will I run out", or wants to plan ahead.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value by disclosing the data sources behind the projection (history-derived recurring patterns, outstanding invoices, tax deadlines), which tells the agent what the numbers are built from. No mention of latency or data-freshness caveats.
Agents need to know what a tool does to the 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 identity (13-week cash-flow forecast) before the content enumeration and then the usage triggers. The return-value list is long but each item earns its place since there is no output schema. Slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the obligation to explain return contents and does so item by item; annotations cover behavior and the lone parameter is fully documented in schema. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single optional `company` parameter with 100% schema description coverage — the schema fully explains defaulting and how to discover companies via list_companies. The description adds nothing about the parameter, which is acceptable at this coverage level but not above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (13-week cash-flow forecast) and enumerates exactly what it returns: bank balance, weekly inflows/outflows/running balance, low point, recurring patterns, outstanding invoices, tax deadlines. This clearly separates it from near siblings like get_balance or get_financial_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-intent triggers: cashflow, runway, "can I afford X", "when will I run out", planning ahead. Strong positive routing signal, though it names no explicit alternative tool or exclusion (e.g. vs get_balance for a point-in-time figure).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chart_of_accountsGet Chart Of AccountsARead-onlyIdempotentInspect
List account categories (chart of accounts). Use when the user asks about their chart of accounts, account codes, or available categories for categorizing transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: income, expense, asset, liability, equity, cost_of_sales | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully carried by structured data. The description adds only that the categories are the ones used for categorizing transactions, with no mention of scope, pagination, or completeness of the returned list.
Agents need to know what a tool does to the 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 purpose and followed by trigger conditions; no filler. The parenthetical '(chart of accounts)' slightly restates the title but earns its place as the common user term.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 only two optional parameters, complete schema coverage, no output schema, and rich read-only annotations, an agent has everything needed to call it. The only real gap is the missing differentiation from list_categories.
Complex tools with many parameters or behaviors need more documentation. 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 the type enum values and the company/default resolution rule are fully documented in the schema. The description adds nothing about either parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List account categories (chart of accounts)') and clarifies these are categories used to group transactions. It stops short of distinguishing this from the sibling list_categories, which reads as the nearest overlap, so the agent cannot fully rule out the wrong tool from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives concrete triggers - the user asking about their chart of accounts, account codes, or available categorizing categories. There are no exclusions or named alternatives, even though a sibling list_categories exists, so a common ambiguity is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactsGet ContactsARead-onlyIdempotentInspect
List contacts (clients, suppliers, leads). Use when user asks about customers, suppliers, or contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order: name (default) or newest first | |
| type | No | Filter by type: client, supplier, lead, other | |
| limit | No | Max results (default 50) | |
| search | No | Search by name or email | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so safety is fully covered. The description adds no behavioural context beyond that — no note on default ordering, result-count limits, or what happens when multiple companies exist (that lives only in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the resource definition is front-loaded before the usage cue. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with fully documented parameters and rich annotations, the description covers what it does and when. The only minor gap is that multi-company scoping is left entirely to the 'company' parameter's own schema text.
Complex tools with many parameters or behaviors need more documentation. 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 including the subtle 'company' selector is documented in the schema and the baseline is 3. The description's mention of clients/suppliers/leads loosely mirrors the 'type' filter but adds no syntax or format 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?
States a specific verb+resource ("List contacts") and immediately disambiguates the resource with a parenthetical (clients, suppliers, leads). No sibling is named as a contrast, so it stops short of a 5, but an agent can tell this apart from get_accounts_status or list_opportunities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when user asks about customers, suppliers, or contacts" gives implied trigger conditions but names no alternative tool and no exclusions. It does not clarify overlap with supplier/creditor-flavoured siblings such as get_bills or get_aged_creditors, so the guidance is useful but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deadlinesGet DeadlinesARead-onlyIdempotentInspect
Get upcoming tax and filing deadlines. Each carries support (files, prepares, workpaper, reminder_only, or null for a payment) and support_note: what AccountsOS does for it. reminder_only means AccountsOS does not produce the form.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| include_completed | No | Include completed deadlines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely non-structured context: the meaning of the support field enumerations and the important caveat that reminder_only means AccountsOS does not produce the form.
Agents need to know what a tool does to the 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 purpose, no filler. The second sentence is dense with field semantics but every clause (support values, support_note, reminder_only caveat) 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 usefully explains the returned fields' semantics and the reminder_only distinction, which is what an agent needs to interpret results. Only gap is the lack of a defined 'upcoming' window and no mention of defaults for include_completed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both company and include_completed are fully documented in the schema. The description adds nothing about either parameter, so the baseline 3 applies; when output schema is absent it also does not state whether 'upcoming' has a default horizon.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Get upcoming tax and filing deadlines.' That is clear enough to act on, but it never distinguishes itself from related siblings such as get_vat_periods, get_tasks, or get_gov_guidance, which also surface tax/filing time 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?
Usage is only implied by the phrase 'upcoming tax and filing deadlines'; there is no statement of when to choose this over get_vat_periods or get_tasks, and no prerequisites or exclusions. The include_completed toggle hints at scope but the description does not elaborate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dividendsGet DividendsARead-onlyIdempotentInspect
List dividend records. Use when user asks about dividends paid, dividend history, or shareholder payments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| tax_year | No | Filter by tax year (e.g. "2025/26") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is fully covered. The description adds no further behavior — no pagination note, result volume, or ordering info. With annotations doing the heavy lifting, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the purpose stated first and the usage triggers immediately after. Ideal size for a simple read 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?
Parameters, safety profile and selection triggers are all covered, which is enough to call it correctly. The one small gap is that with no output schema the description never hints at what a dividend record contains (amount, date, tax year), which would help an agent interpret 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?
Schema description coverage is 100%, including the non-obvious multi-company routing hint for `company`. The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("List dividend records") that no sibling competes with — none of the other get_* tools cover dividends. It's clear, but it stops short of explicitly differentiating itself from adjacent financial-list tools such as get_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 trigger conditions ("dividends paid, dividend history, or shareholder payments"), which is a clear when-to-use signal. It doesn't state when NOT to use it or point to any alternative, but no real alternative exists in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dla_balanceGet Dla BalanceARead-onlyIdempotentInspect
Get the Director's Loan Account (DLA) balance and recent transactions. Shows if director owes company or vice versa, with section 455 tax warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of transactions to return (default 10) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description adds genuine domain context beyond the annotations by disclosing that results include section 455 tax warnings, telling the agent what interpretive content will come back.
Agents need to know what a tool does to the 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 waste; the resource and its meaning are front-loaded and the s455 warning note follows as a useful rider.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so reasonably by naming the balance, recent transactions and s455 warnings. It doesn't mention pagination or what the transaction entries look like, but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the limit and company parameters are already fully documented in the schema, including the default of 10 and the cross-reference to list_companies. The description adds nothing about parameters, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Director's Loan Account balance and recent transactions) with a clear verb, and goes further by explaining what the balance means ('director owes company or vice versa'). It is distinct enough from generic siblings like get_balance or get_trial_balance, though it never explicitly contrasts itself with 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?
Usage is implied rather than stated: an agent can infer this is for checking director loan account status and s455 exposure, but there is no explicit 'use when' framing or mention of alternatives such as get_balance for general account balances. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_linksGet Document LinksARead-onlyIdempotentInspect
Get the documents linked to ONE entity (transaction, invoice, bill, estimate, contact, project, expense claim), or the entities linked to ONE document. Every call needs either document_id, or entity_type together with entity_id: there is no "list all links" call, and a call with neither returns nothing but an error. Look the id up first (get_transactions, get_invoices, search_documents), then call once per id. Use when user asks "what documents are attached to this invoice?" or "show me what's linked to that receipt".
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| entity_id | No | Entity ID to get linked documents for | |
| document_id | No | Document ID to get links for | |
| entity_type | No | Entity type: transaction, invoice, bill, estimate, contact, project, expense_claim |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive, closed-world call, so the safety profile is covered. The description adds genuinely non-redundant behavior: a call with neither document_id nor entity_type/entity_id errors out rather than returning an empty set, and results are limited to a single entity/document per call. It stops short of describing the link record shape, which is the one 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?
Front-loaded with the core constraint first, then the parameter requirement, then workflow, then example queries. Every sentence carries information; the closing quoted user-phrasings are mildly redundant with the earlier scope statement but aid trigger matching. Somewhat dense as a single paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description could say more about what a link record contains (target id, type, maybe link kind). Everything needed to call the tool correctly — scope, parameter combination, prerequisite lookup, per-id iteration — is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds the cross-parameter contract the schema omits: either document_id alone, or entity_type together with entity_id, otherwise an error. That is the single most important usage rule for a 0-required-parameter schema and it is stated explicitly. It doesn't clarify the company parameter's defaulting behavior beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and precisely defines scope: links in either direction between exactly ONE entity and ONE document. The enumeration of entity types and the explicit 'no list-all links call' makes it distinguishable from broader document tools like search_documents or find_related_documents 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 concrete when-to-use triggers ('what documents are attached to this invoice?'), a prerequisite workflow ('look the id up first via get_transactions, get_invoices, search_documents'), and an exclusion ('there is no list all links call'). It also tells the caller to invoke once per id, which handles the multi-entity case explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_estimatesGet EstimatesCRead-onlyIdempotentInspect
Get estimates/quotes sent to clients.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| status | No | Filter: draft, sent, accepted, declined, all | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| contact_id | No | Filter by client contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is fully covered elsewhere. The description adds nothing beyond that – no pagination behavior, no ordering, no note on how large the default result set is – and 'sent to clients' mildly misleads given drafts are retrievable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though it is arguably too terse for a tool with filterable status values and multi-company scoping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description is the only place to learn what an estimate record contains or how results are shaped, and it says nothing about return fields. For a read tool whose schema is otherwise solid, this is the main remaining 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% and the schema itself explains each parameter, including the cross-reference to list_companies for the multi-company case. The description contributes no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get estimates/quotes'), which separates it from list/invoice siblings at a glance. However, the qualifier 'sent to clients' narrows the scope in a way that conflicts with its own status filter (draft, accepted, declined, all), so the stated purpose is only partially accurate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when-to-use guidance and no mention of alternatives, despite obvious overlap with get_invoices, get_recurring_invoices and list_opportunities. The agent gets no signal about when estimates should be pulled instead of invoices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_claimsGet Expense ClaimsCRead-onlyIdempotentInspect
Get expense claims and reimbursement requests.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| status | No | Filter: draft, submitted, approved, reimbursed, rejected | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description merely restates the tool's purpose and adds no behavioral context such as return format, pagination behavior, or whether reimbursement requests are included in the same result set. With annotations carrying the safety burden, the description still fails to add meaningful value.
Agents need to know what a tool does to the 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, efficient sentence with no wasted words. However, it is under-specified for a tool with three filtering parameters and a close sibling, so its conciseness comes at the cost of actionable 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 no output schema and a sibling tool ('get_expenses') that is easily confused, the description should clarify the distinction and what the tool returns. It does neither, leaving the agent without enough context to reliably choose this tool over alternatives or understand the result 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?
Schema description coverage is 100%, and the schema itself documents all three parameters clearly, including the 'company' parameter with a reference to 'list_companies'. The description adds no parameter semantics beyond what the schema provides, 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 states a specific verb and resource ('Get expense claims and reimbursement requests'), so the basic purpose is clear. However, it does not differentiate this tool from the close sibling 'get_expenses', nor does it explain what distinguishes expense claims from expenses. An agent must infer the distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus 'get_expenses' or any other sibling. No context is given about prerequisites, typical scenarios, or exclusions. The agent is left to guess based on the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expensesGet ExpensesARead-onlyIdempotentInspect
List expense claims. Use when the user asks about expenses, expense claims, reimbursements, or receipts they have submitted.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| status | No | Filter by status: pending, approved, rejected, reimbursed, all (default: all) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered elsewhere. The description contributes only trigger vocabulary and says nothing extra about ordering, pagination, or what a "claim" record contains.
Agents need to know what a tool does to the 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 resource, with no filler. Minor redundancy in listing "expenses" and "expense claims" as separate trigger words, but it costs almost nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Rich annotations, fully described three-parameter schema, no output schema, and no nested objects — the description is sufficient to call the tool correctly. The one thing an agent still cannot resolve from the description is when to prefer it over get_expense_claims.
Complex tools with many parameters or behaviors need more documentation. 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%: limit, status enum values, and the company/default-company rule are all documented in the schema. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("List expense claims") that an agent can act on immediately. It does not distinguish the tool from the near-identical sibling get_expense_claims, which is a real ambiguity in this toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user asks about expenses, expense claims, reimbursements, or receipts" gives a clear trigger context, but offers no exclusions and names no alternatives. With get_expense_claims sitting in the sibling list, the missing when-not guidance is a material gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filed_accounts_historyGet Filed Accounts HistoryARead-onlyIdempotentInspect
The year-by-year figures from the accounts this company has filed at Companies House, newest first: balance sheet lines (fixed assets, current assets, creditors, net assets, capital and reserves), average employees, turnover and profit after tax where the filing includes a profit and loss, and the movement in reserves against the previous year (profit after tax less dividends). Use when the user asks how last year or an earlier year went, how the business has grown, what was filed, or wants past figures beside the current books. These are the registry's snapshots, not the ledger: say "as filed" and never blend them with live ledger figures. A micro-entity filing has no turnover or profit; say so rather than treating a null as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes further by warning that micro-entity filings yield nulls rather than zeros and that figures must not be mixed with ledger data. It does not discuss pagination or how many years are returned, 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?
Four dense sentences, well front-loaded with the return contents before the usage trigger and the important caveats. Slightly long but every sentence carries distinct information (fields, when to use, comparability warning, null semantics).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned lines (balance sheet items, employees, turnover, profit after tax, reserves movement). An agent has everything needed to call and interpret 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?
Schema description coverage is 100% and the single optional `company` parameter is fully documented in the schema. The description adds no parameter-level detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (year-by-year figures from accounts filed at Companies House) and enumerates the exact contents returned, ordered newest first. It draws a sharp line against sibling tools like get_profit_and_loss and get_balance_sheet by insisting these are registry snapshots, not ledger figures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 triggers (user asks how a prior year went, how the business has grown, what was filed, or wants past figures beside current books) and an explicit alternative context (live ledger tools). It also prescribes behavior: say "as filed" and never blend with live figures.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financial_snapshotGet Financial SnapshotARead-onlyIdempotentInspect
Get the headline money figures in one call: cash, what the company is owed (open invoices), what it owes (open bills), and net profit this month, the EXACT numbers on the user's Home dashboard. Use for "how am I doing", "how much am I owed", "what do I owe", "what's my position", a quick business health check, or any quick headline-figure question. For how a past month went, use get_profit_and_loss for that month. For invoice/bill line-level detail use get_invoices/get_bills; for ageing use get_aged_debtors/get_aged_creditors.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context by saying this returns the exact Home dashboard headline figures in one call, but it does not discuss permissions, freshness, or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and returned figures, then gives usage examples and sibling routing. Despite being longer than a bare-minimum sentence, every clause helps an agent choose the tool or avoid a wrong sibling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 snapshot tool with one optional parameter, full schema coverage, and annotations that cover safety, the description is complete. It explains what the tool returns, when to use it, and which alternatives handle adjacent questions.
Complex tools with many parameters or behaviors need more documentation. 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 optional company parameter has 100% schema description coverage, including how to obtain company IDs via list_companies and default behavior when omitted. The tool description does not add any further meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 the headline money figures') and explicitly lists the exact figures returned: cash, open invoices, open bills, and monthly net profit. It clearly distinguishes the tool from siblings like get_profit_and_loss, get_invoices, get_bills, get_aged_debtors, and get_aged_creditors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use cases ('how am I doing', 'how much am I owed', 'what do I owe', quick business health check) and names alternatives for adjacent needs: past-month performance goes to get_profit_and_loss, line-level invoice/bill detail goes to get_invoices/get_bills, and ageing goes to get_aged_debtors/get_aged_creditors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fixed_assetsGet Fixed AssetsARead-onlyIdempotentInspect
List fixed assets on the register with cost, net book value, monthly depreciation and status. Use when the user asks about their asset register, depreciation schedules, NBV, or capital items tracked per asset. Filter by active, disposed, or all.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by asset status. Defaults to active. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description is free to add value elsewhere. It does so by enumerating the returned fields (cost, NBV, monthly depreciation, status), which is meaningful transparency given there is no output schema. It does not mention volume, ordering, or pagination behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste: what it returns, when to use it, and how to filter. The core purpose is front-loaded in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with full schema coverage and a clean annotation set, the description covers purpose, triggering intents, filter options, and returned fields. Only return-shape details like ordering or record limits are absent, which is a minor gap for this complexity 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?
Schema coverage is 100%, so both the status enum and the company parameter are already fully documented in the schema, including the default of 'active'. The description restates the status values but adds no syntax or format beyond that. 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?
Specific verb+resource ('List fixed assets on the register') plus the exact data fields returned (cost, net book value, monthly depreciation, status). An agent can clearly separate this from adjacent finance tools like get_capital_allowance_hint or get_balance_sheet without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the user intents that should route here: asset register questions, depreciation schedules, NBV, and capital items tracked per asset. It also states the status filter options. It stops short of naming an alternative tool or a when-not-to-use condition, so it is a strong 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fx_ratesGet Fx RatesARead-onlyIdempotentInspect
Exchange rates: the closing rate for a currency pair on a date, or a series over a range. Use when the user asks for an exchange rate, FX, a currency conversion, what the euro to dirham or pound to dollar rate is, what a currency move cost us, or whether it is cheaper to buy in one currency or another. With one date it returns that day's closing rate. With a range of 62 days or less it returns the daily closing series and the percentage change. Over 62 days it returns monthly averages (up to 36 months). Read-only, needs no company data. Quote rates from the result only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Currency to convert to, three-letter code, for example AED. | |
| date | No | A single date (YYYY-MM-DD). Defaults to today when no range is given. | |
| from | Yes | Currency to convert from, three-letter code, for example EUR. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| end_date | No | End of a range (YYYY-MM-DD). Use with start_date. | |
| start_date | No | Start of a range (YYYY-MM-DD). Use with end_date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/idempotent/openWorld annotations: the 62-day threshold switches from a daily series with percentage change to monthly averages capped at 36 months, no company data is required, and 'quote rates from the result only' warns against fabrication. This is exactly the behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Resource and mode are front-loaded, and the sentence flow (what it is → when to use → what each input shape returns) is logical. The usage examples are slightly list-heavy, but each pulls weight by mapping to a real user phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 still fully explains return shapes (closing rate, daily series plus percentage change, monthly averages) and prerequisites (no company data). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the interaction semantics the schema only hints at – a single date returns that day's closing rate, a start/end range under 62 days returns a daily series, longer returns monthly averages. That materially clarifies how to combine date vs start_date/end_date.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific resource and verb ('Exchange rates: the closing rate for a currency pair on a date, or a series over a range'), instantly distinguishing it from siblings like get_income_by_currency or get_balance. An agent knows exactly what the tool returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives rich when-to-use triggers ('user asks for an exchange rate, FX, a currency conversion, ... whether it is cheaper to buy in one currency or another'), covering several concrete phrasings. It stops short of naming the alternative sibling or stating when not to use it, so it lands just below a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gifi_statusGet Gifi StatusARead-onlyIdempotentInspect
Canada: is my GIFI ready for the T2, which accounts are not mapped or need review, and do the balance checks pass. 'is my GIFI ready', 'GIFI mapping', 'T2 schedule 100 / 125'. Maps any new accounts first. AccountsOS prepares the GIFI trial balance for the accountant's T2 software, it does not prepare or file the T2.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| year_end | No | The fiscal year end, YYYY-MM-DD. Omit for the last completed fiscal year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, but the description says 'Maps any new accounts first,' which implies the tool may modify account mappings. That is a material side effect inconsistent with a read-only annotation, so the description contradicts the structured safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core question, followed by trigger phrases and a scope caveat. The phrase 'Maps any new accounts first' is useful but conflicts with the read-only framing, making the structure slightly less clean than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with no output schema, the description covers the main checks (mapping/review status, balance checks) and clearly bounds the scope away from T2 preparation or filing. The missing piece is clarification of the mapping side effect and its interaction with readOnlyHint.
Complex tools with many parameters or behaviors need more documentation. 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 for both optional parameters, including company selection and fiscal year end. The description adds no parameter-level detail beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: checking whether the GIFI is ready for the T2, which accounts are unmapped or need review, and whether balance checks pass. It also distinguishes this from adjacent tools such as get_trial_balance and get_accounts_status by naming the T2 Schedule 100/125 context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 trigger phrases ('is my GIFI ready', 'GIFI mapping', 'T2 schedule 100 / 125') give clear usage context, and the final sentence clarifies that the tool prepares the GIFI trial balance rather than filing the T2. It does not explicitly say when to choose this over siblings like get_accounts_status or get_reconciliation_status, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalsGet GoalsARead-onlyIdempotentInspect
Get active business/financial goals and their progress. Use when user asks about their goals, targets, or how they are tracking against objectives.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status: active, completed, all (default: active) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| goal_type | No | Filter by type: revenue_target, expense_reduction, savings_target, profit_margin, cash_reserve, debt_reduction, client_acquisition, invoice_collection, custom |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds that it returns progress against goals and defaults to active items, but it doesn't disclose pagination, return shape, or multi-company scoping behavior. With annotations carrying the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste. The core purpose is front-loaded, followed immediately by usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description states that goals and their progress are returned, which gives enough sense of the response. With fully documented optional parameters and rich read-only annotations, the definition is complete enough for an agent to invoke it correctly; only minor detail about status filtering and multi-company behavior is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (status, company, goal_type) are fully documented in the schema. The description adds no parameter-level detail beyond the word 'active,' which is already covered by the status parameter. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (business/financial goals) with a scope (active) and mentions progress. It is clearly distinct from all sibling tools, none of which deal with goals. Minor imprecision: the tool can also return completed/all goals via the status parameter, so 'active' undersells its capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: when the user asks about goals, targets, or tracking against objectives. No alternatives exist among siblings, so no exclusion guidance is needed, but it doesn't clarify when to adjust the status filter to completed/all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gov_guidanceGet Gov GuidanceARead-onlyIdempotentInspect
Search official GOV.UK tax and business guidance. Use when the user asks "what does HMRC say about X?", asks about tax rules, filing requirements, or wants to know the official guidance on a topic like VAT, corporation tax, dividends, or director responsibilities.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | The topic to search for, e.g. "VAT returns", "corporation tax", "dividends", "director loans", "expenses" | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds that the source is official GOV.UK material, which is useful, but says nothing about result format, coverage limits, or how results are ranked. With annotations carrying most of the burden, 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, purpose first then usage, with no filler. The example list is slightly redundant with the schema but still aids intent matching.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only, two-parameter search tool with full schema coverage and no output schema; the description gives enough to call it correctly. Only minor gaps (what results look like, whether the company parameter scopes the search) keep it from a 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 description coverage is 100%, so both parameters and their examples are already documented in the schema. The description repeats the topic examples but adds no new semantics (e.g., query syntax, whether the company param affects scope). Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search official GOV.UK tax and business guidance') and reinforces it with concrete topic examples (VAT, corporation tax, dividends). It doesn't explicitly name the nearest siblings (search_tax_facts, list_tax_rules) to distinguish external official guidance from internal stored rules, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering conditions ('what does HMRC say about X?', tax rules, filing requirements) which an agent can match against user intent. It offers no explicit when-not-use or named alternative tools, so it's strong context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gst_hst_returnGet Gst Hst ReturnARead-onlyIdempotentInspect
Canada: prepare the GST/HST return (GST34) for a period: 'GST return', 'HST return', 'GST report', 'what do I owe CRA', 'my Q3 GST'. Returns every line (101 to 113C), the balance owing or refund, the due date and any warnings. Defaults to the last completed reporting period. Always use this tool for a Canadian GST/HST figure; never add up a return yourself. AccountsOS prepares the return, it does not file it with CRA.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last day of the reporting period, YYYY-MM-DD. Omit for the last completed period. | |
| start | No | First day of the reporting period, YYYY-MM-DD. Omit for the last completed period. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds the substantive limits — the return is prepared but not filed with CRA, a default period is assumed, and warnings may be returned. It doesn't cover partial-period or multi-company edge behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with jurisdiction and action, and the return contents and non-filing caveat each carry real information. The quoted alias list is a little long but serves retrieval matching, so it largely 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 still enumerates what comes back (all lines 101–113C, balance owing/refund, due date, warnings) and states the default reporting period. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents start/end (omit for last completed period) and company selection. The description only restates the default-period behavior, and the company parameter is not mentioned at all, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (prepare the GST/HST return, GST34) plus the jurisdiction (Canada) and the reported outputs (lines 101–113C, balance, due date, warnings). The alias list ('what do I owe CRA', 'my Q3 GST') makes it clearly distinguishable from the VAT siblings such as get_vat_summary and calculate_vat_period.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 routing rule: 'Always use this tool for a Canadian GST/HST figure; never add up a return yourself', plus the default-period behavior when no dates are supplied. It also draws the boundary with the filing step by noting AccountsOS prepares but does not file with CRA.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hmrc_vat_liabilitiesGet Hmrc Vat LiabilitiesARead-onlyIdempotentInspect
Read the company's VAT liabilities (amounts HMRC says are owed and when they are due) directly from HMRC MTD. Use when the user asks "how much VAT do I owe HMRC", "what's outstanding on my VAT account". Requires HMRC MTD connected.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD). Defaults to today. | |
| from | No | Start date (YYYY-MM-DD). Defaults to 12 months ago. A range longer than about a year is capped to the year ending at the end date, so ask in yearly chunks for anything older. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered by structured data. The description adds the meaningful operational constraint that it reads live from HMRC MTD and requires that integration to be connected. It says nothing about rate limits, HMRC-side errors, or what happens when no liabilities exist, so with annotations carrying the safety bar this sits at an adequate 3.
Agents need to know what a tool does to the 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: the operation and return content come first, then usage triggers and the connection prerequisite. Every clause carries information, and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by stating the shape of the return (amounts owed and due dates). Parameters and prerequisites are fully covered between the description and a 100%-covered schema. The only missing piece is guidance on how liabilities differ from obligations/payments, which is a sibling-routing gap rather than a calling 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% and all three parameters (from, to, company) are documented in the schema, including defaults and the one-year capping behavior. The description adds nothing about parameter usage, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read the company's VAT liabilities') and defines what a liability is (amounts HMRC says are owed, and due dates), sourced 'directly from HMRC MTD'. It does not explicitly distinguish itself from the close siblings get_hmrc_vat_obligations and get_hmrc_vat_payments, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('how much VAT do I owe HMRC', 'what's outstanding on my VAT account') plus a hard prerequisite ('Requires HMRC MTD connected'), which is clear usage context. It stops short of naming alternatives to use instead for obligations or payment history, so there is no explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hmrc_vat_obligationsGet Hmrc Vat ObligationsARead-onlyIdempotentInspect
Read the company's VAT obligations (the returns HMRC expects, with their period keys, start/end dates, due dates, and whether they are Open or Fulfilled) directly from HMRC MTD. Use when the user asks "what does HMRC say I owe a return for", "when is my next VAT return due according to HMRC", or to reconcile our periods against HMRC's record. Requires HMRC MTD connected.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD). Defaults to today. | |
| from | No | Start date (YYYY-MM-DD). Defaults to 12 months ago. A range longer than about a year is capped to the year ending at the end date, so ask in yearly chunks for anything older. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds meaningful context beyond them: the data comes live from HMRC MTD (open-world external dependency) and requires an HMRC MTD connection. Missing are any call-out on HMRC API throttling or behaviour on a disconnected 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?
Front-loads the resource and its payload, then triggers, then the precondition. The long parenthetical is dense but every element is useful; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool with no output schema, the description compensates by listing the returned fields and stating the connection requirement. Pagination and behaviour for a not-connected account are the only notable 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% and the schema already documents `from`/`to` defaults and the ~1-year range cap plus the `company` scoping rule. The description adds no parameter-level detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (VAT obligations from HMRC MTD) and enumerates the returned fields — period keys, start/end dates, due dates, Open/Fulfilled status — which cleanly separates it from get_hmrc_vat_liabilities (amounts owed) and get_hmrc_vat_payments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 three concrete user-question triggers plus a reconciliation use case, which is clear situational guidance. It stops short of explicitly naming alternatives to avoid (e.g. get_vat_periods for local periods) or exclusions, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hmrc_vat_paymentsGet Hmrc Vat PaymentsARead-onlyIdempotentInspect
Read the VAT payments HMRC has received on the company's account directly from HMRC MTD. Use when the user asks "has HMRC received my VAT payment", "what VAT have I paid". Requires HMRC MTD connected.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD). Defaults to today. | |
| from | No | Start date (YYYY-MM-DD). Defaults to 12 months ago. A range longer than about a year is capped to the year ending at the end date, so ask in yearly chunks for anything older. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds useful context beyond annotations: data comes directly from HMRC MTD and HMRC MTD must be connected.
Agents need to know what a tool does to the 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 worded sentences: the first states what is read and from where, the second gives usage triggers and the connection prerequisite. No filler 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?
For a read-only, three-parameter tool with full schema coverage and rich annotations, the description covers purpose, source, prerequisites, and triggering questions. It does not describe return shape, but the tool is simple enough and 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 already documents from, to, and company in detail, including date defaults and the yearly capping caveat. The description adds no parameter-specific meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading VAT payments HMRC has received, directly from HMRC MTD. This clearly distinguishes it from sibling tools like get_hmrc_vat_liabilities, get_hmrc_vat_obligations, and get_vat_periods, which concern liabilities, obligations, or periods rather than received payments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 user-question triggers ("has HMRC received my VAT payment", "what VAT have I paid") and a prerequisite ("Requires HMRC MTD connected"). It does not name alternatives or exclusions, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_income_by_currencyGet Income By CurrencyARead-onlyIdempotentInspect
Currency-split income (or expense) totals in ONE compact call: face totals grouped by each transaction currency (e.g. EUR face vs GBP face) PLUS the company functional-currency total for the same set. Use when the user asks "total income in EUR and in GBP", "how much came in in euros vs pounds", "income by currency", or wants face vs converted figures before an FX check. Do NOT page get_transactions to sum — this returns aggregates only (no transaction dump). Defaults to money-in (income); pass direction "out" for spend. Covers bank lines only: invoices and ledger revenue are NOT included, and a company with no bank account returns nothing here, which is not "no income". For income as the books record it, use get_profit_and_loss.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_date | No | End date (YYYY-MM-DD), inclusive | |
| direction | No | in = income / money in (default); out = spend / money out | |
| from_date | No | Start date (YYYY-MM-DD), inclusive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive, and closed-world safety. The description adds substantive behavioral context: aggregates only (no transaction dump), defaults to money-in, bank-line scope only, invoices/ledger revenue excluded, and a subtle failure mode (no bank account returns nothing — not 'no income').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then immediately provides routing examples, do-not-use guidance, defaults, and scope caveats. Every sentence carries useful information; no filler 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?
Although no output schema exists, the description fully describes the return shape (face totals per currency plus functional-currency total) and warns about scope limitations. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. 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 all four parameters are already documented (company default behavior, direction default, inclusive dates). The description reinforces the money-in default but adds no syntax, format, or edge-case guidance beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: currency-split income/expense totals broken into face totals per currency plus functional-currency total. It explicitly distinguishes itself from sibling tools (get_transactions, get_profit_and_loss) so an agent can route correctly without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete user phrasings that should trigger this tool, explicitly says not to page get_transactions for summation, and names get_profit_and_loss as the alternative for book-based income. Covers when-to-use and when-to-avoid in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_incoming_messagesGet Incoming MessagesARead-onlyIdempotentInspect
Read the company's Incoming inbox: messages that arrived by email, WhatsApp, Slack or Telegram (sender, subject, preview, attachments and their processing status), plus a count of documents still processing or failed. Use whenever the user asks what is waiting in Incoming, whether anything came in, about an email or message someone sent, or before saying Incoming is clear. Documents alone are not the whole inbox: a waiting email with a statement attached is a message.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max messages (default 20, max 50) | |
| source | No | Filter by channel: email, whatsapp, slack, telegram, gmail. Omit for all. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| unread_only | No | Only messages not yet opened (default false) | |
| include_processed | No | Also include messages already marked processed (default false: waiting only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered elsewhere. The description adds real behavioral context beyond that: the default is waiting-messages-only (processed ones excluded unless include_processed), channels covered, and a separate count of still-processing/failed 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?
Front-loaded with the core action and payload; three sentences with no filler. The final sentence is a slight restatement of the scoping idea but earns its place by disambiguating against document-search tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 must convey the return shape, and it does: message fields, attachment/processing status, and a processing/failed count. Combined with 5 fully documented optional params, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, source, company, unread_only and include_processed are already fully documented, including defaults. The description restates the processed-vs-waiting distinction but adds no format or syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the company's Incoming inbox') and enumerates the payload (sender, subject, preview, attachments, processing status, plus a processing/failed count). The closing sentence explicitly separates it from document-listing tools: 'Documents alone are not the whole inbox'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers: 'whenever the user asks what is waiting in Incoming, whether anything came in, about an email or message someone sent, or before saying Incoming is clear.' No explicit when-not or named alternative tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_integration_statusGet Integration StatusARead-onlyIdempotentInspect
See every integration for this company and user in one call: what's connected (banks, HMRC MTD, Stripe, Deel, Gmail, WhatsApp, Telegram, Slack, Xero and the rest), what's available but not connected, and whether data is actually FLOWING through each connected feed (flowing / quiet / error, last event, 7-day event count, error message). Use when the user asks about connections or channels, when something they need for the task at hand is not connected, or when their data looks stale or missing — a dead feed is often the real cause. To OFFER to set one up, end your message with [[connect: provider_id]] on its own line (use the provider id from this tool's result, e.g. [[connect: slack]] or [[connect: mercury]]): it renders a card. OAuth providers start sign-in; API-key providers (Mercury, Stripe, Wise, Qonto, Airwallex, Starling) collect the key on a masked in-thread field. Offer at most one connection per message. Never ask the user to paste an API key into the chat box — the card collects it, and the key is never returned to you (you only see connected true/false).
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered, but the description still adds real context beyond them: the OAuth vs API-key provider distinction, the masked in-thread key field, and that the key is never returned (you only see connected true/false). That is useful non-obvious behavior and not a restatement 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?
Front-loaded with the capability, then use cases, then the [[connect:]] mechanics. It is long and the final clauses about API keys and per-message limits are dense, but every sentence carries operational value; minor trimming is possible but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the returned signals: connected/not-connected plus flowing/quiet/error, last event, 7-day event count and error message. An agent knows both when to call it and how to interpret and act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional 'company' param is documented in the schema (name or id, omit for default, cross-reference to list_companies). The description adds nothing new about the parameter itself, so this sits at the baseline-with-schema ceiling rather than earning a 5.
Input schemas describe structure but not intent. Descriptions should explain 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 ('See every integration for this company and user in one call') and enumerates the scope: connected providers, available-but-unconnected, and feed health. This clearly separates it from siblings like get_accounts_status, get_gifi_status and get_reconciliation_status, which concern ledger/account state rather than third-party connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 triggers are given ('when the user asks about connections or channels', 'when something they need is not connected', 'when their data looks stale or missing'), plus the diagnostic rationale that a dead feed is often the cause of missing data. It also gives concrete operational rules: one connection offer per message, end with [[connect: provider_id]], never ask for the key in chat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoicesGet InvoicesARead-onlyIdempotentInspect
Get invoices the user has raised, with summary stats on outstanding and overdue amounts. Use when user asks about invoices, outstanding payments, or money owed to them.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Search by invoice number | |
| status | No | Filter by status: draft, sent, paid, overdue, cancelled, all | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| contact_id | No | Filter by client/contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered; the description adds genuinely new behavioural context by saying the result includes summary stats on outstanding and overdue amounts, which matters because no output schema exists. It says nothing about result limits, pagination, or date-range defaults.
Agents need to know what a tool does to the 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: what it returns first, when to call it second. No filler, no restatement of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with all-optional params, full schema coverage, and no output schema, the description covers purpose, trigger conditions, and the shape of the returned aggregates. Missing only filtering/limit behaviour and any hint about the volume of invoices returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the four filters (search, status, company, contact_id) is fully documented in the schema, including the cross-reference to list_companies. The description adds no parameter-level meaning beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource with scope: it states it returns invoices the user has *raised*, which implicitly separates sales invoices from bills, and notes the response carries outstanding/overdue summary stats. It stops short of naming the near-neighbours (get_recurring_invoices, get_bills, deel_get_invoices) that an agent must also disambiguate against in this large sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the triggering intents: questions about invoices, outstanding payments, or money owed to them. There are no when-not conditions or named alternatives (e.g. recurring invoice templates or aged debtors), so the agent must still infer boundaries for overlapping cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_journal_entriesGet Journal EntriesBRead-onlyIdempotentInspect
Get General Ledger journal entries. Double-entry accounting records.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_date | No | End date (YYYY-MM-DD) | |
| from_date | No | Start date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation. The description adds only a brief domain definition and provides no additional behavioral context such as result volume, ordering, pagination behavior, or permissions.
Agents need to know what a tool does to the 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-loaded with the core action and resource. 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?
Annotations cover the safety profile and the schema fully documents the optional parameters, so the description is minimally adequate. However, with no output schema, it does not describe what the returned journal entries look like or how they are ordered, leaving some context 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 all four parameters are already documented in the input schema. The description adds no parameter-specific meaning or interaction details beyond what the schema provides, making the baseline 3 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: getting General Ledger journal entries. 'Double-entry accounting records' adds domain context that helps distinguish these from generic transactions, though no sibling tool is named as an explicit alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus related siblings such as get_transactions, get_trial_balance, or get_balance. It also does not mention prerequisites, typical use cases, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_month_closeGet Month CloseARead-onlyIdempotentInspect
Check how 'closed' a month's books are. Returns a close-confidence percentage (share of the month's transactions that are categorised AND reconciled) plus exactly what still needs the founder — uncategorised transactions, categorisations you're unsure about, unreconciled lines, payments missing a receipt, and open VAT. Use when the user asks "is my month done?", "close my books", "what's left for May?", "month-end", or any close/period-end question. Defaults to the last complete month. Surface the returned message; offer to help clear each exception.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| period_start | No | First day of the month to check, YYYY-MM-01. Omit for the last complete month. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description still adds real value: the exact semantics of the confidence percentage, an enumeration of the exception categories returned, and the default-period behaviour. It also instructs the agent to surface the returned message, which is non-obvious behavioural guidance not captured in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return metric, then triggers, then defaults and follow-up behaviour — a logical order with no filler. The exception-category list is slightly long but each item is a distinct return field, so it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no required parameters, the description fully carries the burden by explaining what the response contains (confidence percentage plus five exception categories) and what an agent should do with it. Nothing needed to invoke or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the schema (coverage 100%), including defaults and the list_companies pointer, so the description need not compensate. The description only restates the default month behaviour, adding no syntax or format detail beyond the schema, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check how closed a month's books are') and immediately defines the returned metric as a close-confidence percentage with its exact computation. However, it does not differentiate itself from the sibling 'month_close_summary' or 'get_reconciliation_status', which an agent would plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('is my month done?', 'month-end') plus a default ('last complete month'), which is strong usage context. It stops short of naming when NOT to use it or routing to alternatives like month_close_summary, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_opportunityGet OpportunityBRead-onlyIdempotentInspect
Get detailed information about a specific pipeline opportunity/deal, including notes and activity history.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| opportunity_id | Yes | Opportunity/project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false and closed-world, so the safety profile is fully covered. The description adds real value by disclosing the response includes notes and activity history, but says nothing about not-found behavior or the cost/size of that history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; the resource and payload are stated immediately. The only blemish is the hedged 'opportunity/deal' phrasing, which slightly blurs the domain term.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with rich annotations and no output schema, the description is close to sufficient, but it omits the important precondition that an opportunity_id must come from list_opportunities and says nothing about how a missing opportunity is handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema and the baseline applies. The description adds nothing about opportunity_id format or how the optional company parameter interacts with the lookup.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') plus the resource ('pipeline opportunity/deal') and even enumerates the payload ('notes and activity history'). It implicitly contrasts with list_opportunities by scoping to 'a specific' record, but never names 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?
Usage is only implied: 'a specific' suggests the agent must already have an ID, which implies list_opportunities to obtain one. There is no explicit when-to-use/when-not or any mention of the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payroll_summaryGet Payroll SummaryARead-onlyIdempotentInspect
Get year-to-date payroll figures, last run date, and next payment due. Use when user asks about payroll costs, total salary spend, or when the next payroll run is. For a salary, drawings or "what have I paid myself" question read list_employees (the configured salary), this (whether payroll has run) and get_transactions (what left the bank) together: a configured salary with no payroll runs means nothing was paid through payroll, so say that and show what the bank shows.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| tax_year | No | Tax year (e.g. "2025-26"). Defaults to current tax year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile needs no restating. The description adds the meaningful behavioral nuance that a configured salary with zero payroll runs means no payment went through payroll, but says nothing about empty results, multi-company ambiguity, or pagination/limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the concrete return payload before any usage guidance, which is the right ordering. The final sentence is long and carries cross-tool orchestration plus a tax-year-free interpretation rule, which is useful but slightly bloats an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the three returned values, and it covers the zero-payroll edge case that would otherwise confuse an agent. Minor gap remains around multi-company selection behavior, though that is largely delegated to 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 description coverage is 100% and both parameters (company, tax_year) are documented there with defaults and a pointer to list_companies. The description adds no syntax, format, or edge-case detail for either parameter, so it sits at the baseline for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (payroll summary) and enumerates exactly what comes back: YTD figures, last run date, next payment due. That clearly separates it from get_transactions (bank flows) and list_employees (configured salary), which the description names 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?
Gives the triggering user questions ('payroll costs', 'total salary spend', 'when the next payroll run is') and then an explicit multi-tool recipe for the ambiguous 'what have I paid myself' case, including the interpretation rule when payroll has never run. When-to-use and how-to-combine are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profit_and_lossGet Profit And LossCRead-onlyIdempotentInspect
Get Profit and Loss (income statement) report for a period.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_date | No | End date (YYYY-MM-DD) | |
| from_date | No | Start date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds nothing beyond that: no statement of default period, basis (accrual/cash), currency handling, or result shape, which is what an agent needs for a report tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero filler; the generic term is defined inline. It is efficient, though arguably terse to the point of under-specifying 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?
With no output schema and zero required parameters, the description should say what the report returns and what the defaults are when from_date/to_date/company are omitted. Neither is addressed, so the agent cannot confidently call it or interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all three parameters (company, from_date, to_date) are documented with formats, so the schema carries the load. The description only restates 'for a period' without adding date semantics, defaults, or inclusive/exclusive boundary meaning.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Get Profit and Loss (income statement) report') and disambiguates the accounting term with the 'income statement' gloss. It does not differentiate from close siblings such as get_balance_sheet, get_trial_balance, get_balance, or get_project_pnl, so the agent still has to guess which report to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the phrase 'for a period', which hints that dates matter but never says when to choose this over get_project_pnl (project-level P&L) or get_balance_sheet, nor what happens when the period is omitted. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_pnlGet Project PnlARead-onlyIdempotentInspect
Get a deal/project's mini P&L: income, costs by category, and net margin, computed from bank transactions linked to it, plus invoice/bill/expense-claim commitment summaries. Use for "how is project X doing", "project profit", "mini P&L for a project", and for the final report when a project completes. Pass project_id if known, or project_name to resolve it by name.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| project_id | No | Project ID (preferred if known) | |
| project_name | No | Project name to resolve if project_id is not known. Case-insensitive; errors with candidate names if ambiguous. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that by disclosing data provenance — figures are computed from bank transactions linked to the project, not from journal entries — and that commitment summaries come from invoices, bills and expense claims.
Agents need to know what a tool does to the 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 earning its place: what is returned first, then when to use it, then how to supply the identifier. 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?
With no output schema, the description carries the burden of describing the response and does so by naming the P&L components and the commitment summaries. Combined with the read-only annotations and full schema coverage, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the project_id preference and the ambiguity error on project_name. The description restates the id-vs-name routing but adds no syntax, format or edge-case detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a deal/project's mini P&L') and enumerates the components returned: income, costs by category, net margin, plus commitment summaries. The project scoping implicitly differentiates it from the company-wide get_profit_and_loss sibling, so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('how is project X doing', 'project profit', 'mini P&L for a project') and a situational cue (final report when a project completes), plus parameter routing (project_id if known, else project_name). No explicit 'when not to use' or named alternative such as get_profit_and_loss for entity-wide P&L, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectsGet ProjectsARead-onlyIdempotentInspect
List projects (pipeline, active, completed). Use when the user asks about their projects, deals, or pipeline.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Search by project name | |
| status | No | Filter by status: pitched, won, in_progress, completed, lost, all (default: all) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is fully covered. The description adds only the status grouping hint, and that hint ('pipeline, active, completed') does not line up with the schema's actual enum values (pitched, won, in_progress, completed, lost, all), which is mildly confusing rather than clarifying.
Agents need to know what a tool does to the 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 verb and resource, with zero filler. The only deduction is that the second clause covers statuses in a way that creates ambiguity rather than 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?
With three fully documented optional params and complete annotations, the core call mechanics are covered. However, there is no output schema, so the description should say what a returned project looks like or whether results are paginated, and it ignores the company-scoping requirement that matters when an account has multiple companies.
Complex tools with many parameters or behaviors need more documentation. 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 search, status, and company are already fully documented, and the baseline applies. The description adds nothing about parameter behavior beyond loose status naming that conflicts with the schema enum, and it omits the important multi-entity 'company' scoping note.
Input schemas describe structure but not intent. Descriptions should explain 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 projects') and names the status groupings it covers, so an agent knows it returns project records rather than a single project. It does not distinguish itself from near-siblings like get_project_pnl, get_tasks, or list_opportunities, which is the one thing keeping this below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user asks about their projects, deals, or pipeline' gives a clear triggering condition and useful synonyms that broaden matchability. It stops short of naming when NOT to use it or pointing to alternatives such as get_project_pnl for financials.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_qfzp_statusGet Qfzp StatusARead-onlyIdempotentInspect
Get the active company's QFZP (Qualifying Free Zone Person) status for UAE Corporate Tax. Returns the qualifying/non-qualifying income split, de minimis status (ok / warning / breach), free zone name, substance declaration state, and per-zone smart hints (e.g. audited accounts requirement, designated zone VAT, trade license expiry). Returns applicable: false for UK or UAE mainland companies. Use when the user asks about QFZP status, whether they still qualify, their de minimis headroom, or whether they'll owe 9% CT.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description focuses on domain behavior instead: the exact returned fields, the de minimis ok/warning/breach states, per-zone smart hints, and the non-applicability guard for UK/mainland entities. That is useful context beyond the annotations, though nothing is said about what happens when the company argument is ambiguous or stale 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?
Front-loaded with purpose, then return contents, then the applicability caveat, then trigger conditions — a sensible ordering. The enumeration of returned fields is dense but each item is decision-relevant; only the parenthetical smart-hint examples are borderline padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing return values, and it does so concretely (qualifying/non-qualifying split, de minimis status, zone name, substance declaration, hints). Combined with the applicability condition, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional `company` parameter is fully documented in the schema, so the baseline of 3 applies. The description only adds the scoping notion of 'the active company's', without new syntax or selection rules beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the active company's QFZP status for UAE Corporate Tax') and immediately enumerates what the status comprises: income split, de minimis state, zone name, substance declaration. This is clearly distinguishable from sibling status tools such as get_gifi_status or get_vat_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?
Explicit triggering conditions are given ('Use when the user asks about QFZP status, whether they still qualify, their de minimis headroom, or whether they'll owe 9% CT'), plus an exclusion: returns applicable=false for UK or UAE mainland companies. It does not name a sibling as the alternative for those cases, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reconciliation_statusGet Reconciliation StatusARead-onlyIdempotentInspect
Reconciliation per bank account: every uploaded statement with its own opening and closing balance as printed, the books' balance at its end date, the difference and whether they agree (month by month), plus the unreconciled transaction count and the newest unreconciled lines. Use it for "does the bank agree?", "what was the closing balance in March?", before quoting any reconciliation difference, when the user asks to check the books against the bank statements, or about reconciliation progress. This tool only reads: to actually reconcile ("reconcile what you can", "match the receipts", "reconcile my bank") call auto_match_receipts, which does the matching. Never say everything is reconciled without a result from this tool, get_attention or auto_match_receipts. Never say you cannot read balances off statements. Each statement row carries period_start, period_end, opening_balance, closing_balance, book_balance_at_end, difference, agrees and document_id. Pass bank_account_id to look at one account. It also gives the link to download the reconciliation report (PDF or Excel), the report to give an accountant who asks for one.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| bank_account_id | No | Limit to one bank account (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with "This tool only reads" plus a routing rule to auto_match_receipts for mutation. It goes beyond annotations by documenting the per-statement row fields (period_start, period_end, opening_balance, closing_balance, book_balance_at_end, difference, agrees, document_id) and the report download link, plus an epistemic guard against over-claiming.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage triggers, then return fields — a sensible order with no filler sentences. It runs long and the closing remark about the accountant report is slightly redundant with the earlier report-link mention, but every sentence still 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?
No output schema exists, so the description carries the return-shape burden and does so field by field, plus report-format options (PDF or Excel). For a zero-required-parameter read tool with only two params, nothing an agent needs to call it or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, including the list_companies cross-reference for company. The description only repeats that bank_account_id narrows to one account, adding no syntax or edge-case meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (reconciliation status per bank account) and enumerates the exact content returned: each statement's opening/closing balance as printed, books' balance at end date, difference, agrees flag, unreconciled counts and newest unreconciled lines. It explicitly distinguishes itself from auto_match_receipts, which does the matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger questions ("does the bank agree?", "what was the closing balance in March?"), lists when to call it (before quoting any difference, reconciliation progress checks), and names the alternative tool for actual reconciliation with example phrasings. Also states an exclusion-style rule: never claim everything is reconciled without a result from this tool, get_attention or auto_match_receipts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recurring_invoicesGet Recurring InvoicesARead-onlyIdempotentInspect
List recurring invoice templates. Use when user asks about recurring invoices, scheduled invoices, or subscription billing.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status (default: active) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered by structured data. The description adds only that these are templates rather than live invoices; it says nothing about pagination, result ordering, or whether paused records are returned by default (that lives in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first and trigger conditions second, with zero filler. Every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read-only list with fully described params and rich annotations, this is close to sufficient. There is no output schema, so a hint about what a returned template record contains (e.g., next issue date, amount) would have closed the last 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% and both parameters are well documented there, including the 'default: active' behavior and the company-resolution hint pointing at list_companies. The description adds no parameter meaning beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('recurring invoice templates'), and the word 'templates' subtly separates it from get_invoices, which handles actual invoices. It never names that sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 three concrete user phrasings that should trigger this tool (recurring invoices, scheduled invoices, subscription billing), which gives an agent a clear selection context. It stops short of exclusions – nothing says when to prefer get_invoices or get_estimates instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_risk_flagsGet Risk FlagsARead-onlyIdempotentInspect
List the entries Finn flagged for a second look before they reach a VAT return: suspect or duplicate receipts and invoices, VAT added to a zero-rated purchase, VAT that does not fit the total, personal-looking purchases and amounts out of line with a supplier. Use when the user asks about flagged, suspect, duplicate or odd entries, or when get_attention shows entries needing a second look. Each flag has entity_type, entity_id, label, severity, title and detail.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false, so the safety profile is covered; the description adds the meaningful domain context that these flags gate a VAT return. It also names the exact return fields (entity_type, entity_id, label, severity, title, detail), which matters because there is no output schema. It stops short of saying whether flags are deduplicated or whether severity orders results, but that is a modest 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?
The purpose and the flag taxonomy come first, usage triggers second, return shape last — a sensible front-load. The enumeration of flag types is long but it earns its place by letting the agent match user vocabulary to this tool rather than a keyword search.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-optional-parameter read tool with no output schema, the description supplies everything needed: scope, trigger conditions, the sibling it complements, and the shape of each returned flag. Nothing required to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter and the schema describes it fully, including the fallback behaviour ('leave it out to use the only company, or the default') and a pointer to list_companies. The description adds nothing about the company parameter, which is acceptable given 100% coverage — 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?
Specific verb plus resource ('List the entries Finn flagged'), scoped to pre-VAT-return review, and it enumerates the concrete flag categories (duplicate receipts, VAT on zero-rated purchases, personal-looking purchases). An agent can distinguish this from get_attention or get_reconciliation_status 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?
Explicit trigger vocabulary ('flagged, suspect, duplicate or odd entries') maps directly onto user phrasing, and it names the sibling route — entries surfaced by get_attention that need a second look. That is a real when-to-use statement with an alternative, not just an implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statement_checksGet Statement ChecksARead-onlyIdempotentInspect
Each imported bank statement against the books: the statement's period, its opening and closing balance as printed, the book balance on the statement's end date, the difference and whether they agree. Use this to answer 'does the bank agree?', 'what was the closing balance in March?', or before quoting any reconciliation difference. Optional bank_account_id.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| bank_account_id | No | Limit to one bank account (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world safety, so the description is freed to add behavioral value — and it does, explaining that values are computed comparisons (printed statement balance vs book balance on the end date) with a derived difference and agreement flag. It stops short of noting pagination, volume, or what happens when no statements are imported.
Agents need to know what a tool does to the 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 what is returned and followed by the routing guidance; every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, which is the key missing piece an agent would need. Minor gaps remain around result volume/ordering and multi-account behavior when bank_account_id is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully documented there (including the company fallback behavior). The description's 'Optional bank_account_id' merely restates the schema, adding no extra semantics such as valid id formats or behavior when the id does not match an account.
Input schemas describe structure but not intent. Descriptions should explain 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 resource (imported bank statements checked against the books) and enumerates exactly what each result contains: period, printed opening/closing balance, book balance at end date, difference, and agreement flag. It is clearly not a generic reconciliation status tool, though it never names a sibling to differentiate itself 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?
Gives concrete trigger questions ('does the bank agree?', 'what was the closing balance in March?') and a precondition ('before quoting any reconciliation difference'). Strong positive guidance, but no explicit exclusions or named alternative such as get_reconciliation_status for an overall view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tasksGet TasksCRead-onlyIdempotentInspect
Get tasks and to-dos for the company.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| priority | No | Filter: low, medium, high, urgent | |
| completed | No | Filter by completion status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds nothing beyond that — no pagination behavior, default ordering, or whether completed tasks are included by default, which matters given the 'completed' filter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, front-loading the resource. It is efficient but borders on under-specification rather than tight 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 no output schema, the agent gets no help from the description on return shape, but the four parameters are fully self-documenting and annotations cover safety. Adequate to call the tool correctly, though thin on result semantics such as default completion filtering.
Complex tools with many parameters or behaviors need more documentation. 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 four parameters (limit, company, priority, completed) are fully documented in the schema, including the company fallback logic and the priority values. The description only echoes the company scoping and adds no syntax or semantics beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get tasks/to-dos) with clear scope ('for the company'). No sibling tool overlaps with tasks, so an agent can identify it immediately. It stops short of saying what a 'task' contains or how results are ordered, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no exclusions, and names no alternatives. An agent must infer that this is the tool for listing to-dos rather than, say, deadlines or projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_factsGet Tax FactsARead-onlyIdempotentInspect
Look up current UK tax rates, thresholds and allowances (income_tax, national_insurance, corporation_tax, dividends, capital_allowances, vat, pensions, mileage, self_assessment, home_office, mtd). Returns the figure plus its source.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | Specific item within the category (optional — omit for all items) | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| category | Yes | Tax category (e.g. "income_tax", "dividends", "mileage") | |
| tax_year | No | Tax year (e.g. "2025-26"). Defaults to current. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds 'Returns the figure plus its source', which tells the agent that provenance is included and that values are authoritative reference data rather than computed output — useful but modest. It says nothing about how the data is versioned or whether the current year can be missing.
Agents need to know what a tool does to the 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 verb and resource lead, the category enumeration sits inline where it is needed, and the return-value note is a compact trailing clause. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the essential fact that a figure plus its source is returned, and the category enumeration covers the required parameter's domain. Minor gaps remain — nothing on what happens when an item or tax year isn't available, and nothing distinguishing it from the tax-rule and tax-fact search siblings.
Complex tools with many parameters or behaviors need more documentation. 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 earns an extra point by enumerating the eleven valid category values in the parenthetical — material value because the schema declares no enums and only gives three examples. It also reinforces the 'current' default that the tax_year parameter implies.
Input schemas describe structure but not intent. Descriptions should explain 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 — 'Look up current UK tax rates, thresholds and allowances' — and enumerates all eleven supported categories, which is far more precise than the title alone. It does not differentiate itself from overlapping siblings such as search_tax_facts, lookup_tax_rule and list_tax_rules, leaving the agent to guess which one to open.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 phrasing 'Look up current UK tax rates' implies the use case (retrieving authoritative figures rather than computing them), and the category list hints at scope. But there is no explicit when-to-use versus the several tax-related siblings, and no guidance on preferring this over search_tax_facts for lookups vs. free-text search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsGet TransactionsARead-onlyIdempotentInspect
Get transactions for the company with optional filters. Returns currency, amount_gbp and exchange_rate. A row with expected_income: true is an uploaded sales invoice still waiting to be paid, NOT money received: leave it out of any cash, income received or bank balance figure. For currency-split income totals prefer get_income_by_currency.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50, max 100) | |
| offset | No | Skip this many rows (default 0) for pagination | |
| search | No | Search in description | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_date | No | End date (YYYY-MM-DD) | |
| category | No | Filter by category | |
| direction | No | in = income; out = expense | |
| from_date | No | Start date (YYYY-MM-DD) | |
| max_amount | No | Maximum amount | |
| min_amount | No | Minimum amount | |
| needs_review | No | Only the lines Finn could not place with confidence: the same set as the 'transactions need a look' count. | |
| uncategorised | No | Only lines with no category. | |
| max_confidence | No | Only lines whose categorisation confidence is below this percentage (0 to 100). Lines with no confidence score are included. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds the non-obvious semantic trait that expected_income rows are unpaid sales invoices rather than money received, which is exactly the kind of interpretive context annotations cannot carry. It also names the three returned fields an agent needs to reason about currency conversion.
Agents need to know what a tool does to the 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: purpose first, then the returned fields, then the accounting trap, then the sibling alternative. No restatement of the name or 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 13-parameter read tool with no output schema, the description covers the highest-risk misinterpretation (expected_income) and the shape of the returned rows. It does not mention result ordering or that paging defaults live in the schema, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 13 parameters is already documented in the schema. The description says only 'optional filters' and adds no syntax, ordering, or interaction semantics (e.g. how min/max_amount combine with direction). Baseline 3 applies when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get transactions for the company') plus the fields returned (currency, amount_gbp, exchange_rate), so the agent knows what it is retrieving. It names one sibling it is not (get_income_by_currency) but does not differentiate from the many other ledger-reading siblings (get_expenses, get_bills, get_journal_entries).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 alternative for currency-split income totals ('prefer get_income_by_currency') and an explicit exclusion rule: rows with expected_income: true must not be counted as cash or income received. It stops short of saying when this tool is the right call versus e.g. get_expenses or get_bills, but the routing guidance it does give is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trial_balanceGet Trial BalanceBRead-onlyIdempotentInspect
Get Trial Balance showing all account balances.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| to_date | No | End date (YYYY-MM-DD) | |
| from_date | No | Start date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds only that it shows 'all account balances,' but does not explain date filtering behavior, treatment of zero-balance accounts, or what a trial balance includes. With annotations carrying the behavioral burden, this is adequate but thin.
Agents need to know what a tool does to the 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 filler. It is efficient, though its brevity contributes to gaps in usage guidance and return-value 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?
The tool is read-only and schema parameters are fully documented, but no output schema exists and the description only minimally characterizes the result as 'all account balances.' For a financial report with many sibling alternatives, this is minimum viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed descriptions for company, to_date, and from_date. The description adds no parameter-specific meaning beyond the schema, so the 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 gives a specific verb ('Get') and resource ('Trial Balance') and adds that it shows all account balances. It is clear what the tool does, but it does not distinguish trial balance from closely related siblings like get_balance_sheet, get_balance, or get_chart_of_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?
There is no guidance on when to use this tool versus the many other financial-reporting siblings. The description does not mention prerequisites, date-range expectations, or the alternative reports an agent might choose instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vat_periodsGet Vat PeriodsARead-onlyIdempotentInspect
List the company's VAT return periods and their status (open, locked, submitted, failed, overdue), with the net VAT due, due date, and HMRC receipt for any submitted ones. Use this FIRST when the user asks about VAT returns, "which quarters are outstanding", "have I filed Q1", or before calculating/locking/submitting — it gives you the period_id you need for the other VAT tools.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Optional 4-digit year filter (e.g. "2026"). | |
| limit | No | Max periods to return (default 12). | |
| status | No | Optional filter: open, ready, locked, submitted, overdue, failed. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a safe, idempotent read operation, and the description adds useful context about returned statuses and fields such as net VAT due, due date, and HMRC receipt. It does not contradict the annotations, though it leaves ordering and full response shape unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and returned fields are front-loaded, followed by a clear usage directive. The two sentences are dense but contain no redundant or filler 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 read-only listing tool with full parameter documentation and no output schema, the description gives enough information about what the result contains and why to call it. It is not exhaustive about response structure or ordering, but it covers the key decision-relevant details.
Complex tools with many parameters or behaviors need more documentation. 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 four parameters are already documented in the input schema. The description does not add parameter semantics beyond the schema, making 3 the appropriate 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 uses a specific verb and resource: it says it lists the company's VAT return periods and their statuses. It also clarifies that this is the source of the period_id needed by the other VAT tools, which distinguishes it from VAT summary/calculation 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 says to use this FIRST when the user asks about VAT returns, outstanding quarters, whether a quarter was filed, or before calculating/locking/submitting. Those usage conditions are concrete and directly route the agent before related VAT actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vat_summaryGet Vat SummaryARead-onlyIdempotentInspect
Get VAT summary for a calendar quarter, or for any VAT period with start_date and end_date
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| quarter | No | Calendar quarter (e.g., "Q1 2025") | |
| end_date | No | Last day of the VAT period, YYYY-MM-DD | |
| start_date | No | First day of the VAT period, YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds only the period-selection semantics; it says nothing about what the summary contains, currency/rounding behavior, or whether the result is computed live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that carries the tool's core distinction (two input modes) with no filler. Nothing to trim and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 full schema coverage and rich annotations, the description is close to sufficient, but it omits the precedence rule when both quarter and start_date/end_date are supplied — a real ambiguity given zero required parameters — and gives no hint of what the summary reports.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, giving a baseline of 3. The description reinforces the quarter-vs-date-range split but adds no new detail such as date format, whether quarter and dates are mutually exclusive, or how 'company' resolves.
Input schemas describe structure but not intent. Descriptions should explain 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 (get VAT summary) and names the two supported input modes: a calendar quarter, or an arbitrary period via start_date/end_date. It does not differentiate from nearby siblings such as get_vat_periods, calculate_vat_period, or the HMRC-specific VAT tools, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'quarter, or ... with start_date and end_date' phrasing implies which parameters to use in each case, which is a useful but implicit selection rule. There is no statement of when to prefer this over get_vat_periods, calculate_vat_period, or get_hmrc_vat_liabilities, and no note on precedence if both quarter and dates are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_year_on_yearGet Year On YearARead-onlyIdempotentInspect
How this year compares with last year and the years before: are we up or down on last year, revenue and profit trend, margin, cash at year end, year on year, same time last year, how did last year go. Returns the completed years (from the ledger or the filed accounts), the current year to date against the same months last year, and Finn's read of the trend. Use it before any 'how are we doing', planning or forecasting answer when the company has history.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real context: it discloses the data sources ('from the ledger or the filed accounts'), the segmentation of results (completed years, current YTD against same months last year, plus a trend interpretation), and a precondition (company must have history). That is substantive 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 purpose and the usage trigger are front-loaded, which is good, but the middle of the description degenerates into a keyword list ('revenue and profit trend, margin, cash at year end, year on year, same time last year, how did last year go') that partially duplicates itself across two clauses. Roughly a third of the text could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing results, and it does so reasonably: completed years, YTD comparison, and a qualitative trend read. It omits anything about response shape, units, currency handling, or how many years are returned, which prevents a 5 for a read tool with no 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?
There is a single optional parameter with 100% schema description coverage, so the schema already explains company name/id and the list_companies reference. The description adds nothing about the parameter and instead repeats the concept of 'same time last year' as free text, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause names the resource (year-on-year comparison) and enumerates the concrete measures returned (revenue and profit trend, margin, cash at year end). It is distinguishable from siblings like get_profit_and_loss or get_balance_sheet, though it never names a sibling to route away from, which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: use before any 'how are we doing', planning or forecasting answer when the company has history. That is clear situational guidance, but there are no explicit exclusions (e.g., what to use instead for a single-period view or when there is no history), so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_companyLink Company From RegisterAIdempotentInspect
Save a UK (Companies House) or Irish (CRO) company from its official register onto the user's AccountsOS company: registered name, number, status, address, directors, year-end and filing deadlines. Call it only after lookup_company found the company and the user confirmed it is theirs. Returns the year-end and the deadlines it set up: tell the user what they are.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| company_number | Yes | The confirmed Companies House number to link and save. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write nature (readOnlyHint=false), open-world lookup, idempotency and non-destructiveness, so the safety profile is covered structurally. The description adds useful context — the confirmation prerequisite and the fact that it returns year-end and filing deadlines set up. It stops short of saying what happens on an already-linked company or which fields are immutable, so remainders are modest.
Agents need to know what a tool does to the 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 front-loaded sentences: what it saves, when to call it, what it returns. No filler, and the directive to tell the user about deadlines is functional rather than decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by stating the return (year-end and the deadlines it set up) and the instruction to report them. Preconditions, scope and post-conditions are all present for a two-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the multi-company selection logic of `company`. The description only reinforces that `company_number` must be the confirmed Companies House number, which is marginal added meaning over 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?
Specific verb (save/link) plus resource (a UK Companies House or Irish CRO company), and it enumerates what data is persisted (name, number, status, address, directors, year-end, deadlines). It is clearly distinguished from lookup_company, which only finds the company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 precondition: call only after lookup_company found the company and the user confirmed ownership. This both names the alternative and states the gating condition, 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_categoriesList CategoriesBRead-onlyIdempotentInspect
List available transaction categories for categorization
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: income, expense, asset, liability, equity | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The only added signal is the word 'available', implying inactive/archived categories are excluded, and no mention of result size or whether the list is per-company.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though the phrase 'for categorization' is somewhat redundant with 'transaction categories'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-required-parameter read-only listing tool with full schema coverage and complete annotations, the description covers what an agent needs to select and call it. Only the relationship to multi-company scoping and the shape of results remain unstated, and those are either in the schema or non-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?
Schema description coverage is 100%, so both the 'type' enum-like values and the 'company' fallback semantics are already documented in the schema, including a pointer to list_companies. The description adds nothing beyond that, which matches the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource: 'List available transaction categories', and the trailing 'for categorization' clarifies the downstream use. No other sibling deals with categories, so sibling differentiation is implicit and adequate, though it never contrasts with get_chart_of_accounts or get_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing. 'for categorization' hints at intent but leaves it to the agent to infer whether categories should come from here versus the chart of accounts. No guidance on how the type filter should influence calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_companiesList CompaniesARead-onlyIdempotentInspect
List the companies this AccountsOS account can see (for an accountancy practice, its clients), with the default one marked. Call this first when the user has more than one company, then pass company to the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds substantive context beyond that: results are limited to companies visible to this AccountsOS account, the default company is marked, and the output is intended to feed a `company` parameter into other tools.
Agents need to know what a tool does to the 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 compact sentences, front-loaded with the core action and scoping, followed immediately by the operational instruction. No filler, and every sentence conveys distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with annotations covering safety and no output schema, the description gives everything needed: what is listed, whose visibility constrains it, that a default is marked, and how to use the results in later calls.
Complex tools with many parameters or behaviors need more documentation. 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 the schema covers everything and the baseline is 4. The description adds useful downstream semantics by explaining that the listed company identifiers are intended to be passed as `company` to other tools.
Input schemas describe structure but not intent. Descriptions should explain 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 companies"), scopes it to what the authenticated AccountsOS account can see, and clarifies that for an accountancy practice these are its clients. The parenthetical and "default one marked" make it distinguishable from lookup_company, link_company, and update_company, which all act on a single known company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ("Call this first when the user has more than one company") and a follow-up behavior ("then pass `company` to the other tools"). It does not explicitly contrast against lookup_company when a single company is already known, but the multi-company condition is a clear contextual rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_employeesList EmployeesARead-onlyIdempotentInspect
List active employees for the company. Use when the user asks about their employees, staff, team members, or headcount.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| include_inactive | No | Include terminated/on_leave employees (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world, so the safety profile is fully covered. The description adds essentially nothing beyond that: no result size, pagination, ordering, or what 'active' means operationally — and the active/inactive filter is already documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first and usage second, with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple, non-destructive read with rich annotations and a fully documented 2-parameter schema, and no output schema to explain. The only real gap is that a list tool of unspecified cardinality gives no hint about pagination or result limits, but 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%, with both parameters (company, include_inactive) fully documented in-schema including the default and the list_companies pointer. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list employees) plus a scope qualifier (active) and the owning entity (company). It does not distinguish itself from the similar sibling deel_get_people, so an agent cannot tell from this text alone which people-listing tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger phrases ('employees, staff, team members, or headcount') that map user intent to the tool, which is genuinely useful. It gives no exclusions or alternatives, notably it never says how it differs from deel_get_people, so no routing guidance exists for overlap cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_opportunitiesList OpportunitiesBRead-onlyIdempotentInspect
List sales pipeline opportunities/deals. Shows prospects, their stage, value, and next actions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| stage | No | Filter by pipeline stage name | |
| status | No | Which deals to return, judged by the pipeline stage: "active" = still in play (default), "won" = in a closed-won stage, "lost" = in a closed-lost stage, "all" = every deal. This is NOT the project delivery status. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds useful return-content context by saying it shows prospects, stage, value, and next actions, but it does not add behavioral details like pagination or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is two short sentences with no wasted language. The core purpose is front-loaded, and the second sentence efficiently adds useful return-field 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 listing tool with full schema coverage, clear annotations, and no output schema, the description is largely complete. It identifies the data shown and the domain, though it could explicitly mention the relationship to get_opportunity for single-deal lookups.
Complex tools with many parameters or behaviors need more documentation. 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 limit, stage, status, and company. The description adds no parameter-specific semantics beyond what the schema provides, which is acceptable at the baseline of 3 when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: "List sales pipeline opportunities/deals." It distinguishes pipeline deals from project-related siblings by naming sales pipeline and deals, but it does not explicitly contrast with get_opportunity for single-record retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_opportunity or get_projects. The description implies it is a listing tool but gives no exclusions, preconditions, or routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tax_rulesList Tax RulesARead-onlyIdempotentInspect
List all available verified tax/accounting rule keys for the active company's country (every live country has a library), optionally filtered by category. Use this when you need to find the right key for lookup_tax_rule.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| category | No | Optional category filter. UK categories: vat, corporation_tax, self_assessment, paye, mtd, companies_house, dividends, directors, expenses, capital_gains, capital_allowances, pensions, income_tax, national_insurance, rd_relief. UAE categories: corporate_tax, vat, excise_tax, free_zones, esr, ubo, payroll, compliance. Omit to list all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world). The description adds useful context that keys are 'verified', tied to the active company's country, and that every live country has a library. It does not specify ordering or whether keys are returned alone or with labels, keeping it just short of full 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?
Two compact sentences, front-loaded with the core scope and followed by the routing cue. Every sentence earns its place without 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?
For a simple read-only discovery tool with full schema coverage and safety annotations, the description is largely complete. It could optionally clarify whether the returned keys include category metadata, but no output schema exists to require that detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description reinforces optional category filtering but does not add syntax or format details beyond the schema's category 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 uses a specific verb ('List') and resource ('verified tax/accounting rule keys') scoped to the active company's country. It clearly differentiates this discovery tool from the companion lookup_tax_rule tool by naming it directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it: 'when you need to find the right key for lookup_tax_rule.' This gives the agent both the condition and the alternative tool, leaving no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_companyLookup CompanyARead-onlyIdempotentInspect
Look up a company on its official register: search by name to find candidates, or fetch a single company by its number to get the full public record. UK companies come from Companies House (registered name, number, status, incorporation date, registered office address, SIC codes, directors/officers, and filing deadlines). Irish companies come from the CRO (registered name, CRO number, status, company type, incorporation date, registered address and the annual return date); a CRO number is digits only. Use this during onboarding to find and confirm the user's company ("is this your company?"). Read-only: it does NOT save anything; use link_company to save the confirmed company. If the result says the lookup is not available, tell the user plainly and take their company details directly with update_company. French companies come from the Annuaire des Entreprises (registered name, SIREN, status, legal form, incorporation date, registered address, activity code and officers); search by name or by SIREN (9 digits). Other countries have no register lookup; ask the user for their company details directly.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Company name to search for (returns up to ~10 candidates with number, status, and address). Use when you have a name but not a number. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| company_number | No | Exact company number to fetch the full record + directors + deadlines. Use once you know the number (e.g. after the user confirms a search candidate). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint and openWorldHint annotations. It explicitly says the tool does not save anything, points to link_company for saving, and explains the fallback behavior when the register lookup is unavailable. It also discloses the country-specific data sources and record contents, which helps set expectations for an open-world lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core lookup behavior and then organized by country source and fallback path. Although detailed, every section earns its place because there is no output schema and the field lists tell the agent what kind of record to expect. There is no filler or repeated boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an open-world read-only lookup with no output schema, the description is complete enough for an agent to call it correctly. It covers search versus fetch, country support and data sources, returned field categories, onboarding intent, save behavior, and fallback handling. No critical gap remains for the agent to invoke or explain the result.
Complex tools with many parameters or behaviors need more documentation. 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 the three parameters well. The description still adds useful country-specific semantics: CRO numbers are digits only, SIREN numbers are 9 digits, and search may be by name or SIREN. The main parameter meaning is therefore reinforced beyond the schema rather than merely repeated.
Input schemas describe structure but not intent. Descriptions should explain 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: look up a company on its official register. It clearly distinguishes the two modes, searching by name for candidates versus fetching a single full record by company number. It also names link_company and update_company as related tools, so the agent can tell what this tool is responsible 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?
It gives explicit usage context: use during onboarding to find and confirm the user's company, search by name when the number is unknown, and fetch by number once a candidate is confirmed. It also spells out alternatives: use link_company to save, use update_company if lookup is unavailable, and collect details directly for unsupported countries. This is unusually complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_tax_ruleLookup Tax RuleARead-onlyIdempotentInspect
Look up a verified tax or accounting rule by its key. The system automatically routes to the active company's own country library: every live country has one (e.g. India: gst-rate-slabs, personal-income-tax-slabs-new-regime), so never tell a user you only know UK rules. Use this for ANY question about specific deadlines, thresholds, notice periods, regulatory dates, or rules where being wrong would mislead the user. UK examples: vat-registration-threshold, ct-filing-deadline, mtd-itsa-mandatory-50k, dividend-allowance-2026-27, mileage-rates-2026-27. UAE examples: ct-rates, ct-filing-deadline, vat-rate, free-zone-qfzp, no-personal-income-tax. Returns the exact answer + an official source URL you MUST cite in your reply, and where the rule has a validity period, the dates it applies between. ALWAYS prefer this over stating a rule from memory. Apply the rule to the user's facts: when the answer turns on a fact only the user knows (when goods were delivered, when work was finished, when money arrived), ask for that fact, never for the conclusion (ask "when did you deliver it?", not "does it belong in Q3 or October?"). Once the user gives the fact, that is the fact: state the result the rule gives for it, with the source, and do not add that you cannot check it or that their accountant should confirm it. Point to an accountant only when the rule itself leaves the question open. For a question about a PAST period, or a FUTURE one (next year's rates where a budget has already set them), pass as_of so you get the rule for that date rather than the current one. If you do not know the exact key, call list_tax_rules first.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The rule key. Use list_tax_rules to see all available keys for the active company's country. | |
| as_of | No | Optional ISO date (YYYY-MM-DD) the answer must be true for. Pass this whenever the question is about a PAST period - a prior-year return, an old invoice, a historic filing - or a FUTURE one such as next year's rates, because rates change and the current rule may not be the one that applies then. The system walks the rule history and returns the version in force on that date, plus the period it applies to. Omit for questions about today: the answer is then the version in force today. A next-year rule may not be law yet; its answer says so. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds substantial behavior beyond them: automatic routing to the active company's country library, that it returns the exact answer plus a mandatory-cite source URL, that validity periods are included, and that as_of walks the rule history and may return a not-yet-in-law future rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and country-routing, and nearly every sentence carries actionable guidance. It is long and has mild redundancy ('Use this for ANY question...' restated as 'ALWAYS prefer this over stating a rule from memory') plus answer-styling instructions that sit slightly outside the tool's mechanics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 compensates by describing the return payload (exact answer, official source URL, validity period) and the as_of history behavior. An agent has everything needed to call it and to present the result 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 baseline is 3; the description still adds value by framing as_of around past/future-period intent and by pairing key with the list_tax_rules escape hatch. It doesn't add format details beyond the schema, so it doesn't reach 5.
Input schemas describe structure but not intent. Descriptions should explain 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 ('look up a verified tax or accounting rule by its key') and immediately scopes it by explaining the automatic country-library routing. It is clearly distinguishable from list_tax_rules (enumeration) and search_tax_facts (free-text search) named in the same description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 triggering conditions ('ANY question about specific deadlines, thresholds, notice periods, regulatory dates'), a strong exclusion ('ALWAYS prefer this over stating a rule from memory'), the fallback path ('if you do not know the exact key, call list_tax_rules first'), and a routing rule for as_of on past vs future periods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
month_close_summaryMonth Close SummaryARead-onlyIdempotentInspect
Composite read returning everything needed to close a month in one call: P&L for the period, balance-sheet snapshot at period end, VAT summary if registered, unreconciled transaction count, outstanding invoices, and overdue deadlines. Use when the user asks about month-end, "how did we do in [month]", a period close, or wants a one-shot business health view. It saves several round-trips compared to calling each report tool separately.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| period_end | No | YYYY-MM-DD end of the period (e.g. 2026-05-31). Defaults to the last day of the previous calendar month. | |
| period_start | No | YYYY-MM-DD start of the period (e.g. 2026-05-01). Defaults to the first day of the previous calendar month. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: the call is a fan-out composite that saves round-trips, and the VAT section is conditionally included ('if registered'), which an agent could not infer 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?
The payload enumeration is front-loaded where it matters, and the use-case sentence follows immediately. The closing sentence about round-trip savings is mild justification padding but does carry differentiation value, so nothing is seriously wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 does the heavy lifting by enumerating returned sections, and the conditional VAT section clarifies return shape variance. It does not mention pagination or size/volume characteristics of the composite response, which is the main remaining gap for a fan-out read.
Complex tools with many parameters or behaviors need more documentation. 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 already documents the company resolution rules and the period_start/period_end defaults (previous calendar month). The description adds nothing about parameter behavior, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('composite read returning everything needed to close a month in one call') and enumerates the exact payload: P&L, balance sheet, VAT summary, unreconciled count, outstanding invoices, deadlines. It also distinguishes itself from the sibling report tools by framing itself as a one-call aggregate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 triggering contexts ('month-end', 'how did we do in [month]', period close, one-shot health view) and contrasts with the alternative of calling each report tool separately. It stops short of naming which specific sibling to prefer when the user only wants one report, but the routing intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_company_wikiRead Company WikiARead-onlyIdempotentInspect
Read a page from this company's private memory wiki — Finn's long-term per-company notes (preferences, decisions, people, recurring Q&A). Call with slug="index" first to list available pages.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Page slug (e.g. "index", or a specific topic). Defaults to "index". | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false, openWorld=false, so safety is covered. The description adds useful context about what the wiki contains, but nothing about behavior on a missing slug, empty results, or size/pagination limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and the second sentence delivers the actionable calling convention with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read tool with no output schema, the description covers purpose, content, and a discovery path. It is only slightly short on what an agent should expect back (page list shape vs. page body) or how to handle a missing slug.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nevertheless adds the practical convention of starting with slug="index", which is semantic guidance beyond the schema's per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (a page from the company's private memory wiki) and scopes the content type (preferences, decisions, people, recurring Q&A). This makes it separable from the sibling family of search_company_wiki / search_wiki / read_wiki which imply search vs direct page retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 first-call convention: call with slug="index" to discover available pages. It does not, however, state when to prefer this over search_company_wiki or search_wiki, leaving the read-vs-search choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_wikiRead WikiARead-onlyIdempotentInspect
Read a page from Finn's knowledge base — compiled UK (and US) tax and accounting guidance: rules, cross-references, edge cases, plain-English advice for company directors. Call with page="index" first to list all available pages.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Wiki page name (e.g. "index", "corporation-tax", "vat", "ir35", "us-sales-tax-nexus"). Use "index" to see all pages. | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds meaningful context beyond them by describing the nature of the corpus (rules, cross-references, edge cases, plain-English advice), which tells the agent what kind of answer to expect. It doesn't state what happens on an unknown page name or how large pages are.
Agents need to know what a tool does to the 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 resource and its scope, then the immediate next action. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with full schema coverage and annotations, this is close to sufficient. The remaining gap is that there is no output schema, and the description only obliquely indicates return shape; it also leaves the apparent tension between a shared knowledge base and the per-company 'company' parameter unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the 'index' convention and example page names. The description reinforces the index-first pattern but adds nothing about the 'company' parameter, whose role in a supposedly shared knowledge base is unexplained. 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?
A specific verb plus resource ('Read a page from Finn's knowledge base') and it characterizes the content precisely: compiled UK/US tax and accounting guidance for company directors. It doesn't differentiate itself from the similarly named siblings search_wiki and read_company_wiki, which is the main ambiguity an agent would face.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 one concrete workflow instruction — call with page="index" first to enumerate pages — which is genuinely useful. But it never says when to use this versus search_wiki, search_company_wiki, read_company_wiki, or get_gov_guidance, so the choice among the retrieval tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_conversationsRecall ConversationsARead-onlyIdempotentInspect
Recall what you and the user discussed in PAST conversations (across earlier sessions, including voice and video calls). Call this whenever the user asks "what were we talking about last time?", "remind me what we discussed", "where did we leave off?", "what did we cover yesterday?", or refers back to an earlier chat. Returns recent conversation summaries newest-first — each with a short summary, the key topics, any decisions made, and open action items, plus when it happened. ALWAYS call this before saying you don't remember — you DO have access to past conversations through this tool. (Distinct from read_company_wiki, which is curated durable facts, not the back-and-forth of past chats.)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent conversations to recall (default 5, max 15). | |
| query | No | Optional keyword to filter to conversations about a topic (e.g. "VAT", "payroll", "the Acme invoice"). | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered; the description goes further by disclosing the return shape (summary, key topics, decisions, open action items, timestamp) and the newest-first ordering. That ordering detail matters for interpretation and is not in the annotations. It stops short of noting any truncation or empty-result behavior despite the 15-item cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage triggers, then return contents, then the sibling exclusion — a logical order. The four quoted example utterances are slightly repetitive but each serves as a retrieval cue, so little feels wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of return values and does so well (summary, topics, decisions, action items, timing). Missing only edge-case framing — what happens with zero matches, and whether recall spans all companies when company is omitted — which the schema only partially addresses.
Complex tools with many parameters or behaviors need more documentation. 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%, including defaults and max for limit, keyword examples for query, and the list_companies pointer for company, so the baseline is 3. The description adds no parameter-level guidance of its own beyond implying topic filtering exists; naming when to prefer query over a higher limit would have raised this.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Recall what you and the user discussed in PAST conversations') and pins down scope: earlier sessions, including voice and video calls. It also explicitly separates itself from read_company_wiki ('curated durable facts, not the back-and-forth of past chats'), so an agent can pick between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ('what were we talking about last time?', 'remind me what we discussed') that map directly onto user utterances, and adds a hard rule: ALWAYS call this before saying you don't remember. The exclusion against read_company_wiki completes the when/when-not pair.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_company_wikiSearch Company WikiARead-onlyIdempotentInspect
Search this company's private memory wiki by keyword. Returns matching page slugs, titles and excerpts.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search keyword | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, so the description does not need to restate safety. It adds useful behavioral context by saying the wiki is private to the company and by describing the return shape as page slugs, titles, and excerpts. It does not mention result limits or pagination, but its added value is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action. The second sentence efficiently states the return shape with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search tool with strong annotations and full schema coverage, the description is largely complete. Because there is no output schema, it helpfully names the returned fields. It omits pagination or result-limit behavior, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the query and company parameters are already documented. The description reinforces keyword search and company scope but adds no syntax, matching behavior, or handling details beyond the schema. A 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: searching the company's private memory wiki by keyword. It also says what the search returns: matching page slugs, titles, and excerpts. It does not explicitly distinguish this from siblings such as search_wiki, read_wiki, or read_company_wiki, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The keyword-search framing implies this is for finding wiki pages rather than reading a known page. However, it gives no explicit when-to-use guidance, no exclusions, and does not name alternatives like read_company_wiki or search_wiki. In a large sibling set, this leaves routing partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsSearch DocumentsARead-onlyIdempotentInspect
Search uploaded documents (receipts, invoices). Can also list documents by status without a query — status ["pending", "error"] is the Incoming queue. Called with no arguments it lists the newest uploads (up to 25).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Document type (receipt, invoice, statement) | |
| query | No | Search query (optional when filtering by status or type) | |
| status | No | Filter by status: pending, error, processed, matched | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent read, so the description's marginal value lies in its disclosure that calling with no arguments returns the newest uploads capped at 25, and that status=['pending','error'] represents a specific Incoming queue. It does not explain match/relevance semantics or fuller pagination behavior, but it adds real operational context 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 short sentences, front-loaded with the main purpose before revealing alternate modes. No sentence is redundant, and the cap of 25 and the queue mapping are stated compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 4-parameter, optional-only read tool with rich annotations and no output schema, the description covers the key call patterns: search, status filtering, and zero-argument listing. It could say more about sorting, result fields, or whether 25 is a hard cap, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by assigning business meaning to the status values ('pending','error' is the Incoming queue) and by clarifying the no-argument listing behavior. It does not add new format or syntax detail for query, type, or company beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('uploaded documents') and immediately names the concrete domain (receipts, invoices). It also distinguishes a second mode, listing by status or with no arguments, which a plain 'search' label would not convey. It does not explicitly contrast itself with nearby tools such as find_related_documents or get_document_links, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditions for alternate modes: use status when there is no query, pending/error forms the Incoming queue, and no arguments lists newest uploads. It does not name sibling alternatives or say when to prefer find_related_documents or get_document_links instead, so it is strong but not fully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tax_factsSearch Tax FactsARead-onlyIdempotentInspect
Search UK tax knowledge by keyword when unsure which category/item to look up. Returns matching tax facts across all categories.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query (e.g. "employment allowance", "dividend tax") | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| tax_year | No | Tax year. Defaults to current. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is fully covered. The description adds only that matching spans "all categories," which tells the agent the search is not category-scoped; it says nothing about result ranking, result caps, or whether multiple matches or zero matches are returned.
Agents need to know what a tool does to the 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, zero filler. The when-to-use condition is front-loaded before the return behavior, which is the right order for an agent scanning for routing signals.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 three-parameter read tool with full schema coverage, full annotations, and no output schema, the description covers purpose, trigger condition, and result scope adequately. It stops short of describing what a match looks like or how many come back, which is the one remaining gap an agent might care about.
Complex tools with many parameters or behaviors need more documentation. 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 carries a meaningful description, including a cross-reference to list_companies for the company argument. The description's only added semantic is "by keyword," which is a marginal clarification of the query parameter beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain 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 ("Search UK tax knowledge by keyword") and clarifies the result scope ("matching tax facts across all categories"). It implicitly differentiates itself from direct-lookup siblings by saying it's for when you're "unsure which category/item to look up," but it never names get_tax_facts or lookup_tax_rule explicitly, so the separation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"when unsure which category/item to look up" gives a clear triggering condition for this tool over a targeted lookup. What's missing is the flip side — no explicit "use get_tax_facts when you already know the category" exclusion naming the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_wikiSearch WikiARead-onlyIdempotentInspect
Search Finn's knowledge base by keyword. Returns matching page names and excerpts. Use when unsure which page covers a topic.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search keyword (e.g. "marginal relief", "employment allowance", "flat rate scheme") | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description usefully adds what is returned (matching page names plus excerpts), but says nothing about result limits, ranking, or empty-result behavior even though there is no output schema to fill that 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 purpose, then return value, then usage trigger. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 read-only search with a fully documented schema, the description covers purpose, output shape, and the main usage trigger. The remaining gap is routing versus near-identical siblings such as search_company_wiki and read_wiki, which an agent would still have to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are well documented in-schema, including examples for query and a list_companies cross-reference for company. The description adds no parameter meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search Finn's knowledge base by keyword") plus what comes back (page names and excerpts), so the agent knows exactly what class of operation this is. It does not differentiate itself from the very similar siblings search_company_wiki and read_wiki, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when unsure which page covers a topic" gives a genuine trigger condition and implies the follow-up flow to read_wiki. However, nothing distinguishes this from search_company_wiki or search_documents, and there is no when-not guidance, leaving real ambiguity among near-identical siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_companySet Up CompanyADestructiveIdempotentInspect
Save the user's answers about their own business to their AccountsOS company: what kind of business it is (entity_type, for example sole_trader or ltd), the country it is registered in (ISO code such as GB, IE, US), the company or registration number, the name, what it does, the currency, the year-end month and VAT registration. Use it during setup, and when the user corrects one of these details. For a UK or Irish limited company with a registration number, call lookup_company and then link_company instead, which fills everything from the official register. Only pass what the user told you; never guess.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Registered/legal company name (the business being kept books for). | |
| company | No | Which company to read, by name or id, when the account has more than one (see list_companies). Leave it out to use the only company, or the default. | |
| country | No | ISO 3166-1 alpha-2 country code where the business is registered (for example GB, IE, US, AU, AE). Sets which tax rules apply. Refused once the company has bookkeeping entries. | |
| vat_number | No | VAT/GST registration number. Providing a number also marks the company VAT registered unless vat_registered is explicitly false. | |
| entity_type | No | Business structure (e.g. "ltd" for a UK limited company, "sole_trader", "llp", "fzco" for a UAE free-zone company). Use the value appropriate to the company's country. Drives which tax rules apply. | |
| trading_name | No | Trading name / "doing business as", if different from the registered name. | |
| company_number | No | Company/registration number (e.g. UK Companies House number, IE CRO number, DK CVR number). Setting this lets us sync filing deadlines from the registry. | |
| vat_registered | No | Whether the business is VAT/GST registered. Set true when the user confirms they are registered, false when they confirm they are not. Also false for a business whose sales are all VAT-exempt and that cannot reclaim VAT (an investment fund, a Belgian Article 44 exempt taxpayer): it files no periodic return, so keep its vat_number and pass vat_registered false. If a UK registration has been CANCELLED, pass vat_deregistration_date instead. | |
| business_summary | No | What the business does, in one plain sentence in the user's own words, e.g. "Mobile dog groomer" or "Two-person web design agency". Save it whenever the user says what they do: it tells categorisation and advice what kind of business this is. | |
| default_currency | No | ISO 4217 default currency code, e.g. GBP, EUR, USD, AED, DKK. Uppercased automatically. | |
| incorporation_date | No | Date the company was incorporated, YYYY-MM-DD. Pass it whenever the user tells you, and ALWAYS for a UK limited company with no company number yet (just incorporated, or not on Companies House yet): use today for "just incorporated". For such a company it sets up the estimated first-year deadlines (Corporation Tax registration, first confirmation statement, first accounts, first CT return) so the founder sees their first year mapped out; tell them what is coming and when. | |
| financial_year_end_month | No | Month (1-12) the financial year ends. Only set when the user tells you their year-end; do not guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is conveyed structurally. The description adds useful behavioral context via the 'never guess' instruction and the register-first routing for UK/IE companies, but it never explains overwrite semantics — whether omitted fields are preserved, what an existing country/entity_type change does to prior data (the schema notes country is 'refused once there are bookkeeping entries', which the description omits). For a 12-parameter mutation flagged destructive, that is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the field list, followed by the usage rule and the sibling routing, with no padding sentences. The field enumeration is long but functional — it doubles as the list of things the agent should elicit from the user — though it could be trimmed slightly without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 12 optional parameters, no output schema and full schema coverage, the description supplies exactly what structured fields don't: when to call it, when to use a sibling instead, and the anti-guessing constraint. Return values are not needed since no output schema exists and the effect is a save. An agent can invoke this correctly from the definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in detail, including the conditional vat_registered/vat_deregistration_date logic. The description's parameter mentions (sole_trader/ltd, GB/IE/US ISO codes) largely restate schema content rather than adding semantics beyond it. 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 opens with a specific verb+resource ('Save the user's answers ... to their AccountsOS company') and enumerates the exact attributes covered (entity type, country, registration number, name, activity, currency, year-end, VAT). It also explicitly distinguishes itself from lookup_company and link_company, so the agent can separate it from the read-from-register path without consulting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('during setup, and when the user corrects one of these details') and an explicit exclusion with the alternative named ('For a UK or Irish limited company with a registration number, call lookup_company and then link_company instead'). It also states the data-collection rule ('Only pass what the user told you; never guess'), which is real routing guidance, not filler.
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.
82 tool updates
- First observed
add_document - First observed
calculate_vat_period - First observed
check_vat_number - First observed
deel_calculate_employment_cost - First observed
deel_calculate_take_home_pay - First observed
deel_get_invoices - First observed
deel_get_payment_receipts - First observed
deel_get_people - First observed
deel_list_contracts - First observed
find_duplicate_bank_accounts - First observed
find_related_documents - First observed
get_accounts_status - First observed
get_aged_creditors - First observed
get_aged_debtors - First observed
get_attention - First observed
get_balance - First observed
get_balance_sheet - First observed
get_bank_accounts - First observed
get_bills - First observed
get_budget_vs_actual - First observed
get_capital_allowance_hint - First observed
get_cash_flow_forecast - First observed
get_chart_of_accounts - First observed
get_contacts - First observed
get_deadlines - First observed
get_dividends - First observed
get_dla_balance - First observed
get_document_links - First observed
get_estimates - First observed
get_expense_claims - First observed
get_expenses - First observed
get_filed_accounts_history - First observed
get_financial_snapshot - First observed
get_fixed_assets - First observed
get_fx_rates - First observed
get_gifi_status - First observed
get_goals - First observed
get_gov_guidance - First observed
get_gst_hst_return - First observed
get_hmrc_vat_liabilities - First observed
get_hmrc_vat_obligations - First observed
get_hmrc_vat_payments - First observed
get_income_by_currency - First observed
get_incoming_messages - First observed
get_integration_status - First observed
get_invoices - First observed
get_journal_entries - First observed
get_month_close - First observed
get_opportunity - First observed
get_payroll_summary - First observed
get_profit_and_loss - First observed
get_project_pnl - First observed
get_projects - First observed
get_qfzp_status - First observed
get_reconciliation_status - First observed
get_recurring_invoices - First observed
get_risk_flags - First observed
get_statement_checks - First observed
get_tasks - First observed
get_tax_facts - First observed
get_transactions - First observed
get_trial_balance - First observed
get_vat_periods - First observed
get_vat_summary - First observed
get_year_on_year - First observed
link_company - First observed
list_categories - First observed
list_companies - First observed
list_employees - First observed
list_opportunities - First observed
list_tax_rules - First observed
lookup_company - First observed
lookup_tax_rule - First observed
month_close_summary - First observed
read_company_wiki - First observed
read_wiki - First observed
recall_conversations - First observed
search_company_wiki - First observed
search_documents - First observed
search_tax_facts - First observed
search_wiki - First observed
update_company
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1618 npm1MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs113 npm55 PyPIMIT
- AlicenseAqualityCmaintenanceRevnuvo Company Intelligence tells AI agents what changed at a company, with evidence. It observes company websites, technologies, and DNS over time and returns timestamped, confidence-aware changes, signals, and monitoring.9MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.