Saybooks
Server Details
Books your AI keeps from your own bank statements: cards, loans, bills, receipts and the tax year.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- alviso/saybooks
- GitHub Stars
- 0
- Server Listing
- Saybooks
TDQS
Scored across 236 tools
Module prefixes (core_, o2c_, purch_, crm_, hunt_, etc.) give a coarse map, but several clusters genuinely overlap: solo_draft_invoice/issue/void/record_payment/statement duplicate o2c_create_quote/create_order/void_invoice/record_payment/customer_statement on the same invoicing and cash concepts, and crm_add_contact vs hunt_add_contact both mean 'add a person'. Reviewing surfaces also crowd each other (purch_review_transaction vs purch_review_batch vs purch_accept_suggestions, rec_match vs purch_match_receipt vs purch_record_reimbursement, o2c_apply_payment vs solo_apply_payment). The long descriptions help once a module is contextually in play, but at the set level an agent must reason hard to pick the right one.
Overwhelmingly consistent snake_case with a stable module-prefix + verb_noun shape (core_create_customer, o2c_confirm_order, purch_add_rule, rec_sign_off). Deviations are systematic rather than chaotic: pure read/list views often drop the verb (inv_stock, o2c_backorders, purch_accounts, purch_payables, crm_drafts) while others use list_/get_ explicitly (crm_list_contacts, o2c_get_order), so the same kind of read is named two ways.
236 tools is far beyond what an agent can hold in working context, and the surface repeatedly re-implements the same operations under different modules (two payment-application tools, two void-invoice tools, two contact-creation tools). Even granting a multi-module ERP scope, this is an extreme count that forces context-blown selection rather than well-scoped coverage; the server itself has to ship core_schema and core_next_actions as navigation aids for it.
Coverage is unusually deep: full order-to-cash, procure-to-pay with 3-way match, inventory and valuation, GL close/reopen/entries, bank-feed review, reconciliation and sign-off, CRM/prospecting, loans, tax filings, plus explicit human-only gates and undo paths for most write acts. Remaining gaps are minor — no first-class list/get-all for issued invoices or sales orders outside aging/statement/detail views, and no update/delete for items or customers — but agents can generally work around them.
Available Tools
236 toolsbridge_accountsAccount mapARead-onlyIdempotentInspect
Our fixed derivation accounts, which ones the books use, and what each is called in the ledger of record. Read this before any export. Anything in use and unmapped is a question for the person or their accountant, never a guess.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 safety is covered. The description adds genuinely non-obvious behavior: the account set is fixed, some accounts may exist in use without a mapping, and the tool will not invent a mapping for those — the agent must escalate instead. It does not describe the shape of the returned map, but that gap is 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?
Two short sentences, the usage rule front-loaded, and the escalation constraint stated in the same breath. Nothing is repeated from 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 no-param, no-output-schema read with full annotation coverage, the description supplies the two things an agent actually needs: when to call it and what to do about unmapped accounts. It could say slightly more about what the returned mapping looks like, but that is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline for a no-param tool applies. The description correctly implies a whole-map read with no filtering.
Input schemas describe structure but not intent. Descriptions should explain 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 enumerates exactly what the map contains: the fixed derivation accounts, which of them the books actually use, and their ledger-of-record names. That is a specific resource with concrete contents, though it is phrased as a noun list rather than a verb, and it never names a sibling (e.g. bridge_map_account, bridge_exports) to distinguish itself from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Read this before any export" gives an explicit precondition for use, and the second sentence gives a clear rule for the ambiguous case (in-use but unmapped accounts get escalated to a person/accountant, not guessed). It stops short of naming the export sibling or saying when the tool is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_exportExport to the ledgerAInspect
Hand the period over: build the file in the ledger's shape, record what went out, and return a download link. Show the person bridge_preview and its totals first; this is the act that says the period has been handed over. Omit "from" to continue from the last hand-over in this format — month-end becomes a diff, not a re-key. Refused while an account the period uses is unmapped, naming which. Hand over the returned link; never relay the file's bytes. The file is kept exactly as it went out, with its control totals and a hash, so a later question about what the ledger received has an answer. Effects: journal file built for the period; hand-over recorded with its control totals; download link minted.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Hand over everything on or before this date. ISO date, YYYY-MM-DD. | |
| from | No | Start of the period. Omit to continue from the last hand-over in this format. ISO date, YYYY-MM-DD. | |
| format | Yes | Which ledger shape. | |
| reason | No | Why — "August close", "first hand-over to their Xero". | |
| currency | No | Which currency to hand over (ISO 4217). Required when the period holds more than one: a ledger takes one currency at a time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say not-readOnly, not-destructive, not-idempotent), the description discloses refusal conditions and who they name, the effects list (file built, hand-over recorded, link minted), retention with control totals and a hash, and a handling rule ('never relay the file's bytes'). This is exactly the mutation context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and effects summarized at the end in a scannable 'Effects:' line. Slightly mannered phrasing ('Hand the period over', 'the act that says the period has been handed over') adds words without adding precision, keeping it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent write with no output schema, the description covers what is produced (a download link, not bytes), what is persisted for later audit, and what blocks the call. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a step above by explaining the consequence of omitting 'from' ('month-end becomes a diff, not a re-key') rather than just restating the schema. The multi-currency requirement for 'currency' is left to the schema, so it is not a full 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?
The opening clause names a concrete verb and resource ('build the file in the ledger's shape', 'return a download link') and immediately distinguishes itself from the sibling that only previews (bridge_preview). An agent can tell this is the committing export act versus bridge_preview and bridge_exports without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit ordering rule ('Show the person bridge_preview and its totals first'), an explicit variant of the call ('Omit "from" to continue from the last hand-over'), and an explicit precondition ('Refused while an account the period uses is unmapped'). When-to-use, how-to-vary, and when-it-fails are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_exportsHand-oversARead-onlyIdempotentInspect
What has been handed to the ledger, in which shape, through when — with the totals and the file that went out. The answer to "did the ledger get August?". Each row keeps its control totals and a hash of the exact file; the link re-downloads that file, not a fresh derivation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, so the description adds genuine value by disclosing what a returned row contains (control totals plus a hash) and, critically, that the link re-downloads the exact original file rather than re-deriving it. That is a behavioral guarantee an agent cannot infer from the annotations, though nothing is said about ordering or time bounds of the listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it is, then the use case, then the row contract. The phrase "in which shape, through when" is slightly oblique where "in what form, up to which date" would be plainer, but 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 parameters, no output schema and full annotation coverage, the description carries the remaining burden and does explain the shape of a row and the meaning of the link. The only gap is scope of the listing (all exports ever, or a window), which matters given the schema offers no 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?
The input schema takes zero parameters, so per the baseline this sits at 4. There is nothing extra the description could reasonably add about parameters it does not have.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource precisely (what has been handed to the ledger) with totals and the outgoing file, which tells an agent this is a historical log of exports rather than a derivation. However, it never names the near-identically named sibling bridge_export, so an agent choosing between the singular and plural tool gets no help from the 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?
The rhetorical question "did the ledger get August?" gives a concrete usage scenario, which is more than most tools offer. But there is no explicit when-not guidance and no mention of alternatives such as bridge_export or bridge_preview, both of which sit in the same namespace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_financialsPreliminary financialsARead-onlyIdempotentInspect
A profit and loss for a period and a balance sheet at its end, derived from the books and marked preliminary, with everything they leave out said on their face. For "how did we do this quarter", "generate preliminary Q1 financials", or a number for the accountant before the close. Pass the period as a quarter (2026-Q1), a month (2026-09), a year, or from and to. Say "preliminary" when you present it, and read the notes out: rows not reviewed yet are not in the figures, and a transfer account the books cannot classify is a question for the person (savings, owner draw, or a loan or card). Do not round, restate or "fix" the figures; if they look wrong, the fix is in the books (review the rows, name the transfer), and the statements follow. One currency at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of a custom period; the balance sheet is as of this date. ISO date, YYYY-MM-DD. | |
| from | No | Start of a custom period (with to). ISO date, YYYY-MM-DD. | |
| period | No | A quarter (2026-Q1), a month (2026-09) or a year (2026). | |
| currency | No | Which currency (ISO 4217), when the books hold more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses real behavioral traits: figures are preliminary, unreviewed rows are excluded from the numbers, unclassifiable transfer accounts surface as a question for the user, currency is limited to one at a time, and the agent must not round, restate or 'fix' figures. It also says the correct remedy is in the books, not the report. This is materially more than the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core output definition is front-loaded in the first sentence and the rest is operational guidance, so most sentences earn their place. Some phrasing is ornate ('said on their face') and the presentation instruction ('Say "preliminary" when you present it') runs long, costing a bit of clarity for an otherwise tight block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description explains what comes back (P&L plus balance sheet plus the notes on what is excluded), how it should be labeled, and what to do when figures look wrong. For a read-only report with zero required parameters, an agent has everything needed to call and present it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds meaning: it mirrors the period grammar (quarter 2026-Q1, month 2026-09, year, or from/to) and adds the constraint that only one currency at a time is handled, which clarifies when the currency parameter matters. It does not explain behavior when both period and from/to are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the specific deliverables (a profit and loss for a period plus a balance sheet at its end) and states they come from the books and are marked preliminary. The phrase 'with everything they leave out said on their face' signals that the output carries notes on exclusions, which no sibling tool (gl_entries, tax_return, inv_valuation) provides. An agent can identify this as the statement-generation tool without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete trigger phrasings ('how did we do this quarter', 'generate preliminary Q1 financials', 'a number for the accountant before the close') and the accepted period formats, which is strong context. It does not name an alternative tool or state when not to use this one (e.g., when the books aren't reviewed yet, use gl_changes instead), 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.
bridge_map_accountMap an accountAInspect
Say what something is called in the ledger of record: one of our accounts, or one of the person's own spending categories or statement accounts. The mapping is the accountant's answer, not a guess: ask for the code and the name exactly as their chart spells them, one at a time, and write them as they are given. Xero imports match on the code, QuickBooks on the name, so supply both where you can.
Three kinds. "derivation" is one of our fixed accounts (receivables, revenue, cash, bank fees). "category" is a word the person used when reviewing their spending — groceries, software, rent — and it needs their expense or income account. "source" is the account a statement came from, their bank or card, and it needs that account in the chart. bridge_accounts lists all three and says which are in use. The tax rate label is only needed where their import expects one. Changing a mapping never rewrites a hand-over that already went out. Effects: account mapping written.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Their account code, as their chart spells it (Xero AccountCode). | |
| kind | No | What is being mapped. Defaults to one of our derivation accounts. | |
| name | No | Their account name, exactly (QuickBooks Account Name). | |
| note | No | Anything the accountant said about it. | |
| reason | No | Why — part of the record. | |
| account | Yes | Which one: an account name for "derivation", the person's word for "category", the statement account label for "source". | |
| tax_rate | No | The tax rate label their import expects on this account, if any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it states that changing a mapping never rewrites a hand-over that already went out, and closes with 'Effects: account mapping written.' The annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so the description fills in important operational context. It does not cover permissions or error behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then transitions into usage rules, the three mapping kinds, and effects. It is somewhat long but appropriately sized for a seven-parameter mapping tool with multiple modes. Most sentences carry useful information, though a few could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and seven parameters, the description covers the essential context: the three mapping kinds, what each requires, import-matching behavior, and the effect of writing a mapping. It does not describe return values or error cases, but the annotations and 100% schema coverage reduce the need for that. The definition is complete enough to support correct use.
Complex tools with many parameters or behaviors need more documentation. 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 still adds useful semantics by explaining what the 'account' parameter means for each kind, how code and name are used by Xero and QuickBooks imports, and that the tax rate label is only needed where the import expects one. It does not add much for parameters like note or reason, but it meaningfully enriches the most important fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly explains that this tool records how something is named in the ledger of record, covering derivations, categories, and source accounts. It distinguishes itself from bridge_accounts by explaining that bridge_accounts lists mappings while this tool writes them. The phrasing is slightly indirect at the start, but the overall purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage instructions: ask for the code and name exactly as the chart spells them, supply both where possible because Xero matches on code and QuickBooks on name. It defines the three mapping kinds and what each requires, and points to bridge_accounts for listing. It does not explicitly state when not to use the tool, but the practical guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_previewPreview the hand-overARead-onlyIdempotentInspect
The journal for a period in the ledger's shape, with control totals and anything still unmapped. Records nothing. Show the person the totals and the first rows before bridge_export. Omitting "from" previews what has not been handed over yet in that format.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Up to and including this date. ISO date, YYYY-MM-DD. | |
| from | No | From this date. Omit to continue from the last hand-over in this format. ISO date, YYYY-MM-DD. | |
| rows | No | How many sample rows to show. Default 12. | |
| format | Yes | Which ledger shape. | |
| currency | No | Only this currency (ISO 4217). A period with more than one must be handed over a currency at a time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, but the description adds the substantive guarantee 'Records nothing' and describes what the response contains (control totals, unmapped accounts, first N rows). That is real behavioral context beyond the structured fields, though it says nothing about size limits or what happens when the period has unmapped accounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool returns and the no-write guarantee before the routing instruction. Slightly awkward register ('The journal for a period in the ledger's shape') costs a point but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming control totals, sample rows and unmapped items. For a 5-parameter read/preview tool that is largely sufficient; a note on how unmapped accounts affect usability of the preview would close 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 description coverage is 100%, so every parameter (to, from, rows, format, currency) is already documented, including the omit-'from'-to-resume behavior. The description restates that resume rule rather than adding new 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 operation: produce the journal for a period rendered in the target ledger's shape (xero/qbo/csv), plus control totals and unmapped items. The naming of bridge_export as the follow-on action implicitly distinguishes it from the export sibling. Slightly indirect phrasing ('the ledger's shape') but an agent can tell what it gets back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: 'Show the person the totals and the first rows before bridge_export' tells the agent this is a pre-flight step, not the hand-over itself. It also explains the omitted-'from' case (resume from the last hand-over in that format). It doesn't address other near siblings such as bridge_journal or bridge_financials, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_auditAudit trailARead-onlyIdempotentInspect
What happened, who did it, and whether it was a person or an agent. Includes refused commands. Both surfaces write here. actor_kind "agent" means a model called the tool; "human" means somebody clicked. Refusals are kept — a blocked agent action is exactly what you want to be able to review.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows. Default 50. | |
| subject_id | No | Narrow to one entity, e.g. SO-0003. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), but the description adds real semantic context beyond them: both surfaces write to the same log, actor_kind 'agent' vs 'human' is decoded, and refusals are retained. It omits ordering/pagination 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?
Three short sentences, front-loaded with the core question the tool answers and followed by the actor_kind legend. The closing clause ('exactly what you want to be able to review') is editorializing that could be cut, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read with 100%-documented parameters and no output schema, so the description carries the burden of describing return shape — yet it never says what fields a row contains (timestamp, action, subject, outcome) or the default sort order. Given no output schema exists, this is a meaningful gap for an agent trying to 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% for both parameters (limit with a stated default of 50, subject_id with an example 'SO-0003'), so the baseline is 3. The description adds nothing about how limit interacts with truncation or what subject_id filters on beyond the schema's example.
Input schemas describe structure but not intent. Descriptions should explain 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 answers what the tool returns — 'What happened, who did it, and whether it was a person or an agent' — clearly identifying an audit-trail read. It distinguishes actor types but never differentiates itself from nearby log-style siblings such as gl_changes or crm_today, so an agent could confuse the audit trail with a change log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: 'a blocked agent action is exactly what you want to be able to review' suggests the review/compliance use case. There is no explicit when-to-use, no when-not-to-use, and no named alternative (gl_changes, core_next_actions) that an agent should pick instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_company_profileCompany profileARead-onlyIdempotentInspect
The business's own identity as it prints on documents: seller block, tax id, payment instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| with_logo | No | Include the logo itself as a data URL — large. Otherwise only its type and size come back. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description earns credit by enumerating what the payload contains (seller block, tax id, payment instructions), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with the identity-of-the-business framing front-loaded and the returned fields following. No filler, though the fragmentary noun-phrase style costs a little immediate legibility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool with no output schema, the description adequately signals the return contents and directs the logo question to the parameter. It stops short of noting fields that may be unset or that this is the workspace-wide singleton profile.
Complex tools with many parameters or behaviors need more documentation. 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 with_logo parameter carries its own clear explanation (data URL, large, otherwise type/size only). The description contributes nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource — the business's own identity as printed on documents — and enumerates its contents (seller block, tax id, payment instructions). It lacks an explicit verb ("get/read"), so a reader must infer retrieval, and it never names the write counterpart core_set_company_profile to draw the line between 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?
There is no statement of when to call this versus core_set_company_profile or core_set_company_logo, and no prerequisites or exclusions. The read-only annotations let an agent infer that this is the read side, but the description itself gives no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_create_customerNew customerAInspect
Create a customer we can sell to. A credit limit of 0 means prepay only — that is a real position, not a missing value. Do not invent a limit to make an order go through; if the limit is wrong, someone with the authority to change it changes it, and that change is its own logged command. Effects: customer created.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Legal or trading name as it will appear on the invoice. | |
| No | Billing email. | ||
| terms | No | Payment terms: immediate, or netN for N days (net7, net15, net30, net60). Drives the invoice due date. | |
| tax_id | No | Their VAT / EIN, printed on the document where present. | |
| address | No | Billing address, as it should print in the bill-to block. Required before a solo invoice can be issued. | |
| credit_limit | No | How much unpaid exposure we will carry for this customer. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive create operation. The description adds valuable behavioral context beyond that: zero credit limit means prepay only, not a missing value, and credit-limit changes are separately logged. It still does not cover duplicate-customer behavior or the response shape.
Agents need to know what a tool does to the 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 and appropriately brief for a create tool. The final "Effects: customer created" is somewhat redundant with the opening sentence, but it still marks the side effect explicitly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter create tool with full schema coverage and annotations but no output schema, the description covers purpose, a key credit-limit rule, and the creation effect. It would be stronger if it mentioned duplicate handling or whether the response returns an identifier for follow-up 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?
Schema description coverage is 100%, so the schema already documents all six parameters, including that credit_limit is in cents. The description adds meaningful business semantics for credit_limit: zero is a real prepay position and must not be fabricated. It does not clarify what happens when credit_limit is omitted, which is a remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Create a customer we can sell to." It also implicitly distinguishes this operation from changing a customer's credit limit later, which is described as "its own logged command."
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when-not-to guidance around credit limits: do not invent a limit to force an order through, because limit changes belong to an authorized, separately logged command. It does not explicitly name alternatives such as core_update_customer or crm_promote_to_customer, so it stops short of full when/when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_create_itemNew itemAInspect
Create a sellable item. Set stocked=false for services and anything that cannot run out; those lines never check inventory and never deplete it. Effects: item created.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | Yes | The SKU, your own identifier. Becomes the item id. | |
| name | Yes | What it is called on the quote and invoice. | |
| on_hand | No | Opening quantity on hand. | |
| stocked | No | False for services — never depletes, never blocks a shipment. | |
| unit_price | Yes | List price per unit. In cents (integer minor units) — 1250 means $12.50. | |
| tax_rate_bp | No | Default tax rate in basis points (875 = 8.75%). 0 or omitted = untaxed. Billing snapshots this rate per line. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation. The description adds useful behavior beyond that: the item is created, and stocked=false items never check or deplete inventory. It does not cover duplicate-SKU 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 short and front-loaded with the core action. 'Effects: item created' is slightly redundant with the opening verb, but otherwise the structure is 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 6-parameter creation mutation, the description covers purpose and stocked behavior but is silent on duplicate SKU handling, whether the SKU is immutable, permissions, and what is returned. With no output schema, those gaps leave the definition only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters. The description adds some operational meaning for stocked=false, but it largely overlaps the schema's existing 'False for services — never depletes' wording and adds no detail for sku, name, on_hand, unit_price, or tax_rate_bp.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a sellable item.' No sibling tool creates sellable items, so the action is unambiguous against core_create_customer, core_set_price, and the inventory 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?
Usage is implied by the purpose, and the stocked=false guidance helps distinguish item types. However, the description does not explicitly say when to use this versus alternatives like core_receive_stock, core_set_price, or inv_set_opening_cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_get_customerCustomerARead-onlyIdempotentInspect
One customer as master data: contact facts, billing address, tax id, terms, hold state. (o2c adds the live credit position in o2c_get_customer.)
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | The customer. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed-world profile, so the safety bar is met structurally. The description adds real value by disclosing the data content a caller receives (address, tax id, terms, hold state) and by clarifying that credit exposure lives elsewhere, which is the main behavioral surprise for this tool. No note on error behavior for a missing/invalid id, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the identity of the resource and its contents, followed by the sibling disambiguation. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by enumerating the returned field groups, which is what an agent needs to decide whether this tool answers its question. The remaining gap is modest: no indication of what a not-found customer yields, but for a read-only single-record fetch the definition is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already tells the agent everything ("The customer. An existing customer id."). The description adds no syntax, format, or lookup guidance beyond what is already there, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("One customer as master data") and immediately enumerates the fields covered (contact facts, billing address, tax id, terms, hold state). It also names the sibling that returns the complementary view (o2c_get_customer for live credit position), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical routes the agent: use this for master data, use o2c_get_customer when the live credit position is needed. That is clear conditional guidance toward an alternative, though it stops short of explicit "when not to use" phrasing or mentioning core_update_customer / core_create_customer as adjacent operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_hold_customerCredit holdAInspect
Put a customer on credit hold: no new orders confirm until released. A hold outranks the limit: however much room the numbers show, nothing confirms while it is on. Already-confirmed orders are not touched — fulfil and bill them as agreed; the hold is about taking on NEW exposure. Holds are for judgment the formula cannot see: a bounced check, a dispute turning sour, news about the customer. Effects: customer.on_hold set; o2c_confirm_order refuses while held.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why. Shown whenever the hold blocks something. | |
| customer_id | Yes | The customer. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses concrete effects ('customer.on_hold set; o2c_confirm_order refuses while held') and clarifies non-effects ('Already-confirmed orders are not touched — fulfil and bill them as agreed'). This tells the agent exactly what the mutation does and does not affect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core action, then explains the key behavioral constraints and effects in a tight sequence. Every sentence contributes useful context: what a hold is, what it does not touch, when to use it, and its effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 mutation tool with annotations and full schema coverage, the description covers purpose, usage conditions, side effects, and exclusions. No output schema exists, but the description explains the observable consequence (confirmations are refused while held), which 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 parameter meanings are already documented. The description reinforces that 'reason' is shown when the hold blocks something, but adds little beyond the schema for customer_id or reason.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Put a customer on credit hold.' It also distinguishes the hold from credit-limit logic ('A hold outranks the limit') and from existing order handling ('Already-confirmed orders are not touched'), making the scope clear without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditions and examples for when to use the tool: 'a bounced check, a dispute turning sour, news about the customer.' It also implicitly limits use to taking on NEW exposure, but it does not explicitly name core_release_customer as the undo path or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_inviteInvite memberAInspect
Share this workspace: by email (they sign in with Google) or as a member token (a link that is the key). The link is the key: whoever opens it works here under that name and role, and every act they (or their agent) take is attributed to that name. Roles: owner (everything), controller (everything but workspace admin), clerk (day-to-day, no credit authority), viewer (read only). Denials are one-sentence refusals, logged — attempted overreach is reviewable, like everything else. Effects: member token minted.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Who this is for — becomes the actor on every act they take. For an email invite, the email works as the name. | |
| role | Yes | What they may do here. | |
| No | Invite by email instead of minting a link: they sign in with Google and land here with this role. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: the link itself is the credential (whoever holds it acts under that name), all acts are attributed to that name, and out-of-role attempts are refused and logged. It stops short of stating token expiry, revocation semantics, or required caller 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 opening line front-loads the two invite paths, and the role list is compact and information-dense. The closing sentence about one-sentence denial refusals being 'reviewable, like everything else' is workspace policy padding rather than tool-specific information, slightly diluting the payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 carry the return contract, and 'Effects: member token minted' only half does so — it never says the minted link/token comes back in the response, which is precisely what the caller needs in order to share it. Missing too is any statement of who may call this or whether an existing member with that name is updated or rejected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description does add real value by defining what each role can do (controller vs clerk vs viewer) rather than leaving bare enum names. Against that, it introduces an 'owner' role that the schema enum does not accept, which could lead an agent to pass an invalid value, and it adds nothing about the email/name interaction 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 (invite a member to this workspace) and immediately clarifies the two mechanisms: email invite via Google sign-in, or a member token link. An agent can distinguish it from core_members (listing) and core_revoke_member (removal) by name alone, though the description never names those siblings 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?
It gives real guidance on choosing the email path versus the token path, and the role list helps pick a role value. However, it never says when to use this tool versus core_members or core_revoke_member, nor does it state preconditions such as who is permitted to invite or what happens if the name already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_journalJournalARead-onlyIdempotentInspect
Double-entry journal lines derived from the books, for export to the ledger of record. Nothing here is posted or stored — re-derivation is the truth. Fixed accounts; a voided invoice contributes nothing (INV-23). Revenue side only: items carry no cost, so there are no COGS or inventory entries — the ledger of record owns inventory and margin. The ledger of record stays wherever it is.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Include events on/before this date. Omit for all. ISO date, YYYY-MM-DD. | |
| from | No | Include events on/after this date. Omit for all. ISO date, YYYY-MM-DD. | |
| currency | No | Only entries in this currency (ISO 4217). Omit for all — but sums only mean something within one currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well past that: it says nothing is posted or stored, re-derivation is the truth, accounts are fixed, voided invoices are excluded (INV-23), and the ledger of record owns inventory and margin. That is exactly the kind of derivation and side-effect disclosure an agent needs to reason about repeat calls and downstream reconciliation.
Agents need to know what a tool does to the 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 statement (what it produces and who consumes it), then qualification sentences. The closing line 'The ledger of record stays wherever it is' largely restates the earlier ownership point and could be cut, but otherwise the prose is dense and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 explaining the result, and it does so at the level of content (revenue-side lines, fixed accounts, no COGS) rather than row shape. For a three-optional-parameter read tool with full safety annotations, that is nearly complete; a note on what a single journal line contains would close the 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 to/from/currency are already fully documented in the schema, including the ISO formats and the currency-summing caveat. The description adds no additional parameter 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 concrete resource (double-entry journal lines derived from the books) and the intended consumer (export to the ledger of record). It does not name or distinguish itself from the plausible lookalikes in the sibling list (gl_entries, gl_changes, bridge_export), so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 through scope statements — revenue side only, no COGS/inventory, voided invoices contribute nothing — which effectively describes what the output will and will not contain. However there is no explicit guidance on when to choose this over gl_entries or bridge_export, and no stated prerequisites such as needing books to exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_membersMembersARead-onlyIdempotentInspect
Who has access: email members (Google sign-in) and token keys (agents, link shares).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by clarifying that the tool includes both email members (Google sign-in) and token keys (agents, link shares), which goes beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the data scope without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description is nearly sufficient: it explains the two access categories returned. It could be slightly more complete by indicating whether token secrets are masked or what fields are included, but the essential context 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?
The tool takes zero parameters, so there are no parameter semantics to document. Per the scoring baseline for 0 params, this dimension defaults to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource ('who has access') and the two categories covered: email members and token keys. It is clear what the tool returns, though it lacks an explicit verb like 'list' and does not name sibling tools such as core_invite or core_revoke_member.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance on when to use this tool versus alternatives like core_invite or core_revoke_member. The description only states what the tool covers, leaving the agent to infer that it is a read/list operation from the tool name and annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_next_actionsWhat can I do nowARead-onlyIdempotentInspect
The commands available on an entity right now, and for the rest, the business reason they are not. This is the same evaluation that decides which buttons are live in the UI. Prefer it over guessing at a state machine, and quote the reason back verbatim when something is blocked — it is written to be shown to a person.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Its id. | |
| subject_type | Yes | Which kind of entity — see core_schema for the subject types. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond annotations: it returns both available commands and business reasons for blocked ones, and those reasons are meant to be surfaced verbatim to a person.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core behavior, and each sentence adds distinct value: what it returns, why it is authoritative, and how to use blocked reasons.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, two-parameter tool without an output schema, the description explains the conceptual return value and the intended handling of blocked reasons sufficiently for an agent to call and interpret 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 both parameters are documented in the schema. The description adds no additional parameter meaning or examples, which is acceptable but not additive at this level.
Input schemas describe structure but not intent. Descriptions should explain 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 capability: listing commands currently available on an entity and explaining why blocked commands are unavailable. It distinguishes this from guessing at a state machine and ties the result to the same evaluation used for live UI buttons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance: prefer this over guessing at a state machine, and quote blocked reasons verbatim because they are user-facing. It does not name alternate sibling tools or explicitly list when not to use it, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_receive_stockReceive stockAInspect
Increase quantity on hand for a stocked item. Receipts are additive and never retroactive. To correct a count, receive the difference — a negative qty is allowed for that and is visible as a correction in the log. Effects: item.on_hand adjusted.
| Name | Required | Description | Default |
|---|---|---|---|
| qty | Yes | Units received. Negative to correct an overstated count. | |
| note | No | Why — a PO number, a cycle-count reference. | |
| item_id | Yes | The item received. An existing item id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, idempotent=false, destructive=false). The description adds real context beyond that: receipts are additive and never retroactive, negatives are logged as corrections, and item.on_hand is the mutated field. It does not cover whether the item must already exist, what happens on an unknown item_id, or permission requirements, so it sits at adequate rather than 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?
Four short sentences, front-loaded with the core effect, then the non-retroactivity rule, then the correction workflow, then the mutated field. No filler and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers the effect on state and the correction path, which is the critical information. Gaps remain around preconditions (existing item id) and what the response returns, but annotations and the schema carry most of the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it explains why a negative qty exists (count correction) and that such a receipt is visible as a correction in the log. It says nothing about note or item_id beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: "Increase quantity on hand for a stocked item." It implicitly distinguishes itself from count-correction flows by stating receipts are additive and never retroactive, but it never names a sibling (e.g. inv_count_stock or p2p_receive_goods), so the 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 clear when-to-use guidance, including the non-obvious case: to correct a count, receive the difference with a negative qty. It lacks an explicit "use X instead" routing statement against the many inventory/purchasing siblings, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_release_customerRelease holdAInspect
Release a customer from credit hold. The release is its own logged act with its own reason — "who released it and why" is exactly the question that gets asked later. The limit applies again from the next confirmation. Effects: customer.on_hold cleared.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why the hold is lifted. | |
| customer_id | Yes | The customer. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already fix the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds genuine behavior beyond that: the release is separately logged, a reason is mandatory because it is audited later, the credit limit re-applies from the next confirmation, and the concrete effect is 'customer.on_hold cleared'. It does not address repeat invocation, which is notable given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is stated first, followed by rationale and then effects, so it is well front-loaded. The middle sentence about 'who released it and why' is slightly discursive but earns its place by justifying the required reason parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers state effect, audit logging, and downstream consequences. The remaining gap is error/precondition behavior — what happens if the customer is not currently on hold.
Complex tools with many parameters or behaviors need more documentation. 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 meaning beyond the schema's terse 'Why the hold is lifted': it explains that the reason is the durable audit answer to 'who released it and why', motivating a substantive value rather than a placeholder.
Input schemas describe structure but not intent. Descriptions should explain 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 and resource-state transition: 'Release a customer from credit hold.' That is unambiguous and clearly the inverse of the sibling core_hold_customer, so an agent can select it without inspecting 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?
Usage is only implied: the tool obviously applies to a customer currently on hold, but the description never states preconditions (does it fail if the customer is not on hold?), nor does it name or compare against alternatives such as core_update_customer or core_set_credit_limit for related credit changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_replay_scenarioReplay scenarioAInspect
Replay one spec scenario live in its scratch workspace and return the step-by-step evidence. A replay is not a simulation: the scenario runs through the real registry — same guards, same audit trail — in a throwaway workspace, and the response walks every step: act, command, arguments, expectation, and what actually came back. Show it to someone learning the area; the refusal steps teach more than the happy path. Refreshes the persisted evidence. Effects: scratch workspace wiped and scenario replayed; conformance evidence refreshed.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Spec area. Defaults to o2c. | |
| file | Yes | Scenario file name, e.g. 02_credit_gate.json. See core_spec_status for the list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains that this is a real execution through the actual registry with the same guards and audit trail (not a simulation), that the scratch workspace is wiped and the scenario replayed, and that persisted conformance evidence is refreshed. That resolves the ambiguity of readOnlyHint=false / destructiveHint=false / idempotentHint=false for the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the response shape, then adds effects last. It is slightly longer than needed — the 'refusal steps teach more than the happy path' aside is advisory rather than operational — but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still enumerates what the response contains (act, command, arguments, expectation, and actual result) and discloses all side effects, so an agent knows exactly what it gets back and what state it changes.
Complex tools with many parameters or behaviors need more documentation. 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, including the o2c default and the pointer to core_spec_status for valid file names. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replay one spec scenario live in its scratch workspace') plus the return shape ('step-by-step evidence'). It also distinguishes itself from the nearest sibling by pointing at core_spec_status for the scenario list, so an agent can pick correctly 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 a clear use context ('Show it to someone learning the area') and notes the refusal steps are the most instructive. It does not state explicit when-not conditions or name an alternative tool for the 'just list scenarios' case beyond the parameter hint, 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.
core_reset_workspaceReset workspaceADestructiveInspect
Wipe THIS workspace and optionally reseed it from a named fixture. Destroys every row in the current workspace — yours, nobody else's. Available only outside production. Fixtures are command scripts (fixtures/.json), so a reseeded workspace has a real audit trail: every seed row shows as a logged command by actor "fixture". Effects: all rows in this workspace deleted; fixture commands replayed if given.
| Name | Required | Description | Default |
|---|---|---|---|
| fixture | No | Fixture name under fixtures/, e.g. "acme". Omit to reset to empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the tool as destructive, and the description adds substantial context beyond them: exactly what is destroyed, that only the current workspace is affected, the production restriction, and that fixture reseeds create an audit trail via logged commands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and remains fairly tight. The final 'Effects:' sentence partly repeats the earlier deletion statement, but the reinforcement is useful for a destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, zero-required-parameter reset tool with no output schema, the description covers scope, effects, environment restriction, optional fixture behavior, and audit consequences. An agent has enough information to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the fixture parameter. The description adds meaningful semantics by explaining that fixtures are command scripts replayed into the workspace, producing an audit trail, which goes beyond the schema's brief parameter 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?
The description states a specific verb and resource: 'Wipe THIS workspace and optionally reseed it from a named fixture.' It also scopes the action to the current workspace only, distinguishing it from anything global.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states a key usage constraint—available only outside production—and explains the optional fixture reseed path. It does not explicitly compare against sibling tools such as core_replay_scenario, so it falls short of full when-to-use/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_revoke_memberRevoke memberADestructiveInspect
Revoke a member's token. Their link stops working immediately. Revocation is a logged act like any other; the member's past entries in the trail keep their name. Nothing is deleted. Effects: member token revoked.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The member to revoke. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the bar is lower, yet the description adds real substance: revocation is logged, historical entries retain the member's name, and nothing is deleted. It does not address whether revocation is reversible, what happens on a second call (idempotentHint=false), or what error an unknown member yields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and its immediate effect. The trailing "Effects: member token revoked" largely restates the first sentence and is the one mildly expendable line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema and full annotation coverage, the description says enough to call it safely, including that data is preserved. Gaps remain around reversibility and repeat-call behavior, which matter given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so baseline is 3. The description never clarifies whether "name" is a display name, identifier, or token reference, adding nothing over the schema text "The member to revoke."
Input schemas describe structure but not intent. Descriptions should explain 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 ("Revoke a member's token") with the immediate effect stated. It doesn't name a sibling (e.g., core_invite, core_members) to contrast with, so it falls just short of the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: revoke when you want a member's link to stop working. There is no explicit guidance about when to revoke versus hold, invite again, or list members via core_members, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_schemaSchemaARead-onlyIdempotentInspect
The shape of the system: modules, entities, lifecycles, the encoded rules, and every command. Call this first in a new session. It is cheaper than guessing, and it is generated from the same registry the tools come from — so the SERVER cannot serve a stale one. Your client can: connector tool lists are cached by the app when the connector is added. If a command listed here is missing from your tools, or a tool has fewer arguments than this schema says, remove and re-add the connector and start a new chat. This schema is the truth; the tool list is a cache of it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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's job is to add context — and it does: the payload is generated from the same registry the tools come from, so the server cannot serve a stale copy, but the client's cached connector tool list can. It then supplies the remediation (remove/re-add the connector, start a new chat). That is genuinely useful operational detail no annotation or schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns before the operational advice, and most sentences carry distinct information. It is slightly padded — 'This schema is the truth; the tool list is a cache of it' restates the caching point already made two sentences earlier, and the connector-cache warning runs long for a zero-arg 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?
No output schema exists, but the description enumerates the payload's contents (modules, entities, lifecycles, rules, commands), states its freshness guarantee and its failure mode, and tells the agent what to do if reality diverges. For a zero-parameter read tool, an agent has everything needed to call it 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?
The tool takes zero parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly spends no words on nonexistent arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb-and-content pair: it returns the system's shape — modules, entities, lifecycles, encoded rules, and every command. That is instantly distinguishable from every sibling, which are all specific operational tools, and an agent can tell this is the introspection/meta entry point without opening anything.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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, prescriptive trigger: 'Call this first in a new session', plus the rationale ('cheaper than guessing') and a diagnostic path if a listed command is absent from the tool list. It stops short of naming when NOT to call it or a sibling alternative (e.g. core_spec_status, core_next_actions), which keeps it off a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_searchSearchBRead-onlyIdempotentInspect
Find entities by id, name or reference, across every module. Each module contributes its own results; what you can find here tracks what is mounted.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Free text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds genuine behavioral context that results are aggregated per module and vary with what is mounted, but it omits return format, ranking, and 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?
Two sentences, front-loaded with purpose and scope; no filler. The second sentence's phrasing ('tracks what is mounted') is slightly indirect compared to a crisp statement of result variability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with full annotation coverage, most needs are met. But with no output schema, the description should say more about what results look like (entity shape, per-module grouping, limits), which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents only one param 'q' as 'Free text.' (100% coverage, so baseline is 3), and the description does add meaning by clarifying that q accepts an id, name, or reference. However, it gives no syntactic detail (format of ids, partial vs exact matching), so value over the schema is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (entities) with an explicit scope (across every module), and clarifies it accepts id, name, or reference. It implicitly differentiates from the many module-scoped siblings (crm_list_contacts, gl_entries) by being the cross-module lookup, though it names no sibling 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?
"Each module contributes its own results; what you can find here tracks what is mounted" hints at scope but never states when to prefer this over module-specific getters like core_get_customer or o2c_get_order. Usage is implied rather than directed, with no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_set_company_logoCompany logoAInspect
Put your logo on the invoice document. Upload a file, or give a public https URL and it is fetched once. Branding, not a fact: the logo is NOT part of the frozen seller block, so changing it re-brands past documents while their names, addresses and amounts stay exactly as issued. PNG, JPEG, SVG or WebP, 300 KB at most; the image is stored, never hotlinked. Needs a company profile first. Pass remove=true to take it off. Effects: company logo stored (or removed).
| Name | Required | Description | Default |
|---|---|---|---|
| remove | No | Remove the current logo. | |
| logo_url | No | Public https URL of the image. Fetched once and stored; the URL itself is not kept. | |
| logo_data | No | The image itself as a data URL (data:image/png;base64,…). From the form: pick a file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnly=false, destructive=false, idempotent=false, openWorld=false). The description adds substantive behavior beyond that: fetch-once-then-store (never hotlinked), a 300 KB size cap, accepted formats, the company-profile prerequisite, and the crucial fact that changing the logo re-brands past documents while frozen seller data and amounts stay fixed. It also states the effect summary.
Agents need to know what a tool does to the 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 intent is front-loaded in the first sentence and each following sentence carries facts (storage model, formats, size cap, prerequisite, removal). The 'Branding, not a fact' aside is slightly discursive, but it earns its place by explaining retroactive re-branding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 mutation with no output schema, the description covers inputs, storage semantics, constraints, prerequisite, and the resulting effect ('company logo stored (or removed)'). Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter meaning is already documented, giving a baseline of 3. The description adds value the schema does not: the file-vs-URL choice is presented as mutually alternative input modes, and remove=true is framed as the inverse operation rather than just another flag.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Put your logo on the invoice document', then enumerates the two input routes (file upload, public https URL) and the removal path. It is unmistakably distinct from core_set_company_profile among the 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 clear conditions for each mode: upload a file OR supply a public https URL, and 'Pass remove=true to take it off'. The prerequisite 'Needs a company profile first' is an explicit precondition. It stops short of naming a sibling alternative explicitly, which keeps it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_set_company_profileCompany profileAInspect
The business's own identity: seller block, tax id, payment instructions, country, currencies, tax scheme, numbering. One per workspace. The invoice document's seller comes from here — a document without it is incomplete, not wrong (INV-22). Patch semantics: only the fields you pass change; the name is required only the first time. Effects: company profile written.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Legal or trading name, as it should appear on documents. | |
| tax_id | No | EIN / VAT id — printed on documents where present. | |
| address | No | Postal address, as it should print. | |
| country | No | Where the business is, ISO 3166 two letters (US, NZ, CZ, HU). Sets how dates and amounts print. | |
| currency | No | Default billing currency, ISO 4217 (USD, NZD, CZK, EUR). Every invoice carries one; this is the one proposed. | |
| tax_label | No | What the tax is called on documents: GST, VAT, Sales tax, ÁFA, DPH. | |
| currencies | No | Every currency this business bills in, comma-separated (e.g. "USD, CZK"). An invoice may carry any of these and no other. | |
| footer_note | No | One line at the document foot (returns policy, thanks, registration no). | |
| tax_rate_bp | No | Default tax rate in basis points (1500 = 15%). Applied to every line unless the line says otherwise. Only meaningful when registered. | |
| tax_id_label | No | How the tax id is captioned on documents: GST No., IRD number, VAT ID, EIN. Defaults to "Tax ID". | |
| number_format | No | Invoice numbering. Tokens: {NNNN} the sequence (width = number of Ns), {YYYY} or {YY} the year of issue. Default INV-{NNNN}; INV-{YYYY}-{NNN} restarts each year. | |
| tax_registered | No | Registered for the tax (GST/VAT)? Pass it explicitly either way — false is an answer, the setup checklist stays open until one is given. Unregistered businesses cannot put tax on a line; registered ones print TAX INVOICE and their tax id. | |
| payment_instructions | No | How customers pay: bank details, reference format. Printed on every invoice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-open-world mutation, so the description's main added value is the patch behavior and conditional first-time name requirement. It also states the effect explicitly as 'company profile written,' but does not cover permissions, validation failures, or whether changes are reversible.
Agents need to know what a tool does to the 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 compact and front-loaded: identity first, invoice dependency second, patch semantics third, and effect last. Every sentence contributes useful information without 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 13-parameter mutation with full schema descriptions and mutation/safety annotations, the description covers the essential context: what the profile is, its invoice dependency, and partial-update behavior. It is slightly incomplete around permissions, error behavior, and how this relates to sibling profile/logo/setup tools.
Complex tools with many parameters or behaviors need more documentation. 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 parameter descriptions already carry most semantics. The tool description still adds useful meaning beyond the schema by explaining patch semantics for all fields and that name is required only on first setup.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as the business's own company profile and lists the identity areas it controls: seller block, tax id, payment instructions, country, currencies, tax scheme, and numbering. It does not explicitly state a verb like set/update in the first sentence and does not directly distinguish itself from the sibling read tool core_company_profile, 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 useful invocation context: one profile per workspace, patch semantics, and that name is required only the first time. However, it does not explicitly say when to use this tool versus core_company_profile or related setup tools, nor does it provide exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_set_credit_limitSet credit limitAInspect
Change how much unpaid exposure we will carry for a customer. This is the human decision the credit gate's refusal points to. When o2c refuses to confirm an order, the answer is never to route around the gate — it is for someone with the authority to change this number to change it, here, with a reason that will be read back. A limit of 0 means prepay only. Lowering a limit never touches already-confirmed orders; it tightens the gate for the next one. Effects: customer.credit_limit changed for future confirmations.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why — approved by whom, on what basis. This is the audit answer to "who raised it". | |
| customer_id | Yes | The customer. An existing customer id. | |
| credit_limit | Yes | The new limit. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses the effect on future confirmations, that lowering a limit does not affect already-confirmed orders, and that a limit of 0 means prepay only. It also establishes the audit expectation around the reason field. This is strong behavioral context for a non-read-only, non-destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, followed by the decision context and the most important edge cases. The narrative style is purposeful here and does not waste sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with full schema coverage and annotations covering safety flags, the description supplies the missing operational context: when to use it, what changes, what does not change, and the meaning of special values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics not present in the schema: a limit of 0 means prepay only, and lowering a limit tightens the gate for future orders without touching confirmed ones.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: changing the unpaid exposure/credit limit carried for a customer. It also explains the operational context, making clear this is the human override to the credit gate rather than a general customer update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when to use it: when o2c refuses to confirm an order, someone with authority should change the number here rather than route around the gate. It also gives the key exclusion, and the reason requirement is framed as part of the correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_set_priceSet list priceAInspect
Change an item's list price. Takes effect for documents raised from now on. Everything already raised keeps the price it was raised with — a quote accepted after this change still becomes an order at the quoted price (INV-19), and issued invoices never move. That is why this is a logged act and not a field edit: the moment the price changed is part of the record. Effects: item.unit_price changed for future documents only.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The item. An existing item id. | |
| unit_price | Yes | The new list price per unit. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-readonly, non-destructive, non-idempotent write; the description goes far beyond that by disclosing the temporal blast radius, that historical documents are immutable, and that each change is logged as a record. This is exactly the kind of consequence disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and effect scope, and the trailing 'Effects:' line is a useful summary. Slightly repetitive — the 'future documents' idea is stated twice — but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with annotations and full schema coverage, the description covers the key behavioral consequence (immutability of already-raised documents) and the audit nature of the act. It does not mention permissions or what the call returns, but no output schema exists and those are minor omissions.
Complex tools with many parameters or behaviors need more documentation. 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 item_id and the cents-based unit_price, so the description adds no parameter-level meaning. Baseline 3 is appropriate 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 ('Change an item's list price') and immediately qualifies the scope (future documents only). It is clearly distinct from core_create_item or inventory cost tools, though it never names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when the change applies: documents raised from now on, with quotes already accepted and issued invoices unaffected (INV-19). It explains the rationale ('logged act and not a field edit') but offers no explicit exclusions or named alternatives for adjacent operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_setup_statusSetup checklistARead-onlyIdempotentInspect
Is this space ready to invoice, and if not, the next question to ask — in order. Call this FIRST in a space you have not seen before, before core_schema's details matter. It lists what the company profile still needs, in the order to ask: name, country, currency, tax scheme, address, payment instructions; then the optional numbering format and logo; then a first client.
WHAT THE PERSON ALREADY TOLD YOU, WRITE NOW. If their message carried the name, the country, the currency or the tax position, call core_set_company_profile with all of it in one go before asking anything. 'ask' is the question for something still MISSING after that; asking a person for a fact they gave you a moment ago is the fastest way to lose them. Ask ONE question at a time, in this order, only for what is genuinely missing, and write each answer as you get it. Country comes first because it decides how dates and amounts print; tax must be ANSWERED (registered yes or no) — the default is not an answer. Nothing here is needed for a job-hunt space.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 goes further by disclosing return semantics not in any schema — the ordered missing-item list and the 'ask' field for what is still missing — plus the substantive rule that tax must be explicitly answered and the default is not an answer. It stops short of describing pagination/format or edge cases like a fully complete space.
Agents need to know what a tool does to the 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 readiness question is front-loaded and the content is ordered to match the workflow (what to write first, then what to ask, then scope exclusion). It is somewhat long and rhetorical in places ("the fastest way to lose them", "the default is not an answer"), but those lines carry actionable rules rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, no output schema and full annotation coverage, the description supplies the missing behavioral and procedural context: what the checklist contains, in what order, and how to act on each answer. Only the concrete shape of the response beyond the 'ask' field is left implicit, which is minor for a read-only status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It correctly spends no words on parameter behavior and focuses entirely on workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states the exact question the tool answers ("Is this space ready to invoice, and if not, the next question to ask — in order") and enumerates the checklist contents: name, country, currency, tax scheme, address, payment instructions, numbering format, logo, first client. It also distinguishes itself from siblings by naming core_schema and core_set_company_profile as different concerns. An agent can identify this as the readiness-check tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precedence rule ("Call this FIRST in a space you have not seen before"), a decision rule for the sibling mutation tool (write known facts to core_set_company_profile before asking anything), sequencing of questions, and a scoping exclusion ("Nothing here is needed for a job-hunt space"). This is about as close to when/when-not/alternatives as a description gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_spec_statusSpec statusARead-onlyIdempotentInspect
Implementation status against the area spec: acts, scenarios with evidence, invariants with what exercises them. The answer to "how far along is the spec, and how do you know". Derived, never asserted: acts come from the implements map, evidence from the last conformance run. Use it to teach — each scenario's steps show the act, the doctrine, the arguments, and what came back, refusals included; refusals are half the curriculum.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Spec area. Defaults to o2c. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world safety, so the description's job is to add provenance — and it does: acts come from the implements map, evidence from the last conformance run, and results are 'derived, never asserted'. The note that refusals are included in the returned steps is a genuinely useful disclosure an agent could not get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The load-bearing content is front-loaded in the first sentence, but the closing flourish "refusals are half the curriculum" and the repeated 'teach' framing are editorial padding rather than operational information. Trimming would not lose anything an agent needs in order to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only one optional parameter, the description carries most of the burden, and it does describe the shape of what comes back (acts, scenarios with steps showing doctrine and arguments, invariants with exercising evidence). What is missing is any hint of size, pagination, or how an unknown area 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 description coverage is 100% — the single 'area' parameter is already documented as a spec area defaulting to o2c. The description never mentions the parameter, so it adds nothing beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb-and-resource pair — implementation status against an area spec — and enumerates the three things returned (acts, scenarios with evidence, invariants). It is well short of the top mark because it never distinguishes itself from adjacent introspection siblings like core_setup_status or core_schema; an agent must infer that 'spec' means something different from 'setup'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 answer to 'how far along is the spec, and how do you know'" and "Use it to teach" give a loose situational frame, but neither states a precondition, an exclusion, nor an alternative tool to pick instead. Usage is implied by the framing rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_update_customerUpdate customerAInspect
Change a customer's contact facts: email, billing address, tax id, terms. Patch semantics: only the fields you pass change. These are the customer's own facts — ask, never guess an address. Credit limit and hold have their own commands because they are authority, not contact details. Issued documents keep the bill-to block they were issued with. Effects: customer record updated.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Billing email. | ||
| terms | No | Payment terms: immediate, or netN for N days (net7, net15, net30, net60). | |
| tax_id | No | Their VAT / EIN. | |
| address | No | Billing address, as it should print. | |
| customer_id | Yes | The customer. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower, yet the description adds real value: patch-only mutation, the fact that credit limit/hold are out of scope, and that issued documents keep their original bill-to block. 'Effects: customer record updated' is filler, and there's no mention of failure behavior for an unknown customer_id.
Agents need to know what a tool does to the 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 field list, then patch semantics, then scope exclusions — a sensible ordering. The trailing 'Effects: customer record updated' restates the obvious and could be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 5-param partial-update tool with an output-schema-free interface and safety covered by annotations, the description supplies the essential semantics (patch behavior, scope boundaries, side effect on documents). Missing only edge-case handling such as unknown customer ids or validation of terms values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning beyond it by framing the parameters as 'the customer's own facts' with a deliberate do-not-guess rule for addresses. It doesn't add format details (e.g., terms enumeration) beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain 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 plus the exact field set it mutates ('email, billing address, tax id, terms'). It also draws the boundary with the credit-limit and hold commands and with issued documents, so an agent can separate it from core_set_credit_limit / core_hold_customer without reading their 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?
Explains the patch contract ('only the fields you pass change') and gives an operational rule ('ask, never guess an address'), and carves out fields that belong to other commands. It stops short of naming the alternative tools explicitly (core_set_credit_limit, core_hold_customer), leaving the agent to infer which command to reach for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
core_workspacesWorkspacesARead-onlyIdempotentInspect
List the workspaces on this deployment and which one this session is in. On a hosted demo this answers with your sandbox only: a sandbox name is the key to that sandbox, so other visitors' names are never listed.
| 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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing scoping behavior: on a hosted demo the response is restricted to the caller's sandbox, and sandbox names act as keys so other visitors' names are never exposed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The core action and the session-context detail lead, and the sandbox caveat follows as a secondary clause rather than burying the main point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description must carry the return-shape burden; it conveys that the response contains a workspace list plus the caller's current workspace, which is the essential shape. It stops short of describing any per-workspace fields, which is the only remaining gap for a tool of this 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?
The tool takes zero parameters and the schema is an empty closed object, so there is nothing for the description to disambiguate. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the workspaces on this deployment") plus an extra distinguishing output dimension ("which one this session is in"). No sibling tool in the set performs this listing, so the agent can identify it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 infers this is the orientation/discovery call for workspace and session context, but the description never says when to call it versus siblings like core_setup_status or core_reset_workspace, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_add_accountNew accountAInspect
Add a researched account to the list. The gate to the list (CRM-3): why_them and source_url are mandatory, because this is a curated list, not a funnel — its value is that every row can say why it belongs and where that knowledge came from. If you cannot say why them and what changed, it is not a target yet. Effects: account created in not_started.
| Name | Required | Description | Default |
|---|---|---|---|
| hook | No | The one-sentence opener you would actually use. | |
| name | Yes | The company, as it calls itself. | |
| tier | No | 1–3. Tier semantics are yours; 1 usually means "worth a hand-written approach". | |
| vertical | No | Industry vertical, your taxonomy. | |
| why_them | Yes | Why this account belongs on this campaign's short list. The researched answer, not a vibe. | |
| owner_note | No | Working notes. | |
| source_url | Yes | Where why_them can be verified. | |
| campaign_id | Yes | The campaign this pursuit belongs to. why_them argues THIS goal (CRM-12). An existing campaign id. | |
| trigger_event | No | What changed that makes now the moment. A fact, with the source in source_url. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds genuinely new behavior: the resulting state is "account created in not_started." It does not address duplicate handling despite idempotentHint=false, which is the one behavioral trait left undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the mandatory-field gate are front-loaded in the first two sentences, and the closing "Effects:" line is a compact, high-value signal. The parenthetical CRM-3 / CRM-12 references add slight noise for an agent that has no way to resolve them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and no output schema, the description covers the mutation's landing state but says nothing about what is returned (e.g. the new account id) or how duplicates are handled given idempotentHint=false. Those are the remaining gaps an agent would hit on first invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 9 fields carries a substantive description, so the schema does the heavy lifting. The description only reinforces that why_them and source_url are mandatory and frames why_them as an argument for the campaign goal — marginal added meaning over the schema's own 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?
"Add a researched account to the list" gives a specific verb (add) and resource (account) plus a scope qualifier (researched, curated list) that separates it from funnel-style capture tools. It stops short of naming a sibling (e.g. crm_add_contact vs crm_add_account), so the agent must infer from the tool names which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit admissibility test: why_them and source_url are mandatory, and "If you cannot say why them and what changed, it is not a target yet" is a real when-not-to-use rule. No alternative tools are named, so the agent gets a gate but not a routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_add_contactAdd contactAInspect
Record a person at an account — named with a source, or as a gap. Two shapes, nothing in between (CRM-1, CRM-2). Named: name + source required — a name without a source is not usable in a first approach, so it is refused, not warned about. Gap: no name, gap_note required — the role exists and its holder is not publicly known, and that absence is a finding worth recording. Guessing is the only real failure here. Effects: contact created as named or gap.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The person — only with a source. | |
| No | As publicly listed or personally shared — the source covers it like everything else (CRM-1). | ||
| notes | No | Working notes. | |
| phone | No | Same rule as email: listed or shared, never scraped from a paid enrichment dump without saying so. | |
| title | No | Their title, as the source states it. | |
| source | No | Where the name comes from. Mandatory for a named contact. | |
| gap_note | No | For a gap: what is missing and what it would take to find out. | |
| role_type | Yes | The role in the deal: OPERATIONS OWNER, ECONOMIC SPONSOR, SECURITY GATE… | |
| account_id | Yes | The account. An existing account id. | |
| linkedin_url | No | The person's public LinkedIn profile URL — a sourced fact, fine for an agent to record. The connection-path fields are a different matter. | |
| confidence_note | No | How sure, and of what: "high on the person, medium on the exact title". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-destructive, non-idempotent write; the description adds the important behavioral fact that a name without a source is 'refused, not warned about' — a hard validation failure an agent must anticipate. 'Effects: contact created as named or gap' also confirms the outcome. Duplicate handling and return shape are unstated, 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 the two-shape model before the rules, and every sentence carries either a mode definition or a validation rule. The prose is stylized ('a finding worth recording') but does not pad length meaningfully for an 11-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the conditional parameter contract, the refusal behavior, and the creation effect — sufficient for an 11-param mutation with no output schema. What is missing is how duplicates or existing contacts at the same account are handled, and what the tool returns on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics the schema cannot express: source becomes conditionally mandatory whenever name is present, and gap_note is mandatory only when name is absent. That conditional-requirement logic is the critical piece for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Record a person at an account' — and immediately defines the only two valid shapes (named with source, or gap with gap_note). This is far more precise than the sibling crm_update_contact or crm_get_contact, and an agent can distinguish the create path without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for each mode: named requires name + source, gap requires gap_note, and 'Guessing is the only real failure here' draws a clear line about what not to do. It does not name sibling tools (e.g., when to use crm_update_contact instead), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_add_eventAdd eventAInspect
Put something that is going to happen on an account: a workshop, a call, a deadline. With the source the date came from. NEVER INVENT A DATE (CRM-20). The date on an event comes from the source, and the source is a field here because it will be read back by the person deciding whether to turn up.
A page that lists dates in one column and topics in another, without pairing them, HAS NOT GIVEN YOU A DATE for any topic. Reading one off by position is how a first approach ends: a message to the person who owns the curriculum, naming a day they never published. If the source does not pin the date, there is no event; tell your human what you found and where, and let them decide.
The source is a URL when you found it, or "told by on " when a person told you. An event nobody can trace is a diary entry, not a record.
Use contact_id when the event is with, or run by, a specific person on the account. The account is enough for a public workshop. The note is why this is worth their time: what it opens, who will be there, what to do about it beforehand. Effects: event recorded as planned, with its source.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A registration or event page, if it differs from the source. | |
| date | Yes | When, from the source. ISO date, YYYY-MM-DD. | |
| kind | No | meeting, call, workshop, deadline or other. | |
| note | No | Why this is worth their time, and what to do about it beforehand. | |
| time | No | HH:MM, local to the place, if the source gives one. Empty otherwise: a time is a fact too. | |
| title | Yes | What it is, as the source names it. | |
| source | Yes | The page the date is on, or "told by <name> on <date>". | |
| location | No | Where, as the source puts it. | |
| account_id | Yes | The account this concerns. An existing account id. | |
| contact_id | No | The person it is with or run by, e.g. P-0001, if there is one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description only needs to add context. It contributes a short 'Effects: event recorded as planned, with its source' line and the useful behavioral fact that source will be read back by a human deciding whether to attend. It does not address what happens on duplicate events despite idempotentHint=false, nor on an unknown account_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded correctly, but the body is roughly 250 words for a simple record-creation call, and the CRM-20 warning is restated three times with a narrative illustration ('Reading one off by position is how a first approach ends...') plus a closing aphorism ('An event nobody can trace is a diary entry, not a record'). The anti-invention rule earns its place; the second and third restatements of it do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 should signal what happens on success, and 'Effects: event recorded as planned, with its source' does that at a minimal level. With 100% schema coverage and full annotations, the remaining gaps are error/duplicate behavior and whether an event id is returned, which are modest but real for a 10-parameter mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real guidance beyond the schema: the format contract for source ('a URL when you found it, or "told by <name> on <date>"'), the account_id-vs-contact_id decision rule, and the intent of the note field. The date provenance rule is also reinforced in prose rather than left to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Put something that is going to happen on an account') plus concrete examples (workshop, call, deadline), which clearly signals a scheduled-future event rather than a past-tense activity log. It never names the adjacent siblings (crm_log_activity, crm_update_event, crm_attend_event), so the distinction stays implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use rules for contact_id ('when the event is with, or run by, a specific person') versus account-only for a public workshop, and an explicit when-NOT-to-create rule: 'If the source does not pin the date, there is no event; tell your human what you found and where.' That is both an exclusion and a fallback action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_attend_eventAttendanceAInspect
Record where you stand on an event: not attending, attending, registered, or went. One word, no form. Whether an event happens is the organiser's business; whether your human goes is theirs (CRM-22). Most events here were found, not scheduled, so this is the verb that fits them: skip, attending, registered, or went.
ONLY ON YOUR HUMAN'S WORD. You have no source for whether a person intends to turn up except that person. If they said it, record it; if they did not, ask.
"went" is for after the date. An event with attendance went and no outcome is the one the calendar asks about afterwards: what came of it goes on the event with crm_update_event. Effects: attendance recorded on the event.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | The event, e.g. EV-0001. | |
| attendance | Yes | skip (not attending), attending, registered, or went. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent mutation; the description adds the real constraint an agent needs — the only legitimate data source is the human's own statement — plus an explicit effect statement ('attendance recorded on the event'). It stops short of saying what happens on re-recording an already-set attendance or what the call returns, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core rule is front-loaded, but the four-value list is repeated three times ('not attending, attending, registered, or went' / 'skip, attending, registered, or went') and asides like the CRM-22 ticket reference and 'whether your human goes is theirs' add rhetorical bulk rather than decision-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?
For a two-parameter mutation with full schema coverage and clear annotations, the description covers authorization source, timing rule, effect, and the alternative tool. The only gap is response/overwrite behavior, which is minor since no output schema exists and the effect is stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum is documented, so the baseline would be 3. The description earns more by explaining the semantic weight of 'went' (only valid after the event date) and by framing the values as 'the verb that fits' found events — nuance the schema does not carry.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Record where you stand on an event') and enumerates the exact accepted states. It also carves out the boundary against crm_update_event, which handles the outcome rather than attendance, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: 'ONLY ON YOUR HUMAN'S WORD... If they said it, record it; if they did not, ask,' which rules out inference from any other source. It also gives a temporal rule ('went is for after the date') and names the sibling to use instead for outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_calendarCalendarARead-onlyIdempotentInspect
What is coming, by day, and every planned event that already passed with no outcome recorded. Default window is today to a year out, and planned_after_window says what even that hides. awaiting_outcome is the list to read first: something your human meant to attend whose date has gone by with no word since. Ask what came of it, then settle it with crm_attend_event and crm_update_event.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of the window. Default a year out. ISO date, YYYY-MM-DD. | |
| from | No | Start of the window. Default today. ISO date, YYYY-MM-DD. | |
| status | No | Only events in this state. | |
| account_id | No | Only this account. An existing account id. |
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 real value by disclosing the default window and that results are windowed ('planned_after_window says what even that hides'), signaling possible truncation. It does not cover ordering, volume, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and mostly front-loaded, but the phrasing is oblique in places ('planned_after_window says what even that hides') and references result field names the agent has not seen. Four sentences carry some redundancy in re-explaining the default window.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the return structure (a by-day plan plus an awaiting_outcome list) and the truncation signal, which is what an agent most needs for this read-only query. Missing only detail on ordering and how the follow-up settling flow completes.
Complex tools with many parameters or behaviors need more documentation. 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 defaults and formats, status enum, and account_id. The description's mention of the default window largely restates the schema, adding no new constraint or interpretation, 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?
Describes the resource clearly: upcoming events by day plus planned events that passed with no outcome recorded. It distinguishes itself from the two sibling tools it hands off to (crm_attend_event, crm_update_event) and reveals the shape of the result. The framing 'What is coming, by day' is a bit literary rather than a crisp verb+resource, but an agent can still tell what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit read-order guidance ('awaiting_outcome is the list to read first'), a follow-up behavior ('Ask what came of it'), and names the two siblings that resolve the item. It stops short of contrasting with overlapping siblings such as crm_today, and states no when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_campaignsCampaignsARead-onlyIdempotentInspect
Every campaign with its goal, status, and health: accounts by status, open gaps, staleness — the per-goal Today. Read the goal before adding accounts to a campaign — every why_them argues against it (CRM-13).
| 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/destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: results are pre-aggregated rollups (accounts by status, gaps, staleness) rather than raw rows, plus a domain warning (CRM-13) that every why_them argues against adding accounts without reading the goal. It does not describe cost, size, or pagination, so it adds value without being rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the payload inventory and zero filler. The trailing '— the per-goal Today' clause is compressed to the point of being unclear, which costs it a point, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and safety already covered by annotations, the description gives enough to call the tool and to know what fields arrive. However, for a read-only survey tool in a crowded CRM namespace it should say how it relates to crm_today, crm_gaps, and crm_pipeline, which return overlapping information — that routing gap is the main missing piece.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters and an empty schema, so there is nothing for the description to disambiguate; the baseline applies. The description correctly implies no filtering is possible on this call, since all scoping happens at the aggregate level.
Input schemas describe structure but not intent. Descriptions should explain 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 (every campaign) and enumerates what comes back — goal, status, health, accounts by status, open gaps, staleness — which separates it from the singular crm_get_campaign. The opening is a noun phrase rather than a verb, and 'the per-goal Today' is opaque jargon, but an agent can still tell this is the campaign-level rollup view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 workflow instruction ('read the goal before adding accounts to a campaign'), but that governs the downstream add-account action, not when to select this tool over siblings. It never names crm_get_campaign, crm_pipeline, crm_gaps, or crm_today, even though the returned fields ('open gaps', 'per-goal Today') overlap those tools directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_coverageCoverageBRead-onlyIdempotentInspect
List health: accounts by status and tier, open gaps, and accounts going stale (no activity in 14 days).
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | Only this campaign. An existing campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so safety is covered. The description adds genuine behavioral detail beyond that: the staleness definition ('no activity in 14 days') and the three content categories the result covers. It omits any indication of result size, ordering, or whether stale accounts are also counted in the status/tier breakdown.
Agents need to know what a tool does to the 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 compact sentence with no filler, and the three output categories are front-loaded. The opening 'List health:' is slightly cryptic as a verb-resource pair, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape, and it names the three categories but not their form (counts, grouped lists, per-account rows) or whether the campaign_id filter narrows all three. For a read-only overview tool with a 100%-documented single parameter, it is adequate but leaves the result structure ambiguous.
Complex tools with many parameters or behaviors need more documentation. 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% for the single campaign_id parameter, and the schema states it filters to an existing campaign id. The description never mentions campaign scoping, so it adds nothing beyond the schema. Baseline 3 applies when the schema carries the full parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (a CRM health overview) and enumerates its three components: accounts by status/tier, open gaps, and stale accounts. An agent can tell it produces a composite health listing rather than a single-record read. It does not, however, distinguish itself from near-siblings like crm_gaps or crm_pipeline, which likely overlap on the 'open gaps' portion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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, no exclusions, and no named alternative. The agent must infer that this is the dashboard/overview tool versus crm_gaps (gap listing), crm_pipeline, or crm_today from the sibling names alone. The 14-day staleness rule hints at a monitoring use case but is not framed as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_create_campaignNew campaignAInspect
Open a campaign: a named goal that accounts will be pursued under. The goal is required (CRM-13) and it is not a label — it is the brief. A research session reads it before adding a single account, and every account's why_them must argue against it. A campaign without a stated thesis is a folder, not a pursuit.
Check crm_campaigns before creating: if an existing goal covers the ask, work under it. When you (an agent) open a NEW campaign, derive the goal from what your human asked for and confirm it with them before filling the list — the goal decides what belongs. Effects: campaign created as active.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | The thesis: who qualifies, why now, what winning looks like. Agents will read this verbatim. | |
| name | Yes | Short name, e.g. "Craft brewery expansion Q3". | |
| target_profile | No | Optional sharpening: the shape of a qualifying company. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, openWorld=false, so the safety profile is covered. The description adds genuinely new behavior: the campaign is created 'as active,' and the goal becomes machine-read input that later account work must argue against. It stops short of saying what happens on duplicate names, which would complete the picture for a non-idempotent create.
Agents need to know what a tool does to the 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 action and the pre-check are front-loaded and the ordering is correct. Some rhetorical padding ('a folder, not a pursuit') and the inline ticket reference (CRM-13) cost tokens without adding operational guidance, but the core is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the state effect (created as active) but not what identifier or object comes back, which an agent would want in order to chain into crm_add_account. Otherwise it is complete for a three-parameter, non-destructive create.
Complex tools with many parameters or behaviors need more documentation. 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 goes beyond it by explaining the consequence of `goal` — a research session reads it verbatim and every account's why_them must argue against it — which tells the agent how to write the value rather than just what field to fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (open/create) and resource (campaign) and immediately defines what a campaign is: 'a named goal that accounts will be pursued under.' That framing distinguishes it cleanly from crm_campaigns (listing) and crm_update_campaign (editing), so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to check crm_campaigns first and to work under an existing goal if it covers the ask, plus a concrete protocol for deriving and confirming the goal with the human. This is exactly the when-to-use / when-not-to-use / alternative pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_draft_messageDraft a messageAInspect
Write a message to a contact for a person to read, edit and send from their own mailbox. Nothing is sent. THIS SYSTEM HAS NO OUTBOUND CHANNEL (CRM-14). You write; a person reads it, edits it, sends it themselves, and records that it went. Never tell anyone a message was sent.
USE ONLY WHAT IS IN THE RECORD (CRM-10). The account's hook, trigger_event and path_in bullets; the contact's name and title. Never a fact about the person or the company that is not on file. If the record is thin the draft is short, not padded.
READ THE CAMPAIGN'S CLAIMS FIRST (crm_get_campaign). They are the things this business has decided it may assert about itself, written by a person. Anything beyond them is your invention, and the refused list is checked against your words at write time — but the list cannot catch an overstatement of a claim that is itself allowed, so stay inside what the claim actually says.
RATIONALE IS FOR THE REVIEWER AND IS NEVER SENT (CRM-16): which hook or bullet the angle rests on, why this contact rather than another at the same account, and anything you were unsure about. A draft with no rationale is a draft nobody can check.
Only named, live contacts. A gap row has no name to write to, and a departed contact has left. Check crm_drafts before writing a second message to someone who already has one waiting. Effects: draft recorded against the contact, unsent.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The message. Write it as it would be sent, without a signature: it goes from somebody else's mailbox. | |
| channel | No | How it would go. Default email. | |
| subject | No | Subject line, where the channel has one. | |
| rationale | Yes | For the person reviewing it: the angle, why this contact, what you were unsure about. Never sent. | |
| contact_id | Yes | Who it is to, e.g. P-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by declaring there is no outbound channel (CRM-14), that a refused list is checked against the written text at write time, and that the effect is an unsent draft recorded against the contact. What it does not disclose is the failure surface — what an invalid contact_id or a refused-list rejection returns, or whether a duplicate draft is blocked or merely discouraged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the rule blocks are scannable tags (CRM-14, CRM-10, CRM-16). Some redundancy creeps in — 'nothing is sent' is restated three times and the rationale requirement is duplicated in the schema — but on a high-stakes constrained tool most of the prose 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?
No output schema exists, but the description supplies what the agent actually needs: the effect of a successful call, the source material allowed for the body, the reviewer-facing purpose of rationale, and the eligibility rules for contact_id. An agent can call this correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the prose adds real meaning the schema does not: rationale must name the hook or bullet the angle rests on and why this contact rather than another at the account, body carries no signature because it goes from someone else's mailbox, and contact_id must be a named live contact. The channel parameter is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource — write a message draft to a contact — and immediately bounds the scope with 'for a person to read, edit and send' and 'Nothing is sent.' It is clearly separable from crm_drafts (listing), crm_update_draft (editing), and crm_draft_outcome (recording an outcome).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 preconditions and alternatives are spelled out: read the campaign's claims via crm_get_campaign first, use only record content, check crm_drafts before writing a second message to the same person, and restrict to named live contacts (not gap rows, not departed contacts). Nothing about when-to-use 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.
crm_draft_outcomeWhat happened to a draftAInspect
Record that a person sent a draft, or that they rejected it. Sending happens in their mailbox; this records it. SENT: the person sent it themselves and is telling you so. sent_at is when it actually went, which is not when this got typed (CRM-5). The draft's exact text is copied onto the activity trail as the record of what reached a real person, and the draft becomes immutable from that moment (CRM-15). An account still sitting at not_started or researching moves to approaching, because it has now been approached — that is a fact, not a forecast.
DISCARDED: a person read it and said no. rejected_because is for whoever writes the next one, so "too long, and it opened on us rather than on them" is worth typing and "no" is not.
Never record a send you were told about by nobody. If you did not hear it from your human, ask; a send that did not happen is the one fact in this system that can embarrass a person in front of a stranger. Effects: draft closed as sent or discarded; a sent draft is copied onto the activity trail; account moved to approaching on first send.
| Name | Required | Description | Default |
|---|---|---|---|
| outcome | Yes | What the person did with it. | |
| sent_at | No | When it actually went. Required when sent. ISO date, YYYY-MM-DD. | |
| draft_id | Yes | The draft, e.g. D-0001. | |
| rejected_because | No | For discarded: why, so whoever writes the next one has something to go on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety flags (readOnly=false, destructive=false, idempotent=false), and the description adds the substantive side effects: the draft's text is copied to the activity trail, the draft becomes immutable, and the account status transitions to approaching. It also cites the governing rules (CRM-5, CRM-15), which is context an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then cleanly segmented by SENT/DISCARDED blocks and closed with an 'Effects' summary. The cautionary paragraph about not fabricating a send is slightly discursive, but it is doing real work rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The 'Effects' line substitutes well for a missing output schema, and the mutation consequences are fully spelled out. It does not address edge cases an agent may hit, such as what happens if the draft was already recorded sent/discarded (relevant given idempotentHint=false) or what error surfaces when sent_at is omitted on a send.
Complex tools with many parameters or behaviors need more documentation. 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 more: it clarifies sent_at means when the message actually went rather than when the record was typed (CRM-5), and it gives concrete guidance on rejected_because ('too long, and it opened on us rather than on them' is worth typing and 'no' is not). This is real semantic value beyond the schema's terse property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Record that a person sent a draft, or that they rejected it') and explicitly scopes itself apart from the sending action itself ('Sending happens in their mailbox; this records it'), which separates it from siblings like crm_draft_message and crm_update_draft. The two enum branches are named and defined inline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use conditions for each branch (SENT vs DISCARDED) plus an explicit when-not-to-use guard: 'Never record a send you were told about by nobody... If you did not hear it from your human, ask.' It also implicitly routes the actual send elsewhere rather than through this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_draftsDraftsARead-onlyIdempotentInspect
Messages written but not sent, with the contact and account behind each. Check before writing a second one to somebody who already has one waiting. Nothing in this list has been sent, because this system has no way to send anything (CRM-14). status="sent" is the record of what a PERSON sent and told us about, with the exact words that reached somebody; status="discarded" is what a person read and rejected, and the reason is the most useful thing in the list when you write the next one.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Up to 200. Default 50. | |
| status | No | Default draft: what is waiting for a person. | |
| account_id | No | Only this account. An existing account id. | |
| contact_id | No | Only this contact, e.g. P-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds context annotations cannot carry: this system has no send capability (CRM-14), so nothing in the list was sent by the tool, and status="sent" records what a person sent and reported back. That prevents an agent from mistaking 'sent' for an automated delivery and is exactly the kind of domain caveat that 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?
The purpose and the actionable warning are front-loaded in the first two sentences, and every sentence afterward contributes a distinct semantic point. The CRM-14 parenthetical and the trailing clause about discarded reasons are slightly rambling, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only filtered list with full schema coverage and no output schema, this covers purpose, call timing, and the meaning of the non-obvious enum values. Minor gaps remain — result ordering and what a returned record contains beyond contact/account are not described — but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the mechanics of limit/status/account_id/contact_id are already documented, but the description adds real semantic depth to the status values beyond the schema's one-line 'Default draft' note — explaining what sent and discarded actually represent in this system. That meaning is not recoverable from the enum alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence names the resource ('messages written but not sent') and its scope ('with the contact and account behind each'), so the agent immediately knows this is the read/list counterpart to crm_draft_message and crm_update_draft rather than a write tool. The follow-up sentence ties it to the drafting workflow, which further separates it from the create/update 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?
'Check before writing a second one to somebody who already has one waiting' gives an explicit trigger for calling it ahead of crm_draft_message, and the note that discarded reasons are 'the most useful thing ... when you write the next one' reinforces the pre-drafting use case. It doesn't state when not to call it or name alternatives by tool name, keeping it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_gapsGapsBRead-onlyIdempotentInspect
Every unresolved gap with its note and age — what we verifiably do not know, as a worklist. This view existing is the point of CRM-2: the unknowns are work items, not blank cells nobody looks at.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | Only this campaign. An existing campaign id. |
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 safety behavior is covered. The description adds that results include each gap's note and age, and that only unresolved gaps are returned, but it does not describe ordering, pagination, or broader response behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and informative. The second sentence is philosophical framing about CRM-2 rather than invocation-relevant detail, so part of the description does not directly help an agent select or call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with one optional filter, full schema coverage, and rich annotations, the description provides enough context: it states that it returns unresolved gaps with note and age. No output schema exists, but the description sufficiently indicates the returned content for this simple 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?
There is one optional campaign_id parameter with 100% schema description coverage. The description does not mention the campaign filter at all, but with full schema coverage the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as unresolved gaps and describes the output as a worklist containing each gap's note and age. It is specific about contents and scope, but it does not explicitly differentiate this from sibling tools such as crm_resolve_gap or crm_coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 worklist framing implies the tool is for reviewing unresolved gaps that need attention, but it does not explicitly state when to use this versus crm_resolve_gap, crm_coverage, or other CRM views. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_get_accountAccountBRead-onlyIdempotentInspect
Full account: narrative with sources, path-in plan, contacts including gaps, recent activity, and what can be done next.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | The account. An existing account id. |
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. With no output schema, the description carries the return-shape burden and does disclose the sections returned (narrative with provenance sources, path-in plan, contacts including gaps, recent activity, suggested next actions), which is genuinely useful beyond the annotations. It does not address behavior for an unknown account id or payload size, 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?
A single compact sentence with the key qualifier ('Full account') front-loaded, so an agent gets the gist immediately. The keyword-list style is dense and slightly telegraphic ('path-in plan', 'what can be done next'), but nothing is padded or 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 single-parameter read tool with no output schema, the description adequately enumerates the returned facets and the annotations cover safety. The main gap is that it omits failure/empty behavior and leaves undefined domain terms ('path-in plan', 'gaps') to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100% ('The account. An existing account id.'), so the schema already does the work. The description adds no further meaning about the identifier's format, source, or resolution rules — 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 enumerates what a 'full account' contains (narrative with sources, path-in plan, contacts, activity, next actions), which implies retrieval, but never states a verb such as 'retrieve' or 'returns'. It is distinguishable from crm_update_account by the read-like framing, but nothing explicitly differentiates it from siblings like crm_coverage, crm_gaps, or crm_get_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 call this versus alternatives — crm_coverage, crm_gaps, crm_today, crm_list_contacts, or crm_get_contact all overlap with the payload facets listed here. Nor is there any stated prerequisite (e.g., that the account must already exist) beyond what the schema implies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_get_campaignCampaignBRead-onlyIdempotentInspect
One campaign: goal, status, and health.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign. An existing campaign id. |
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 safety behavior is fully covered structurally. The description adds only the payload hint (goal, status, health) and says nothing about missing-campaign errors or how 'health' is derived.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single economical fragment with the key scope word ('One') front-loaded and zero padding. It is arguably over-compressed rather than bloated, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and richly annotated, and there is no output schema, so the description's mention of goal/status/health is the only return-value signal - which is thin. It lacks error behavior and any hint of what a campaign record contains beyond the three listed fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter with 100% schema description coverage, so the schema already explains campaign_id as an existing campaign id. The description adds no format, source, or lookup guidance beyond that, which is the expected baseline when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain 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 and scope: a single campaign, returning goal, status, and health. The singular 'One campaign' implicitly contrasts with the sibling list tool crm_campaigns, so an agent can distinguish them, though the contrast is never made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this versus crm_campaigns (list), crm_update_campaign, or crm_set_campaign_status. The only signal is the singular phrasing plus the required campaign_id in the schema, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_get_contactContactCRead-onlyIdempotentInspect
One person: identity, provenance, gap state, the activity that touched them.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact, e.g. P-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered and the bar is lower. The description adds the one thing annotations cannot: what the response payload contains (identity, provenance, gap state, activity). It omits behavior on an unknown contact_id and any permission/scoping 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?
A single terse clause with no filler, but the compression is excessive: 'provenance' and 'gap state' are undefined jargon, and there is no front-loaded verb telling the agent what action is performed. Short at the cost of clarity rather than through economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 does the right thing by sketching the return payload's four content areas, but it stops there. For a lookup tool it never states what happens when the contact is not found or how large the embedded 'activity' can be.
Complex tools with many parameters or behaviors need more documentation. 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 required contact_id parameter with 100% schema description coverage (the schema even gives an example, 'P-0001'), so the schema fully carries parameter meaning. The description adds nothing about the identifier's format or behavior for unknown IDs, which is the expected baseline when the schema is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase enumerating contents ('identity, provenance, gap state, the activity') rather than a verb+resource statement like 'retrieve a single CRM contact'. An agent can infer it fetches one person's record, but the tool name is doing most of the work, and nothing distinguishes it from crm_list_contacts or hunt_get_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 indication of when to call this versus crm_list_contacts (lookup by id vs browse) or rim_gaps/crm_coverage which also expose gap state. The agent must guess the selection rule from names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_list_contactsContactsCRead-onlyIdempotentInspect
Every contact across accounts — named and gaps — with provenance and the human-entered network fields.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by state. |
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's job is to add context. It does disclose one useful behavioral fact — the result set includes gap/unresolved contacts as well as named ones — but says nothing about ordering, volume, or how departed contacts are treated by default.
Agents need to know what a tool does to the 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 padding. Its compactness costs clarity — 'provenance' and 'human-entered network fields' carry no concrete meaning — but structurally it is 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?
With no output schema and no annotations explaining the shape of results, the description must convey what the agent gets back. It gestures at this ('provenance', 'network fields') but leaves key domain terms and the gap-vs-named distinction unexplained, so an agent cannot fully predict the payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single enum parameter is documented, so the schema does the heavy lifting. The description hints that the default returns all states ('named and gaps'), which is mildly useful, but it never mentions the 'departed' enum value or how the filter interacts with those three 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?
It states the resource and scope ('Every contact across accounts') and signals that unresolved 'gap' contacts are included, which separates it from a single-record getter. However, there is no explicit verb and jargon like 'gaps', 'provenance' and 'human-entered network fields' is undefined, so an agent must infer that this is a read/list operation and guess what the returned fields mean.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus crm_get_contact, crm_gaps, crm_coverage, or crm_list_contacts-like siblings such as hunt_contacts. There is no mention of prerequisites or exclusions; the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_log_activityLog activityAInspect
Record a touch: what happened, when it actually happened, with whom. occurred_at is when it happened, which is not when it got typed (CRM-5) — a call logged three days late is still a call from three days ago, and staleness math depends on the truth. Interpretation in the summary is yours to write freely; facts inside it trace to sources (CRM-10). Effects: activity recorded.
| Name | Required | Description | Default |
|---|---|---|---|
| medium | No | ||
| summary | Yes | What happened, in your own terms. | |
| direction | No | ||
| account_id | Yes | The account. An existing account id. | |
| contact_id | No | Who, if a specific person, e.g. P-0001. | |
| occurred_at | Yes | When it actually happened. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write, non-destructive, non-idempotent, closed-world, so the description needn't restate safety. It instead adds genuinely non-obvious context: occurred_at reflects reality rather than entry time ('staleness math depends on the truth') and the summary's interpretive latitude vs. its factual provenance rule (CRM-10). It stops short of warning that retries will duplicate the record despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action and the critical occurred_at caveat are front-loaded, and every sentence carries substance. The trailing 'Effects: activity recorded.' is near-empty filler that adds nothing an agent doesn't already know from readOnlyHint=false.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter write tool with no output schema, the description covers the highest-risk semantic (occurred_at) well but leaves medium/direction undefined and never states what a successful call returns or how duplicates behave. Adequate but with clear omissions an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. 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 67% and the description meaningfully enriches two key parameters beyond their schema text: occurred_at's distinction from entry time, and what belongs in summary (free interpretation, sourced facts). medium and direction still carry empty schema descriptions and no mention in the prose, leaving two enum parameters to inference.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Record a touch: what happened, when it actually happened, with whom,' which tells an agent this creates an activity record. It does not distinguish itself from nearby siblings like crm_add_event, crm_attend_event, or crm_draft_outcome, so an agent cannot route confidently on purpose 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?
Usage is only implied by the action itself ('Record a touch'), with no explicit when/when-not guidance and no named alternative. Given the dense sibling set containing crm_add_event and crm_draft_outcome, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_pipelinePipelineARead-onlyIdempotentInspect
Accounts by status and tier with stage probabilities — the weighted where-are-we view. Filter by campaign or see everything.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | Only this campaign. An existing campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is fully covered without the description. The description adds that results are weighted by stage probability and grouped by status/tier, giving some sense of the aggregation behavior. It says nothing about ordering, result size, or how weighting is computed, so the added value is 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?
Two tight sentences with the primary framing front-loaded and the filtering behavior second. "The weighted where-are-we view" is slightly colloquial but does real work in conveying intent rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-required-param, read-only reporting tool with full annotation coverage, the description conveys enough: what entities, what grouping, what the weighting means, and the default scope. With no output schema present, a brief note on the returned fields would be the only 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 single optional campaign_id is already documented as "Only this campaign." The description contributes the complementary fact that omitting it returns everything, which is mild added meaning. Baseline 3 is appropriate for a one-param tool where 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 resource and shape: accounts grouped by status and tier with stage probabilities, characterized as the weighted pipeline view. It is clearly a read-only aggregate report rather than a record fetch or mutation, which separates it from most crm_* siblings. It stops short of naming a specific sibling to contrast with (e.g. crm_gaps or crm_coverage).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Filter by campaign or see everything" implies two usage modes and makes the no-arg default explicit, which is useful. However, there is no guidance on when to reach for this instead of adjacent views like crm_coverage, crm_gaps, or crm_campaigns, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_promote_to_customerPromote to customerAInspect
Create the core customer from a won account — the bridge from pursuit to trading. Won accounts only, at most once (CRM-8): a second customer for the same account would be a reconciliation problem wearing a convenience. Creation goes through core's API — one logged act marking where this area's job ends and order-to-cash begins. The account keeps its whole pursuit history; the customer starts clean. Effects: core customer created; account.customer_id linked.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Billing email. | ||
| terms | No | Payment terms for the new customer: immediate, or netN for N days (net7, net15, net30, net60). | |
| account_id | Yes | The won account. An existing account id. | |
| credit_limit | No | Opening credit limit. 0 (or omitted) means prepay only — a real position, not a missing value. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond annotations: it discloses the non-idempotent nature (at most once), the reconciliation risk of duplicates, the creation flow through core's API, and explicit effects ('core customer created; account.customer_id linked'). It does not contradict 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 core purpose is front-loaded, but the description is verbose and uses metaphorical language ('a reconciliation problem wearing a convenience', 'where this area's job ends and order-to-cash begins') that could be trimmed without losing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (a mutation that bridges two domains) and the lack of an output schema, the description covers when to use, key constraints, and effects. It could specify return values or error behavior, but the essential invocation details 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 schema fully documents all parameters. The description does not add any parameter-specific meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create the core customer from a won account'. It distinguishes from siblings by specifying the precondition 'Won accounts only' and the once-only constraint, which likely differentiates it from core_create_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear when-to-use context ('Won accounts only, at most once') and implicitly when not to use (non-won accounts or already promoted). However, it does not name alternative tools like core_create_customer for non-won scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_resolve_gapResolve gapAInspect
Turn a gap into a named contact — with full provenance. The only way a gap becomes named (CRM-2), and it demands the same provenance as a fresh contact — the gap does not lower the bar. The gap_note stays on the row: what we did not know is part of how we came to know it. Effects: contact gap -> named.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The person. | |
| No | As publicly listed or personally shared, if the source includes one. | ||
| phone | No | Same rule as email. | |
| title | No | Their title, as the source states it. | |
| source | Yes | Where the name comes from (CRM-1). | |
| contact_id | Yes | The gap row, e.g. P-0002. | |
| linkedin_url | No | The person's public LinkedIn profile URL, if the source includes one. | |
| confidence_note | No | How sure, and of what. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the mutation profile is already covered. The description adds genuinely new context beyond that: the gap_note is preserved on the row and provenance requirements still apply. It does not state what happens if the gap row is already resolved or whether a duplicate contact results, which are the remaining unknowns.
Agents need to know what a tool does to the 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 outcome is front-loaded in the first clause, followed by the exclusivity rule and the provenance constraint. Three short sentences with no filler; the (CRM-2) reference is the only item that costs an agent anything without a payoff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 eight parameters, a mutation annotation set, and no output schema, the description covers the conceptual model (gap becomes named, gap_note retained) adequately. It leaves open edge behavior an agent would want before calling: what happens when the contact already exists, and what a failed resolution returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight fields well, which sets the baseline at 3. The provenance framing in the description reinforces why source matters but adds no syntax, format, or constraint detail 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?
The description states a concrete verb and outcome — "Turn a gap into a named contact" — and adds an exclusivity claim ("The only way a gap becomes named") that separates it from generic contact tools like crm_add_contact. It stops short of naming that sibling explicitly, so the differentiation is inferred rather than handed over.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 way a gap becomes named" and the required gap row context imply this is only for pre-existing gap rows, and "the gap does not lower the bar" signals the provenance requirement. However, no alternative is named for the non-gap case and there are no explicit when-not conditions or prerequisites spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_set_account_statusMove statusInspect
Move an account along the pursuit lifecycle. Parking or killing a researched account requires a reason (CRM-7) — on_hold, closed and excluded all carry prose that will be read back. won, closed and excluded are terminal: nothing is deleted, and nothing quietly comes back either (CRM-6). Re-pursuing a closed account is a new decision — say so in a fresh why_them via update, then reopen deliberately is not offered: add it again the day it genuinely earns a new place. Effects: account.status moved, reason kept.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Required for on_hold, closed and excluded. Recommended for won. | |
| status | Yes | Where it moves. | |
| account_id | Yes | The account. An existing account id. |
crm_set_campaign_statusCampaign statusAInspect
Pause, resume or conclude a campaign. Pausing and concluding require a reason — a goal someone stops pursuing is a decision that gets asked about later (CRM-7 extended). Concluded is terminal: the accounts stay fully readable (CRM-6), but the campaign takes no new targets. Effects: campaign.status moved, reason kept.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Required for paused and concluded. | |
| status | Yes | Where it moves. | |
| campaign_id | Yes | The campaign. An existing campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-readonly, non-destructive, non-idempotent. The description adds real substance beyond that: concluded is terminal, accounts remain readable (CRM-6), and the effect is status moved plus reason retained. It stops short of stating reversibility of pause or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action verb, then the reason rule, then the terminal consequence. The parenthetical ticket references (CRM-7 extended, CRM-6) add mild noise but the core sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers the required-reason rule, terminality, and the resulting state. An agent has enough to invoke it correctly, though it says nothing about the return shape or error 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 coverage is 100%, so baseline is 3. The description still adds meaning by explaining why reason is required (a decision that gets asked about later) and tying status changes to the terminal consequence, giving semantic weight beyond the schema's terse 'Where it moves.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resource: 'Pause, resume or conclude a campaign', with 'status moved' as the effect. Clear what it does, but it never names the neighboring crm_update_campaign to disambiguate the two, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: reason is mandatory for paused and concluded, concluded is terminal. It omits explicit guidance about when to use this instead of crm_update_campaign, but the state-machine framing makes the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_set_path_inSet path inAInspect
Replace the ordered "how we get in" plan for an account. The bullets replace the previous set whole — a plan is one coherent thing, not a pile of appended thoughts. The old plan stays in the audit trail. Effects: path-in bullets replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| bullets | Yes | The plan, in order. | |
| account_id | Yes | The account. An existing account id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral content beyond the annotations: the whole-set replacement semantics and the fact that the prior plan is preserved in the audit trail. That audit-trail note also usefully explains why idempotentHint is false, since repeated calls accumulate history. It does not cover permissions or the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then explains the replacement rationale in two tight sentences. The trailing "Effects: path-in bullets replaced." restates what the second sentence already said, which is mild redundancy but not bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, non-destructive-flavored mutation with no output schema, the description covers the crucial ambiguity (does this append or overwrite?) and the data-retention question. Return values are unspecified, which is the main remaining gap but a minor one for a setter.
Complex tools with many parameters or behaviors need more documentation. 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 would be 3, but the description earns more by clarifying that the bullets array is a complete replacement rather than an append — a semantic distinction the schema alone ("The plan, in order.") does not convey. It also implies ordering matters, matching the array's intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ("Replace") against a specific resource (the ordered "how we get in" plan for an account), which is unambiguous. It does not, however, name a sibling or state how it differs from adjacent CRM tools like crm_update_account or crm_add_account, 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?
The description makes the usage model implicit but readable: this is the tool for defining the whole plan, not appending to it. It never states when to use it versus alternatives, nor any preconditions (e.g., account must already exist, which is only inferable from the schema's "An existing account id").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_todayTodayARead-onlyIdempotentInspect
The CRM work queue: open gaps, accounts going stale, and what happened lately. Three lists, one question: what deserves attention today. Gaps are research work; stale active accounts are follow-up work; recent activity is context.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations confirm it is read-only and safe, the description adds crucial contextual behavior by defining the meaning of the lists: 'Gaps are research work; stale active accounts are follow-up work; recent activity is context.' This helps the agent interpret the data types accurately.
Agents need to know what a tool does to the 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 concise and structured like effective product copy. It immediately addresses the value proposition in the first sentence, followed by the core value and necessary internal definitions, ensuring zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description provides a complete high-level overview of the results, detailing exactly which three types of information the user will receive and what those categories represent in a functional sense.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since the tool has zero parameters and 100% schema coverage, the baseline score of 3 is appropriate. The description adds no information regarding input parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The tool clearly defines its purpose as providing a daily, prioritized summary ('The CRM work queue'). It specifies the three main categories of output: open gaps, accounts going stale, and recent activity, making its function distinct from transactional siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly answers 'when to use' by framing the tool's purpose around the question: 'what deserves attention today.' This establishes a clear use case for daily triage compared to more granular update tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_update_accountUpdate accountAInspect
Correct or deepen the account narrative. Only the fields you pass change. Provenance survives updates (CRM-9): why_them and source_url can be corrected, never blanked. Status moves have their own command, with its own rules.
PARKING IS NOT A STATUS MOVE (CRM-18). status is a judgement about where a pursuit sits; parking is a fact about what happened to it — both intake routes dead, the sponsor left, a reorganisation in flight. An account parked at researching is still at researching, and says why nobody is spending time on it. Parking needs a reason, is reversible with park="", and takes the account out of the worklists until it comes back. Effects: account narrative updated; account parked or unparked, with the reason kept.
| Name | Required | Description | Default |
|---|---|---|---|
| hook | No | The one-sentence opener you would actually use. | |
| name | No | Rename, if the company did. | |
| park | No | Why this account should be left alone, as a fact about what happened. Empty string unparks it. Read by whoever considers reopening it, so "both intake routes dead: form errors, research@ bounced 11 Sep" is useful and "not worth it" is not. | |
| tier | No | 1–3. Tier semantics are yours; 1 usually means "worth a hand-written approach". | |
| vertical | No | Industry vertical, your taxonomy. | |
| why_them | No | Correcting, not blanking (CRM-9). | |
| account_id | Yes | The account. An existing account id. | |
| owner_note | No | Working notes. | |
| source_url | No | Correcting, not blanking (CRM-9). | |
| trigger_event | No | What changed that makes now the moment. A fact, with the source in source_url. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides critical behavioral guarantees beyond the structured fields, such as 'Only the fields you pass change' and 'Provenance survives updates (CRM-9).' It also details the functional logic of the 'park' state (reversible with park='', moves account out of worklists), which is crucial behavioral context for an updater 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 definition is highly discursive and dense. It sacrifices conciseness in favor of comprehensive detail and business context. While the structure is logical (goal -> constraints -> behavioral rules), the sheer volume of explanatory text makes it less immediately readable than a perfectly concise 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?
Given the tool's complexity—involving nuanced operational states (parking), historical constraints (provenance), and the difference between status and fact—the description is remarkably complete. It covers the most important edge cases and behavioral constraints an agent needs before making a call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema coverage is 100% (setting a baseline), the description adds essential operational semantics that the schema lacks. Examples include explaining that 'park' is a 'fact about what happened,' why `why_them` cannot be blanked, and that '1' in `tier` means 'worth a hand-written approach.' This adds significant decision-making value to parameter interpretation.
Input schemas describe structure but not intent. Descriptions should explain 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 purpose is clearly defined as correcting or deepening the account narrative. However, while it is clear what the tool does, the description relies heavily on specialized CRM terminology, which could be slightly clearer in distinguishing itself from a general 'customer' update tool, though its focus on 'account' provides a good distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
This definition provides excellent usage guidelines by setting strict boundaries: distinguishing between 'status moves' and 'parking,' and explaining the unique semantics of the 'park' field. It directly addresses common operational pitfalls for this type of tool, significantly aiding agent selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_update_campaignUpdate campaignBInspect
Sharpen a campaign. The goal can be corrected, never blanked. Same rule as provenance (CRM-9 in spirit): the goal is load-bearing — sharpen it freely, remove it never.
CLAIMS ARE HUMAN-ONLY (CRM-17). claims_allowed is what this business has decided it may say about itself; claims_refused is the words and phrases no draft on this campaign may contain. Both are typed by a person, and both replace the previous list whole. Agents read them before drafting (crm_get_campaign) and are refused at write time by the second list, but the gate cannot catch an overstatement of a claim that is itself allowed — so a draft has to stay inside what the claim actually says, not merely mention the same subject. Effects: campaign updated; claim lists replaced when passed.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Correcting, not blanking. | |
| name | No | ||
| campaign_id | Yes | The campaign. An existing campaign id. | |
| claims_allowed | No | What a draft on this campaign may assert. Replaces the list whole; empty list clears it. HUMAN-ONLY: entered by a person, never an agent — do not write this field. | |
| claims_refused | No | What no draft on this campaign may say. Replaces the list whole; empty list clears it. HUMAN-ONLY: entered by a person, never an agent — do not write this field. | |
| target_profile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-open-world, non-idempotent update. The description adds meaningful behavior beyond that: goal cannot be blanked, claim lists are replaced whole, claims are human-only, agents are refused at write time by claims_refused, and the gate cannot catch overstatements of allowed 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?
The description is organized into paragraphs and front-loads some key rules, but it uses flowery language and external references such as 'CRM-9 in spirit' and 'CRM-17' that may not help an agent. The claim-gate explanation is valuable but lengthy relative to the core update operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no output schema, the description covers the critical goal and claims behavior but omits name and target_profile entirely. It also does not describe what happens to fields that are not passed, leaving important update semantics incomplete.
Complex tools with many parameters or behaviors need more documentation. 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 67%, and the description adds important meaning for goal and especially the claims_allowed/claims_refused fields, including human-only entry and whole-list replacement. It does not compensate for the empty schema descriptions of name and target_profile, so it falls short of full parameter 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 opening 'Sharpen a campaign' is metaphorical, but the later 'Effects: campaign updated; claim lists replaced when passed' clarifies that this is a mutation tool. It does not clearly enumerate all updateable fields such as name and target_profile, nor does it distinguish this tool from siblings like crm_create_campaign or crm_set_campaign_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 useful constraints: the goal may be corrected but never blanked, and claim lists are human-only and should be read via crm_get_campaign before drafting. However, it does not explicitly say when to choose this tool over alternatives such as crm_set_campaign_status or crm_create_campaign.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_update_contactUpdate contactAInspect
Correct or extend a contact. The relationship-graph fields are human-only. Ordinary fields are open: titles change, confidence firms up, people depart (status=departed — never deleted, CRM-6). Provenance is correctable, never removable (CRM-9). mutual_via, mutual_url and linkedin_path are entered by a person, never an agent — ask your human to fill them in; that is correct behavior, not a limitation to route around. Effects: contact updated.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Correcting a name still requires the source to cover it. | |
| No | As publicly listed or personally shared. | ||
| notes | No | ||
| phone | No | Same rule as email. | |
| title | No | ||
| source | No | Correctable, never removable (CRM-9). | |
| status | No | departed keeps the row and the history. | |
| contact_id | Yes | The contact, e.g. P-0001. | |
| mutual_url | No | Link to the mutual, from your own account. HUMAN-ONLY: entered by a person, never an agent — do not write this field. | |
| mutual_via | No | Who the mutual connection is. HUMAN-ONLY: entered by a person, never an agent — do not write this field. | |
| linkedin_url | No | The person's public LinkedIn profile URL. | |
| linkedin_path | No | e.g. "2nd via Alex M." — read off your own LinkedIn. HUMAN-ONLY: entered by a person, never an agent — do not write this field. | |
| confidence_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, non-readOnly, non-idempotent. The description goes beyond them with substantive policy: departures set status=departed and never delete the row (CRM-6), and provenance is correctable but never removable (CRM-9) — genuinely useful for an agent deciding whether a call is safe. It does not state whether omitted fields are left untouched, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and effect, and every sentence carries a rule or a constraint; nothing is padding. The rule codes (CRM-6, CRM-9) are cited without definition and the telegraphic phrasing ('confidence firms up') costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 'Effects: contact updated' adequately covers the return. However, for a 13-parameter mutation tool the description never says whether the update is partial (omitted fields preserved) or a full replacement — a material omission given idempotentHint=false and the 'Correct or extend' framing.
Complex tools with many parameters or behaviors need more documentation. 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 77%, and the description still adds meaning for the highest-risk parameters: it explains the departed semantics, the correctable-but-not-removable rule for source, and reinforces the HUMAN-ONLY constraint on the three relationship-graph fields. Notes, title and confidence_note remain undocumented in both places, but the risky parameters are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Correct or extend a contact') and adds a concrete effect line ('Effects: contact updated'), which clearly separates it from crm_add_contact and the read-only crm_get_contact. It does not name those siblings explicitly, so the differentiation is inferable 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?
It sets a clear boundary between what the agent may change ('ordinary fields are open: titles change, confidence firms up, people depart') and what it must not touch (mutual_via, mutual_url, linkedin_path), with an explicit instruction to ask the human. It never mentions the sibling crm_set_path_in, which plausibly covers some of these relationship fields, so alternative routing is left unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_update_draftRewrite a draftAInspect
Rewrite a draft that has not been sent. Pass only what changes. USE THIS WHEN THE ANGLE CHANGES rather than discarding and starting again: a better hook turns up, the trigger event moves on, your human asks for a different opening. Discarding loses the rationale and the record of what was already tried on this contact.
A SENT DRAFT CANNOT BE TOUCHED (CRM-15). Its text was copied onto the activity trail as the record of what actually reached a real person, and rewriting it would leave these books describing a message nobody sent. Write a follow-up instead.
A DISCARDED DRAFT CANNOT BE REVIVED. A person read it and rejected it; bringing it back would quietly overturn that decision. Write a fresh one and say in the rationale what changed.
An edit goes through the same claim gate as a new draft: an edit cannot smuggle in what the first write would have stopped. The draft stays a draft, so a person still reads it. Effects: draft text replaced; it remains unsent.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The new message. | |
| subject | No | The new subject line. | |
| draft_id | Yes | The draft, e.g. D-0001. | |
| rationale | No | The new note to the reviewer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read/write/idempotency flags; the description adds real behavioral context beyond them — the claim gate that a new draft would face, the immutability of sent and discarded drafts with the rationale for each, and an explicit 'Effects: draft text replaced; it remains unsent' line.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and organized into scannable blocks (when to use, sent, discarded, effects). It runs long for a 4-parameter tool and the capitalized emphasis is slightly repetitive, but nearly every line carries a rule the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers state constraints, the claim gate, and the resulting effect, which is nearly everything needed to invoke it safely. It omits what the call returns and whether the prior body is archived anywhere, which an agent composing follow-ups would benefit from.
Complex tools with many parameters or behaviors need more documentation. 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 still adds meaning by framing the call as a partial update ('Pass only what changes'), which confirms that unset fields like subject or rationale are left alone. It does not clarify whether the replaced text is retained anywhere for the reviewer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Rewrite a draft that has not been sent. Pass only what changes.' The sent/discarded state rules implicitly separate it from crm_draft_message (new draft) and crm_drafts (listing), but no sibling is named explicitly, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('USE THIS WHEN THE ANGLE CHANGES rather than discarding and starting again') and enumerates the triggering situations. It also gives when-not conditions with the correct alternative behavior: follow-up for sent drafts, fresh draft for discarded ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crm_update_eventUpdate eventAInspect
Reschedule, correct, close as done with what came of it, or cancel with a reason. A move of the date needs a reason and a source, the same as the date did the first time: "the venue page now says the 14th" is a reason; "moved" is not. Done takes an outcome, because an event with no outcome is an intention that went stale. Cancelled takes a reason. Neither is undone here (CRM-21): if a cancelled thing is happening after all, that is a new event with a new source. Effects: event rescheduled, corrected, done or cancelled; the reason kept.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| date | No | New date, with its reason and source. ISO date, YYYY-MM-DD. | |
| note | No | ||
| time | No | New time, HH:MM, or empty string to clear. | |
| title | No | ||
| reason | No | Why it moved, or why it was cancelled. | |
| source | No | Where the new date came from, when the date changes. | |
| status | No | Close it. done needs an outcome; cancelled needs a reason. | |
| outcome | No | For done: what came of it. | |
| event_id | Yes | The event, e.g. EV-0001. | |
| location | No | ||
| contact_id | No | Who it is with, e.g. P-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-readonly, non-destructive, non-idempotent, closed-world mutation. The description adds genuinely non-structured context: terminal states are irreversible here (CRM-21), which fields each mode demands, and an explicit 'Effects' line summarizing the resulting state and that the reason is retained.
Agents need to know what a tool does to the 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 mode enumeration, then the requirements, then effects — a sensible order. Some space is spent on aphorism ('an event with no outcome is an intention that went stale') that conveys tone more than callable information, but the core content earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation with no output schema and adequate annotations, the description covers the decision-relevant surface: how to pick a mode, what each mode requires, and irreversibility. Minor gaps remain on the auxiliary fields (title, location, url, note) and on what the response returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description contributes one real cross-field constraint the schema cannot express: a date move requires both reason and source together. However, with coverage at 67%, four parameters (url, note, title, location) have empty schema descriptions and are never addressed in the prose, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (event) and enumerates the four modes it covers: reschedule, correct, close as done, cancel. It also distinguishes itself from the create path by noting that a resurrected cancellation 'is a new event with a new source', though it does not name crm_add_event or crm_attend_event 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?
Gives per-mode preconditions with a concrete example of good vs. bad input ('the venue page now says the 14th' vs 'moved') and a clear when-not: cancelled/done cannot be undone here, so reopen by creating a new event. It stops short of naming the sibling tool to use for that create path, leaving a small inference step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_changesChanges after closeBRead-onlyIdempotentInspect
What the record now says differently about closed periods, per account, landing on the first open day.
| 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, non-destructive, and closed-world behavior. The description adds one useful behavioral detail—changes land on the first open day—but does not explain response shape, timing, or how the per-account grouping works.
Agents need to know what a tool does to the 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 filler. It is front-loaded with the key concept, though the phrasing is somewhat cryptic and could be clearer without adding length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only tool with no output schema, the description gives the conceptual content of the result (per-account differences in closed periods). It does not clarify what the return structure looks like or what 'the record' refers to, leaving gaps for an agent trying to interpret the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline for a parameterless tool is 4, and the description does not introduce confusion about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a domain concept—differences in closed periods per account—but does not state an action verb such as list, get, or report. It is more specific than the tool name alone, yet an agent cannot confidently distinguish it from gl_closes, gl_entries, or gl_closes 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?
There is no guidance on when to use this tool versus siblings such as gl_closes, gl_close_period, or gl_entries. The closed-period context implies a use case, but 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.
gl_checklistClose checklistARead-onlyIdempotentInspect
What blocks closing the books through a day (unreviewed statement rows, accounts that do not tie), and what is open but not blocking.
| Name | Required | Description | Default |
|---|---|---|---|
| through | Yes | The last day of the period to close. ISO date, YYYY-MM-DD. |
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 structurally. The description's real contribution is conceptual return-shape disclosure — the split between blocking and non-blocking findings — which matters because there is no output schema. It does not describe how findings are enumerated or how the response is organized beyond that binary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero filler, and the blocking/non-blocking dichotomy is front-loaded so the reader immediately knows the return shape. 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?
With no output schema, the description carries the burden of explaining what comes back, and it does so at a categorical level (blockers vs. open items) while enumerating example blocker types. It stops short of describing structure or whether results are grouped, which leaves a small gap for a single-parameter read-only report tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'through' is fully documented in the schema as the last day of the period in ISO YYYY-MM-DD format, giving 100% coverage. The description restates the concept ('through a day') but adds no semantics beyond the schema, which is the expected baseline when the schema already 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?
The description names a concrete resource (close checklist) and states precisely what it surfaces: items that block closing the books through a given day versus open-but-non-blocking items. That is specific enough to distinguish it from mutation-oriented siblings, but it never explicitly contrasts itself with gl_close_period or gl_closes, so the boundary with those tools 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?
Usage is implied rather than stated: 'what blocks closing the books' suggests calling this before attempting gl_close_period, but the description never says so, never names the alternative, and never states when this check is unnecessary. An agent must infer the pre-close workflow position itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_close_periodClose the booksAInspect
Close the books through a day: the period's journal is kept as it stands, and its figures stop moving. Later changes land as corrections in the next open period. HUMAN-ONLY: this act is refused to you whatever your role — Closing the books is the person's or the accountant's sign-off on what the period says. Ask your human to do it. Refused to you whatever your role. Show the person the checklist (gl_checklist): what blocks the close and what is open. They close it in the app. Effects: period closed; its journal kept with its totals and a hash.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | What the close is: "September close, reviewed with Dana". | |
| through | Yes | The last day of the period being closed. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, non-idempotent, non-destructive; the description adds the substantive traits that matter: the operation is hard-blocked for the agent regardless of role, what state the period ends in (journal kept with totals and a hash), and how subsequent changes are handled (corrections in the next open period). This is behavior the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical constraint (HUMAN-ONLY / refused to you) is front-loaded and the effects are stated compactly. However 'refused to you whatever your role' is effectively repeated twice in adjacent sentences, which is wasted space given inherently limited description budget.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, no-output-schema mutation, the description covers everything an agent needs: whether it may call it, what to do instead, and the resulting state. No return-value explanation is required since there is 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?
Schema description coverage is 100% and both parameters (through, reason) are documented there with format and an example; the description adds no additional meaning about parameter semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (close the books through a day) and defines the semantic effect precisely – journal frozen, figures stop moving, later changes become corrections. It is clearly distinguishable from gl_reopen_period and gl_checklist by naming the checklist as the agent-facing 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?
Explicit and unambiguous about when this tool should not be called ('refused to you whatever your role'), who must perform the action (the person or the accountant), and the exact substitute workflow: show gl_checklist, then the human closes it in the app. This is a textbook when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_closesClosesBRead-onlyIdempotentInspect
Every close: through when, by whom, its totals and hash, and whether the record has changed since.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 safety is covered. The description adds real value by disclosing that each record carries a hash and a changed-since flag — an integrity/tamper-detection signal not in the annotations. It stops short of ordering, pagination, or scope (all periods vs current).
Agents need to know what a tool does to the 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 clause with no filler — the most important fact (every close) comes first. It is a sentence fragment with no verb, which makes it slightly cryptic at first read but wastes no 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 parameters and no output schema, the description sensibly carries the return-shape burden by naming the fields an agent will get back. Missing only scope/ordering details, which are minor for a zero-arg read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The field list it does give is return-value context, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Every close" plus a list of the fields returned (through when, by whom, totals, hash, changed-since) makes it clear this enumerates close records with their detail. The resource is unambiguous, but there is no explicit verb (list/get) and no mention of gl_close_period or gl_changes, so an agent must infer it is a read-only enumeration rather than a close action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to call this versus gl_close_period (perform a close), gl_changes (what changed), or gl_checklist. The agent gets no routing signal at all beyond the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_entriesAdjusting entriesARead-onlyIdempotentInspect
Adjusting entries, newest first, with their lines and any reversal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description's only added behavior is the ordering guarantee (newest first) and the fact that line detail and reversal linkage are included — useful, but thin, and it says nothing about how many entries come back or how periods are scoped.
Agents need to know what a tool does to the 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; the resource, ordering, and payload contents all earn their place in under fifteen words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return shape, and it does the minimum (lines and reversal included). It omits the fields on each entry line, the absence of any pagination/limit control given zero parameters, and whether 'adjusting' is a filter or a synonym for all journal entries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no per-parameter semantics to explain and the baseline of 4 applies. The schema is a closed empty object, matching the description's implicit 'list everything' behavior.
Input schemas describe structure but not intent. Descriptions should explain 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 resource (adjusting entries) and adds scope details — newest-first ordering, includes lines and reversal markers. It stops short of explicitly distinguishing itself from the singular gl_entry or the sibling journal/ledger tools (gl_changes, core_journal), so the agent must infer that this is the list-all variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: an agent reading 'adjusting entries, newest first' will infer this is the read path for reviewing adjusting entries, but there is no explicit when-to-use statement, no prerequisite/period context, and no named alternative such as gl_entry for fetching a single entry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_entryAdjusting entryCRead-onlyIdempotentInspect
One adjusting entry with its lines.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | e.g. JE-0001. |
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 covered. The description adds one useful fact beyond them: the response includes the entry's lines, not just header data. It says nothing about behavior for voided or missing entries, but with full annotation coverage 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?
One short sentence with no filler and the key detail ('with its lines') placed where it is read first. It is efficient, though its brevity shades into under-specification rather than tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full schema coverage and rich annotations, the description is minimally adequate: it tells the agent what comes back. It omits whether totals/status are included, what happens on a bad ID, and how it relates to the entry list — gaps an agent may hit in practice.
Complex tools with many parameters or behaviors need more documentation. 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 entry_id parameter already carries an example ('e.g. JE-0001.'). The description adds no meaning about the identifier format or lookup behavior, so the schema does all the work — 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?
The description is a noun phrase ('One adjusting entry with its lines') rather than a verb+resource statement, so the agent must infer that this is a single-entry fetch. The singular form implies a counterpart to gl_entries, but that distinction is never stated. Purpose is inferable but not explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus gl_entries (list), gl_record_entry (create), or gl_void_entry (void). The agent must derive the read-single-record role from the name alone. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_record_entryNew adjusting entryAInspect
An adjusting entry for the close: an accrual, depreciation, a correction. Balanced, dated in an open period, with a reason. An accrual can reverse itself on the 1st of the next month. Adjusting entries are the accountant's tool: record them when the accountant or the person gives the figures, never invent an amount. Each line names an account in their words and says what kind it is (asset, liability, equity, income, expense), with a debit or a credit; the entry must balance. Mark an accrual to reverse (reverse: true) so it undoes itself on the 1st of the next month, when the real bill or payment arrives. A period that is already closed takes no entries: date it in the open period. Effects: adjusting entry recorded; its reversal on the 1st of the next month, when marked.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day it belongs to, usually the last day of the month. ISO date, YYYY-MM-DD. | |
| memo | Yes | What it is: "September internet, not billed yet". | |
| lines | Yes | The lines; debits must equal credits. | |
| reason | Yes | Why, and where the figure comes from. | |
| reverse | No | An accrual: reverse it on the 1st of the next month. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false, non-idempotent). The description adds real behavioral context beyond that: entries must balance, must land in an open period or be rejected, accruals marked reverse:true self-reverse on the 1st of the following month, and an explicit "Effects" line stating what is created.
Agents need to know what a tool does to the 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 the core constraint, and the closing "Effects" line is useful. Slightly redundant: the 1st-of-next-month reversal is explained twice, and the kind-of-account explanation repeats the enum description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the important ground: preconditions (open period), validation (must balance), side effects (auto-reversal), and what gets created. It stops short of saying what the call returns (e.g., the created entry identifier), which matters slightly more given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 interpretive meaning: each line names an account "in their words" plus its kind so statements can place it, debit/credit must balance, and reverse:true is tied to the next-month-1st behavior in prose. The date/memo semantics are largely restated from the schema, so it does not 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 (record an adjusting entry) and immediately concretizes it with examples: "an accrual, depreciation, a correction." It is clearly distinguishable from the neighboring gl_entry/gl_journal/gl_void_entry family because it is scoped to period-close adjustments with a reason and a balancing requirement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operating conditions: record only "when the accountant or the person gives the figures, never invent an amount," and "A period that is already closed takes no entries: date it in the open period." It does not name a sibling alternative (e.g., a plain journal entry tool) to route the agent elsewhere, 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.
gl_reopen_periodReopen the latest closeAInspect
Reopen the most recent close, with a reason. Its period moves again with the record; the close stays on the record as reopened. HUMAN-ONLY: this act is refused to you whatever your role — Reopening a closed period undoes a sign-off; a person decides that, with a reason. Ask your human to do it. Refused to you whatever your role. Only the latest close can be reopened; earlier ones stay closed. Effects: latest close reopened.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it is reopened. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that reopening undoes a sign-off, that a reason is mandatory, and that the close is retained on the record as reopened rather than erased — which is what makes destructiveHint=false credible. It also declares a hard authorization rule (refused regardless of role) that no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical fact — human-only — is front-loaded and repeated for emphasis, which is defensible for a refusal. However, "Refused to you whatever your role" appears twice as a standalone sentence, and "Its period moves again with the record" is vague enough to be noise rather than information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, non-callable-by-agent mutation with no output schema, everything needed is present: who may invoke it, what it does to the sign-off, what is retained, and which close qualifies. There is no realistic gap left for an agent 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 the single parameter is fully documented as "Why it is reopened." The description's "with a reason" restates rather than enriches that, adding no format, length, or validation guidance. Baseline 3 is appropriate when the schema already carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Reopen the most recent close") and immediately scopes it to the latest close only, which cleanly separates it from the sibling gl_close_period and from gl_closes/gl_entries reads. An agent knows exactly what the operation is 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 the explicit when-not: "HUMAN-ONLY: this act is refused to you whatever your role ... Ask your human to do it." That is an unambiguous routing instruction rather than implied usage. It also bounds applicability ("Only the latest close can be reopened; earlier ones stay closed").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gl_void_entryVoid entryADestructiveInspect
Void an adjusting entry in an open period, with a reason. It stays on the record as voided. Only while its period is open. In a closed period, record the opposite entry in the open period instead. Effects: entry voided.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it is voided. | |
| entry_id | Yes | The entry, e.g. JE-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds material context the agent cannot get elsewhere: the void is non-destructive to the audit trail ('stays on the record as voided'), a reason is mandatory, and the period must be open. That soft-void semantics is the key behavioral fact an agent needs before invoking.
Agents need to know what a tool does to the 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 effect, no filler sentences. The choppy fragments ('Only while its period is open.') read as notes rather than prose but cost nothing in length and keep the constraint prominent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, precondition, fallback path, and the resulting state change ('Effects: entry voided'), which is sufficient given there is no output schema and only two fully documented parameters. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both entry_id and reason documented in-schema, so the description only needs to reinforce. It mentions 'with a reason' but adds no format or validation detail beyond what the schema already provides — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Void an adjusting entry') plus the scope constraint (open period, with a reason), which cleanly separates it from gl_record_entry and gl_close_period. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only while its period is open') and a named fallback behavior for the excluded case ('In a closed period, record the opposite entry in the open period instead'). This is exactly the when-to-use / when-not-to-use guidance that prevents a wrong call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_add_contactAdd contactBInspect
Add a person. A source is mandatory — how we know them. Never invent a contact (JH-2). The source is the answer to "how do we know this person" — a recruiter who reached out, a referral, a name from an email thread. Effects: contact created.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The person. | |
| role | No | ||
| No | |||
| notes | No | ||
| phone | No | ||
| source | Yes | REQUIRED: where this person came from. | |
| company | No | Their company — created if new. | |
| company_kind | No | ||
| linkedin_url | No | ||
| relationship | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so "Effects: contact created" mostly restates them. The description does add one genuine rule (do not fabricate a contact, source is required), but it omits the consequence of idempotentHint=false — creating duplicates — even though a `hunt_check_duplicates` sibling exists, and it says nothing about the side effect of auto-creating the company noted 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?
The mandatory-source constraint is front-loaded, and the source explanation with three concrete examples earns its space. "Effects: contact created" is near-redundant given the annotations, and the parenthetical rule id (JH-2) is an internal reference with no explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 10-parameter, non-idempotent write with no output schema, the description should say what comes back (an id? the contact?), what happens on duplicate detection, and how the contact relates to the hunt pipeline. It covers the source requirement well but leaves the agent guessing on duplicate behavior and return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 30% across 10 parameters, so the description carries the burden — and it only fully explains `source`, with good examples of what counts. The other eight parameters (role, email, notes, phone, company, company_kind, linkedin_url, relationship) get nothing beyond their field names, and the two enums' business meaning is left entirely implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Add a person" is a clear verb+resource and the description immediately identifies the tool's subject as a contact/person record. It does not, however, distinguish itself from the very similar sibling `crm_add_contact`, nor from `hunt_apply` (which presumably also creates people in a pipeline), so the 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?
The description gives a strong guardrail ("Never invent a contact", source mandatory) and defines what a valid source is, which is real usage guidance. But it never says when to reach for this tool versus `crm_add_contact`, `hunt_check_duplicates`, or `hunt_update_contact` when the person already exists — the most likely selection error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_add_interviewAdd interviewAInspect
Record a scheduled round. Moves the application to interviewing. Rounds are facts with outcomes (JH-12). The round number defaults to the next. Effects: interview round recorded; application -> interviewing.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| notes | No | ||
| round | No | Defaults to the next round number. | |
| interviewer | No | As they were introduced — a fact, not a guess (JH-1). | |
| scheduled_at | No | ISO timestamp. | |
| application_id | Yes | The application. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-readonly, non-destructive mutation. The description adds useful behavioral context: the application moves to interviewing, the round number defaults to the next, and the round is recorded as a fact. It does not cover duplicate handling or permission requirements, but it meaningfully supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and structured around purpose, defaults, and effects. Every sentence contributes useful information 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 mutation tool with no output schema, the description adequately explains the key side effect and round-number behavior. Some parameter-level details and duplicate-prevention behavior are absent, but the essential context for correct invocation 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 description coverage is 67%, with kind and notes lacking schema descriptions. The description only clarifies the round default, which is already stated in the schema, and does not explain the missing kind or notes parameters. This is adequate but does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Record a scheduled round,' and states the resulting state transition to interviewing. It clearly separates recording a scheduled round from recording an outcome, though it does not explicitly name sibling tools like hunt_interview_outcome.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Record a scheduled round,' but the description gives no explicit when-to-use guidance, exclusions, or alternative tools. An agent can infer the context, but must still determine on its own when to prefer this over hunt_interview_outcome or hunt_set_application_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_add_postingNew postingAInspect
Record a JD encountered. Runs the duplicate guard; its warnings ride the result. Facts come only from the JD or actual correspondence (JH-1). The company is created by name if new; for agency postings, get the end client — the guard keys on it, and the same req arriving through four agencies is normal (JH-3). The warnings in the result are for a PERSON to act on: never silently merge, never quietly drop — a double submission can disqualify the candidate. Effects: posting created as lead; duplicate warnings surfaced in the result.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Posting URL. | |
| title | Yes | Role title as posted. | |
| req_id | No | Requisition id exactly as printed, e.g. 151469BR. | |
| source | No | How it reached us. | |
| company | Yes | Hiring company or agency as presented. Created if new. | |
| jd_text | No | Full JD text, verbatim. Feeds search and the duplicate guard. | |
| comp_max | No | Annualized. In cents (integer minor units) — 1250 means $12.50. | |
| comp_min | No | Annualized. Hourly: annualize ×2080 and say so in comp_notes (JH-11). In cents (integer minor units) — 1250 means $12.50. | |
| location | No | ||
| red_flags | No | e.g. "no comp, no client, registered-agent address". | |
| work_mode | No | ||
| comp_notes | No | Caveats in prose: "band decorative", "hourly $85 annualized". | |
| end_client | No | The real client behind an agency posting — key for the duplicate guard (JH-5). Ask for it. | |
| company_kind | No | Kind, for a newly created company. | |
| employment_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds what the annotations cannot: the duplicate guard runs automatically, warnings ride the result, the company is auto-created by name, and the record is created with lead status. It also states the operational constraint (never silently merge or drop) and the consequence of failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action, the guard, then the sourcing rule, then the effects. Some shorthand (JH-1, JH-3, "lead") assumes internal vocabulary, and the duplicate-guard note is split awkwardly across the first and second sentences, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation with no output schema, the description covers the essential unknowns: a duplicate check runs, its output appears as warnings, and a company may be created as a side effect. That is what an agent needs before calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, and the description adds real meaning on top: company semantics (created if new, by name), and that end_client is the duplicate-guard key so it must be actively asked for. It does not touch compensation units or req_id formatting, but the schema already covers those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Record a JD encountered" gives a specific verb and resource, and the description immediately scopes it to creation plus duplicate guarding, which separates it from hunt_update_posting, hunt_evaluate_posting and hunt_check_duplicates. An agent can tell what it does and roughly where it sits in the flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use (facts only from the JD or real correspondence, end client required for agency postings) and warns that warnings are for a person to resolve. It does not explicitly say when to use this instead of hunt_check_duplicates first or hunt_update_posting for existing records, so the sibling routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_add_resume_versionRegister resume versionCInspect
Register a resume version so applications can point at what was actually sent. When a recruiter says "the resume you sent", there must be exactly one answer (JH-10). Effects: resume version registered.
| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | ||
| label | Yes | Short unique name, e.g. "AI & Integration". | |
| notes | No | ||
| headline | No | ||
| platform | No | ||
| file_path | No | ||
| external_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-read-only, non-destructive, non-idempotent write operation. The description adds little beyond that: 'Effects: resume version registered' restates the obvious, and it does not explain duplicate handling, uniqueness constraints, permissions, or other behavioral details beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose. The 'Effects' sentence is largely redundant, but the overall structure is efficient and does not bury the main point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 7 parameters, low schema description coverage, and no output schema, the description is not complete enough. It explains the purpose but leaves the agent without guidance on how to populate most fields or what to expect from the registration operation.
Complex tools with many parameters or behaviors need more documentation. 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 7 parameters and only 14% schema description coverage, with most properties documented by empty descriptions. The description does not explain any parameter semantics at all, leaving fields such as focus, notes, headline, platform, file_path, and external_id without 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 a specific verb and resource: register a resume version. It clearly explains the business purpose but does not explicitly distinguish this tool from siblings such as hunt_resume_versions or hunt_get_resume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 implied usage scenario: register the resume version that an application points to when a recruiter asks about 'the resume you sent'. However, it does not say when to use this instead of related sibling tools or mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_applyApplyAInspect
Record an application actually submitted. One per posting. One application per posting (JH-4) — the duplicate guard exists so the SAME role through two agencies gets a decision, not two submissions. applied_at accepts the literal "unknown" when the submission is real but the date was never recorded — never guess a date (JH-1). Record the resume version that actually went out (JH-10). Effects: application created; posting -> applied; submission logged as a touch.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | ||
| applied_at | No | ISO date, or the literal "unknown" — never a guess (JH-1). | |
| posting_id | Yes | The posting. | |
| via_contact | No | Recruiter who submitted, e.g. HC-0001 — for the double-submission audit. | |
| resume_version | No | What was actually sent — label or id (JH-10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The 'Effects' line explicitly enumerates the three state changes (application created, posting -> applied, touch logged), which is exactly the mutation detail annotations cannot convey beyond destructiveHint=false. It also discloses the duplicate-guard behavior and the 'unknown' date escape hatch, so the agent knows the failure mode and the sanctioned edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the constraint, then the edge cases, then effects — a sensible ordering. Minor redundancy between 'One per posting.' and 'One application per posting (JH-4)', which restate the same rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with no output schema, the description covers side effects, the duplicate constraint, and the unknown-date case, which is most of what an agent needs. Missing pieces are what a successful call returns (application id?) and what the channel parameter means.
Complex tools with many parameters or behaviors need more documentation. 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 80%, so the baseline is 3. The description reinforces applied_at's 'never guess' rule and resume_version's intent, but it says nothing about 'channel', the one parameter whose schema description is empty — even though its enum values (easy_apply, portal, email, agency_submission) determine the audit trail.
Input schemas describe structure but not intent. Descriptions should explain 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 — 'Record an application actually submitted' — which distinguishes it from hunt_add_posting (creates the posting) and hunt_evaluate_posting (pre-submission). It does not name hunt_correct_application or hunt_set_application_status, so the boundary with those siblings is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage rule ('One per posting') and explains the duplicate guard's purpose so the agent understands when a duplicate rejection is intended rather than an error. It also tells the agent what to do when the date is unknown. It stops short of routing to alternatives such as hunt_check_duplicates beforehand or hunt_correct_application afterwards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_check_duplicatesCheck duplicatesARead-onlyIdempotentInspect
The duplicate guard as a pure read: check a JD before adding it. Records nothing. Warnings are for a person to weigh (JH-3). The same req via several agencies is normal; the double submission is the disqualifier.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| title | Yes | Role title. | |
| req_id | No | ||
| company | No | The hiring company or agency — for a direct posting the guard falls back to it as the end client. | |
| jd_text | No | The JD body — an identical description under a different title is the strongest duplicate signal there is. | |
| end_client | No | Who the work is for. | |
| exclude_posting | No | Posting id to ignore when re-checking. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Records nothing' is partly redundant. What goes beyond structured data is the advisory (non-blocking) nature of warnings and the rule that same req via several agencies is acceptable while double submission is the disqualifier — real behavioral context for acting on results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action; the interpretation rule follows. Dense and mostly jargon-free apart from internal references ('JH-3', 'req'), which cost a little readability but no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 usefully signals that the return is warnings requiring human judgment rather than a boolean block. For a 7-parameter read tool it is largely sufficient, though it omits whether matches are returned with posting ids or scores.
Complex tools with many parameters or behaviors need more documentation. 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 71%, so the schema carries most of the load (url, req_id, exclude_posting are undocumented strings). The description adds domain framing — that the JD body is the input being checked — but gives no guidance on which parameters drive matching or when to use exclude_posting, so it does not compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'check a JD' as a 'duplicate guard as a pure read.' An agent can tell this is a pre-submission duplicate check and not a mutation, which implicitly separates it from hunt_add_posting. It never names a sibling explicitly, 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 a concrete invocation point ('before adding it') plus interpretation guidance that warnings are advisory and that agency-duplicate reqs are normal while double submission is the disqualifier. It does not name an alternative tool or an explicit when-not case, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_complete_next_actionComplete next actionInspect
Close the open next action once handled. With direction and medium it counts as a real touch; without them it is an internal note that triggers no follow-up nudge — the honest difference between "I emailed them" and "I decided it is done". Effects: open next action -> done; a touch logged.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What actually happened. Defaults to "Done: <the action>". | |
| medium | No | ||
| direction | No | Pass with medium if it was a real touch. | |
| posting_id | No | The posting whose open next action is done. |
hunt_contactsContactsDRead-onlyIdempotentInspect
People with relationship, source, and last touch.
| Name | Required | Description | Default |
|---|---|---|---|
| relationship | No |
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 structurally. The description adds nothing beyond that — no note on ordering, scope of the list, or what "last touch" means — so it neither contradicts nor enriches 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?
It is a single short fragment with no padding, but that brevity is under-specification rather than economy — there is no front-loaded statement of action, so the space saved is not earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, schema coverage is 0%, and the description supplies no return-value or filtering context. For a list tool in a dense CRM/hunt namespace, this leaves the agent guessing at both the operation and the enum filter's 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 0% and the single `relationship` enum has an empty description, so the description carries the burden. It mentions "relationship" as a concept but does not explain the filter's semantics or the five enum values (cold, contacted, responsive, warm_scout, dead), and "source" and "last touch" are not even parameters, so it adds only marginal clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase, not a verb+resource statement: "People with relationship, source, and last touch." It signals the resource (contacts) and the attributes they carry, but never says whether it lists, filters, or summarizes them, so an agent cannot tell it apart from siblings like crm_list_contacts, hunt_get_contact, or hunt_due 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?
There is no guidance on when to call this versus hunt_get_contact (single record), hunt_pipeline (stage view), or crm_list_contacts. No prerequisites, no exclusions, no alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_correct_applicationCorrect recordAInspect
Correct applied_at or the submission route (via_contact) when the true facts surface. The reason is part of the record. A correction replaces "unknown" or a wrong value with a sourced fact — never a guess (JH-1). Say where the fact came from; a corrected date re-dates the submission touch to match. Effects: application facts corrected; submission touch re-dated when the date moves.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Where the fact came from — part of the record. | |
| applied_at | No | ISO date, or the literal "unknown" — never a guess (JH-1). | |
| via_contact | No | Who actually submitted it, e.g. HC-0001 — the field the double-submission audit reads. | |
| application_id | Yes | The application, e.g. APP-0008. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes significantly beyond the annotations by explicitly detailing the system effects: 'application facts corrected; submission touch re-dated when the date moves.' It also adds critical behavioral constraints like 'never a guess' and the mandate to 'Say where the fact came from.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the description is dense, it is highly functional. Every sentence contributes unique behavioral context (the 'Effects' and 'never a guess' rule) that cannot be found in the schema or annotations, making the density necessary and justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of updating application data, the description is highly complete. It defines what is being fixed, why it is fixed, and what the side effects are, allowing the agent to determine if this is the correct tool for a data correction task.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since schema coverage is 100%, the description successfully adds semantic value by defining value constraints: the `reason` must contain a source, and `applied_at` can be the specific literal 'unknown.' This prevents misuse of the fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific resources being modified (applied_at date or via_contact submission route) and when this tool is necessary (when facts surface). It distinguishes this targeted correction tool from generic update tools by focusing on correcting 'unknown' or 'wrong' values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear criteria for appropriate usage by requiring the input to be a 'sourced fact' and explicitly stating that correction is needed when current data is 'unknown' or incorrect. This narrows the use case effectively, guiding the agent to use this tool only when facts are certain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_dueDueARead-onlyIdempotentInspect
What needs attention: overdue and upcoming next actions, follow-up nudges, suggest-ghosted, stale leads, missing end clients, upcoming interviews. Everything here is a suggestion (JH-7). The system never sends, submits, or clicks — it records and reports.
| Name | Required | Description | Default |
|---|---|---|---|
| horizon_days | No | Default 7. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description still adds real value by framing every result as advisory ('a suggestion') and asserting the system never sends, submits, or clicks — an agent needs that to know it must not treat these outputs as actions already taken. The 'JH-7' reference is opaque jargon that adds no information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the concrete category list, and the behavioral caveat follows. The unexplained internal ticket reference ('JH-7') is wasted text, but overall there is little 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?
With no output schema, the description carries more burden: it roughly conveys what categories come back, but not the shape of an item (fields, ordering, volume, or whether items are grouped by category). For a reporting/aggregation tool that is an appreciable gap, though the category list gives enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single optional horizon_days parameter, so the schema already does the documenting ('Default 7.'). The description says nothing about the horizon window or what happens when it is omitted or widened, so it adds no meaning beyond the schema — 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?
The description enumerates the concrete categories the tool surfaces (overdue and upcoming next actions, follow-up nudges, ghosted suggestions, stale leads, missing end clients, upcoming interviews), which makes the resource specific and distinguishes it from pure-list siblings like hunt_pipeline. It is weakened by an opening phrase that restates the title ('What needs attention') instead of naming a verb like 'list' or '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?
Usage is only implied — the reader infers this is the 'what should I work on' entry point. There is no explicit guidance about when to prefer this over hunt_pipeline, core_next_actions, or crm_today, all of which are plausible siblings for similar questions, and no exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_evaluate_postingEvaluateAInspect
Record the evaluation — or the skip, with its reason. Skips are pattern memory (JH-8): a skip_reason is required to skip, and skipped postings stay queryable — which agencies waste your time is knowledge. Effects: posting -> evaluated, or skipped with reason.
| Name | Required | Description | Default |
|---|---|---|---|
| fit_notes | No | Gap/strength summary — interpretation is free here (JH-1). | |
| fit_score | No | 1–5; halves are fine. | |
| red_flags | No | ||
| posting_id | Yes | The posting. | |
| skip_reason | No | Set this to skip. The reason is the value. | |
| resume_version | No | Recommended version, by label. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive mutation, and the description adds useful state effects: a posting becomes evaluated or skipped with a reason. It also notes that skips persist and stay queryable, which is meaningful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and skip condition are front-loaded, and the effects line is useful. Some phrasing, such as the JH-8 reference and 'which agencies waste your time is knowledge,' is slightly internal or embellished, but the description remains compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with six parameters, no output schema, and strong schema coverage, the description provides adequate context about what changes and why skip reasons matter. It could further clarify when to record an evaluation versus when to update a posting, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 83%, so the schema already carries most parameter meaning. The description adds semantics for skip_reason and the skip path, but does not explain fit_score, fit_notes, red_flags, or resume_version 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 action and resource: recording an evaluation or a skip for a posting. It clearly distinguishes the two outcomes, though it does not explicitly differentiate this tool from adjacent siblings like hunt_update_posting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the skip path clearly: a skip_reason is required, skipped postings remain queryable, and skips serve as pattern memory. However, it does not explicitly state when to use this instead of hunt_update_posting or other pipeline tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_get_contactContactCRead-onlyIdempotentInspect
One person whole: identity, provenance, relationship, the postings they touch, full touch history.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | e.g. HC-0001. |
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 structurally. The description adds only that the result is a comprehensive aggregate ('full touch history'), and says nothing about behavior when contact_id is not found, or about the size/volume of that history. Beyond annotations, the added behavioral value is 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?
It is a single short sentence, so nothing is padded, but it is written in dense telegraphese with no verb and a trailing list that reads as an afterthought. Brevity here costs clarity rather than earning it — 'relationship' and 'provenance' are undefined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 characterize the return value, and it partially does by naming the sections of the aggregate (identity, provenance, relationship, postings, touch history). It omits any notion of what happens on a missing/invalid id, which matters for a single-key lookup tool. Adequate but with clear 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?
There is a single required parameter with 100% schema description coverage ('e.g. HC-0001'), so the schema already carries the burden. The description mentions nothing about contact_id format, lookup semantics, or alternate identifiers. Baseline 3 applies when the schema is complete and the description adds no extra 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 enumerates what the payload contains (identity, provenance, relationship, postings, touch history), which signals a single-record aggregate read. But there is no verb and no explicit statement that it fetches one contact by id, and it never distinguishes itself from hunt_contacts or crm_get_contact. An agent must infer 'get' from the tool 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?
No when-to-use guidance at all. With hunt_contacts (list), crm_get_contact, and hunt_update_contact in the sibling set, the description gives no rule for choosing this tool or any prerequisite/ordering hint. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_get_postingPostingARead-onlyIdempotentInspect
One posting whole: facts, evaluation, application, interviews, touch history, open next action.
| Name | Required | Description | Default |
|---|---|---|---|
| posting_id | Yes | e.g. JP-0001. |
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 real value by disclosing the breadth of the returned aggregate — six distinct content areas including history and the open next action — which is not derivable from any structured field given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the key fact ('one posting') front-loaded and no filler. It is telegraphic rather than grammatically complete, but every phrase maps to returned 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?
With no output schema, the description's enumeration is the only clue to return contents, and it covers the main sections. It stops short of saying how those sections are shaped (nested objects, arrays), whether missing sections appear as null, or how errors surface for an unknown posting_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage and an example value ('JP-0001'). The description adds nothing about the identifier 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?
The description identifies the resource ('one posting') and enumerates the sub-resources returned (facts, evaluation, application, interviews, touch history, next action), which distinguishes it from single-facet siblings like hunt_contacts or hunt_due. No explicit verb, but the read intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the per-posting detail fetch rather than a list tool such as hunt_pipeline. There is no statement of when to prefer it over a sibling, no exclusion, and no mention of behavior when the posting_id is unknown or not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_get_resumeResume versionARead-onlyIdempotentInspect
One resume version: what it says, every application it went out on, and the postings it is earmarked for.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_id | Yes | e.g. RV-0001. |
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 adds value by disclosing the shape of what comes back – the resume body plus its application and posting cross-references. It stops short of anything about missing/unrecognized ids or list sizes, but for a read-only lookup it discloses the meaningful behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource comes first and the returned components follow immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 return content and it does name the three components (text, applications, earmarked postings), which is enough to decide to call it. Only the edge cases – unknown id, empty cross-reference sets – are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself supplies the format hint ('e.g. RV-0001'), so the description carries no burden and adds nothing about the identifier. Baseline 3 is correct 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 pair ('one resume version') and enumerates the payload it returns: contents, applications it was attached to, and earmarked postings. An agent can distinguish it from hunt_resume_versions (the plural list) from the singular framing, though it never names that sibling 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?
Usage is only implied: the singular 'One resume version' suggests fetching by a known id rather than browsing, which points at hunt_resume_versions as the enumeration path. There is no explicit when-to-use/when-not statement or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_interview_outcomeInterview outcomeAInspect
Close a round. The outcome is a touch in the history (JH-12). Outcomes are facts: passed, failed, rescheduled, or their no-show. Close the round when you know; the notes carry the interpretation. Effects: interview outcome set; touch logged.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| outcome | Yes | ||
| interview_id | Yes | The round, e.g. IV-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The "Effects: interview outcome set; touch logged" line discloses a side effect (a history touch is written) that the annotations do not convey — readOnlyHint=false and destructiveHint=false only say it writes safely. What it omits is whether a closed round can be re-closed or corrected, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then semantics, then effects — a sensible order with little waste. The internal reference "(JH-12)" and the term "touch" are domain jargon that cost the reader a beat without adding operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with no output schema, the essentials (required ids, outcome vocabulary, side effects) are present. Missing are preconditions and reversibility — whether the round must already be scheduled, and whether a wrong outcome can be corrected — which an agent needs before committing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only interview_id is documented), so the description has to compensate, and it largely does: it spells out the outcome vocabulary including "their no-show" for no_show_theirs, and frames notes as the place for interpretation rather than the verdict itself. The notes parameter's expected content is still only loosely defined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Close a round" gives a specific verb and resource, and the following sentence narrows it to recording an interview outcome fact. It never names a sibling (e.g. hunt_add_interview or hunt_set_application_status), so the boundary between scheduling a round and closing one is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Close the round when you know; the notes carry the interpretation" gives a timing cue but no explicit when-not or alternative tool. An agent can infer this is the terminal step of an interview, but there is no routing guidance against hunt_set_application_status or hunt_add_interview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_log_interactionLog touchAInspect
The workhorse: record any touch, optionally with the next action and its due date. Direction matters: follow-up nudges key on real outbound touches. A next_action supersedes the posting's previous open one — history kept, because what you MEANT to do is part of the record (JH-6). Facts in the summary come from real correspondence (JH-1); interpretation is yours. Effects: touch recorded; previous open next action superseded when a new one is given.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ISO timestamp. Defaults to now. | |
| medium | No | ||
| summary | Yes | What happened, in your own terms. | |
| direction | Yes | ||
| contact_id | No | The person, if with one. | |
| posting_id | No | The posting, if about one. | |
| next_action | No | The one thing to do next on this posting. | |
| next_action_due | No | When. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, and the description still adds real value: it states the concrete side effect that a new next_action supersedes the posting's previous open one while keeping history. It does not say whether repeat calls duplicate touches or what happens when next_action is given without a posting_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the effects summary at the end, with little wasted text. The internal rule references (JH-6, JH-1) are opaque tokens that cost a bit of clarity without adding information the agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no output schema, the description covers the main side effect but leaves gaps: how contact_id/posting_id link the record, whether next_action without posting_id is valid, and what the tool returns. Adequate, but not complete enough to call blind.
Complex tools with many parameters or behaviors need more documentation. 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 75%, so the baseline is 3, but the description goes beyond it: it explains why direction matters (nudges key on outbound touches), how next_action relates to prior open actions, and that summary should carry facts from real correspondence while interpretation is free-form. medium, at, and the contact_id/posting_id scoping rules remain undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: "record any touch, optionally with the next action and its due date." An agent knows immediately this is the touch-logging primitive. However, it never distinguishes itself from close siblings like crm_log_activity or crm_add_event, so disambiguation has to come from elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"The workhorse" implies this is the default logging path, and the direction note hints at downstream follow-up behavior, but there is no explicit when-to-use/when-not statement and no reference to the near-duplicate siblings in the toolset. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_pipelinePipelineARead-onlyIdempotentInspect
The board: counts by stage first, then every non-terminal item with stage, last touch, open next action. On a long board, filter by status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter to one stage; "skipped" shows the skip list (pattern memory, JH-8). |
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), and the description adds real context on top: aggregation counts come first, only non-terminal items are returned, and each item carries last touch and open next action. It also hints at scale behavior on long boards, which is useful for deciding whether to filter. It stops short of pagination or ordering details, but with annotations present that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the output shape is front-loaded before the filtering advice. The opening "The board:" is terse to the point of being opaque, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 the return shape, and it does so concisely (counts, then item fields). For a single-optional-parameter read tool with full annotation coverage, nothing essential is missing, though a note on whether count rows are affected by the status filter would help.
Complex tools with many parameters or behaviors need more documentation. 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 description already explains the status filter, including the special "skipped" value. The description only restates "filter by status" plus a heuristic for when to use it, so it adds marginal meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"The board" is jargon and there is no explicit verb, but the sentence does spell out what the payload contains: per-stage counts followed by every non-terminal item with stage, last touch, and open next action. That is specific enough to distinguish it as a read-only pipeline overview rather than a mutation or a single-record getter, though it never names the sibling it differs from (e.g. crm_pipeline, hunt_due).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"On a long board, filter by status" gives one situational cue for the optional parameter, but there is no statement of when to prefer this over hunt_due, hunt_contacts, or crm_pipeline, and no prerequisites. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_resume_versionsResume versionsBRead-onlyIdempotentInspect
The registry, with how many applications each version went out on.
| 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, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered elsewhere. The description's one contribution beyond that is disclosing the aggregation in the result (application count per version), which is useful, but it says nothing about ordering, empty-state behavior, or how versions with zero applications appear.
Agents need to know what a tool does to the 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, and the payoff (per-version application counts) is placed after the resource. The leading fragment "The registry" is economical but ambiguous, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read with no output schema, the description is only barely sufficient: it names the resource and one returned field, but leaves the return shape (version identity, resume linkage, ordering) unexplained. Given the simplicity of the tool this is adequate 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The only semantic question left, what a 'version' is, is not addressed but is also not a parameter concern.
Input schemas describe structure but not intent. Descriptions should explain 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 sentence implies a list operation over resume versions and adds that each entry carries an application count. But "The registry" is a vague noun with no explicit verb, and it never distinguishes this from hunt_get_resume or hunt_add_resume_version, so the agent must infer that this is the read/list 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?
There is no when-to-use guidance at all. With siblings hunt_get_resume, hunt_add_resume_version and hunt_pipeline in the same family, the description never says whether this is the listing view versus a single-version fetch or a write.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_set_application_statusMove applicationAInspect
Move an application along the pipeline. Logs a touch. Ghosted is a status, not a deletion (JH-9): silence is an outcome, and which companies go silent is pattern knowledge. Terminal states stay on the books. Effects: application status moved; touch logged.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What actually happened. | |
| status | Yes | ||
| application_id | Yes | The application, e.g. APP-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent mutation, so the description's job is to add beyond that — and it does: it discloses the side effect that a touch is logged, and that terminal/ghosted states remain on the books rather than being removed. It stops short of saying whether invalid transitions are rejected or whether the note is required for particular statuses.
Agents need to know what a tool does to the 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, followed by a compact side-effect line; every sentence carries information. The parenthetical ticket reference (JH-9) is minor noise but not costly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers side effects and status retention, but omits what the caller gets back and whether status transitions are validated or free-form. Adequate, with clear remaining gaps an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. 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 67%, and the description only enriches the status parameter by clarifying the ghosted value's semantics. The note parameter ('What actually happened') and the remaining enum values, plus any transition rules, get no explanation beyond the schema, so the description adds marginal value over structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: 'Move an application along the pipeline,' which an agent can act on immediately. It does not, however, distinguish itself from plausible siblings such as hunt_correct_application or hunt_log_interaction, leaving the agent to infer which one moves status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'Move an application along the pipeline'; there is no explicit when-to-use versus when to call hunt_correct_application or hunt_log_interaction. The 'ghosted is a status, not a deletion' note is useful domain guidance but governs a status value, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_update_contactUpdate contactAInspect
Patch a contact. The source is never cleared. Relationships move (cold → contacted → responsive → warm_scout, or dead); provenance does not (JH-2). Effects: contact updated.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| role | No | ||
| No | |||
| notes | No | ||
| phone | No | ||
| source | No | Correctable, never removable. | |
| contact_id | Yes | The contact, e.g. HC-0001. | |
| linkedin_url | No | ||
| relationship | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false); the description adds real domain behavior: patches are partial, 'source is never cleared,' and relationship state moves along a defined pipeline while provenance is immutable. That is meaningful context beyond annotations, though it omits what happens if an invalid transition is requested and roughly what the result contains ('Effects: contact updated' is 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?
Front-loaded with the verb and the key constraint, and the pipeline notation is compact. But 'Effects: contact updated' is a tautology that burns a sentence, and the bare reference 'JH-2' is unexplained jargon an agent cannot resolve.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 should at least hint at what comes back and what happens on failure; 'contact updated' is too vague, and illegal-transition behavior is unstated. It does cover the mutation's safety-relevant constraints, which keeps it from being inadequate for a 9-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 low (22%), so the description must carry weight. It does explain the two genuinely tricky fields — the relationship enum's allowed progression (cold → contacted → responsive → warm_scout, or dead) and the source field's correctable-but-not-removable rule — but leaves name, role, email, notes, phone, and linkedin_url completely undescribed, including whether empty values clear a field.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Patch a contact') that is clearly distinct from hunt_add_contact and hunt_get_contact by the update operation. However, it never distinguishes itself from the near-identical sibling crm_update_contact, which an agent has no basis to choose between from this 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 'Patch' framing implies partial-update usage and the mention that relationships can transition while provenance cannot gives some context on legitimate use. But there is no explicit when-to-use, when-not-to-use, or reference to alternatives such as crm_update_contact or hunt_correct_application, so the agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hunt_update_postingUpdate postingAInspect
Patch a posting. Only the fields you pass change. Corrections from real sources only (JH-1). Setting the end client late is common and good — it comes off the due list (JH-5). Effects: posting updated.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Posting URL. | |
| title | No | ||
| req_id | No | Requisition id exactly as printed, e.g. 151469BR. | |
| source | No | How it reached us. | |
| jd_text | No | Full JD text, verbatim. Feeds search and the duplicate guard. | |
| comp_max | No | Annualized. In cents (integer minor units) — 1250 means $12.50. | |
| comp_min | No | Annualized. Hourly: annualize ×2080 and say so in comp_notes (JH-11). In cents (integer minor units) — 1250 means $12.50. | |
| location | No | ||
| red_flags | No | e.g. "no comp, no client, registered-agent address". | |
| work_mode | No | ||
| comp_notes | No | Caveats in prose: "band decorative", "hourly $85 annualized". | |
| end_client | No | The real client behind an agency posting — key for the duplicate guard (JH-5). Ask for it. | |
| posting_id | Yes | The posting, e.g. JP-0001. | |
| employment_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, so safety is covered. The description adds meaningful behavior beyond annotations: partial patching, real-source correction constraints, and the side effect that setting end_client removes the posting from the due 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?
The description is short and front-loads the core semantics of patching a posting. "Effects: posting updated" is somewhat tautological, and the JH-1/JH-5 references are cryptic without context, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 14-parameter partial-update tool with no output schema, the description covers the essential model: patch semantics, correction constraints, and end_client side effects. It still leaves some parameter semantics and validation expectations to the schema, but the annotations and schema carry enough of the remaining burden.
Complex tools with many parameters or behaviors need more documentation. 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 71%, so the schema documents most parameters but leaves title, location, work_mode, and employment_type undescribed. The description adds emphasis on end_client and its due-list effect, but does not compensate for the remaining schema gaps across 14 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Patch a posting," and immediately clarifies partial-update behavior with "Only the fields you pass change." This distinguishes it from hunt_add_posting and hunt_get_posting without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: corrections must come from real sources only (JH-1), and setting the end client late is explicitly described as common and beneficial. It does not explicitly name alternatives or when not to use this tool, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_cost_of_salesCost of salesARead-onlyIdempotentInspect
Each shipment line in a period: what it sold for, what it cost at the moving average, and the margin.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Up to and including this day. ISO date, YYYY-MM-DD. | |
| from | No | From this day. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a read-only, idempotent, closed-world query, so the description's job is to add semantics — and it does, disclosing the costing method (moving average), the granularity (one shipment line), and the computed fields (sale, cost, margin). It omits output shape and pagination/period-default behavior, which keeps it off 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?
A single sentence that front-loads granularity and then lists the three returned measures, with no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return semantics, and it does identify the three per-line values — but an agent still doesn't know whether results are aggregated, what ordering or pagination applies, or how an omitted from/to is interpreted. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both from and to are fully described as ISO dates with inclusive/exclusive boundaries already documented. The description only echoes the notion of a period and adds no defaulting or open-ended-range 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?
The description names the resource precisely (each shipment line in a period) and spells out exactly what the row carries: sale value, moving-average cost, and margin. It reads as a report of per-line COGS rather than an action, and it never distinguishes itself from neighbors like inv_valuation or inv_moves, 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?
"In a period" implies this is a date-range report, which is the only usage cue given. There is no explicit when-to-use, no statement about what happens if from/to are omitted, and no pointer to the alternative valuation or movement tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_count_stockRecord a countAInspect
What was counted on the shelf for one item. The difference from the record becomes a count move, valued at the average cost. Record what the person counted, never what you expect. A count needs a reason, said plainly ("three damaged in the move", "yearly count"). When the count matches the record nothing moves, and that is worth saying too. A difference is valued at the average cost of that moment and posts to Inventory Adjustments: the accountant sees it as shrinkage or a gain, never hidden in cost of sales. Effects: count recorded; the difference moves stock through core.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was counted, or why it differs. | |
| counted | Yes | How many are on the shelf, as counted. | |
| item_id | Yes | The item counted. An existing item id. | |
| counted_at | No | The day it was counted. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by explaining the financial behavior: that differences are valued at the 'average cost of that moment' and post to 'Inventory Adjustments.' This level of accounting disclosure is crucial for an AI agent understanding the true impact of the call.
Agents need to know what a tool does to the 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 verbose, but every sentence provides highly valuable, non-redundant information (e.g., explaining the cost valuation vs. cost of sales). The structure is logical, moving from the basic function to the resulting accounting effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of inventory management and financial adjustments, the description is exceptionally complete. It covers the operational input rules, the functional outcome (count move), and the financial ledger impact (Inventory Adjustments). No critical piece of functional information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema is 100% covered, the description adds critical semantic value by defining the 'reason' field. It specifies that the reason should be 'said plainly' and gives operational examples like ('three damaged in the move'), guiding the agent on the expected linguistic content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records physical counts and, crucially, details the automated consequence of a mismatch—the creation of a count move valued at average cost. This is highly specific and distinct from generic inventory functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 excellent operational guidelines by instructing the user to record the observed reality ('what was counted, never what you expect') and emphasizes the necessity of a clear 'reason' for the count. It guides data quality and expected input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_item_stockItem stockARead-onlyIdempotentInspect
One item's stock moves, newest first, with the quantity, average cost and value after each.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The item. An existing item 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 genuine behavioral content beyond that: rows are ordered newest first and each row carries a running quantity, average cost, and value after the movement. It stops short of disclosing pagination or history depth 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?
One sentence, front-loaded with the scope (one item), then the ordering, then the payload fields. Nothing is redundant 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 names the returned fields and their ordering, which is the key information an agent needs to decide to call it. Minor gaps remain around result size, pagination, and behavior for an item with no movements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single documented item_id parameter, so the schema already carries the parameter burden. The description reinforces that the scope is exactly one item but adds no format, lookup, or error semantics 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?
The description states a specific resource and scope: a single item's stock-move history, with the per-row fields returned. It implicitly distinguishes itself from aggregate tools like inv_stock and inv_valuation by describing moves rather than levels, though it never names those siblings to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase "one item's stock moves" – an agent can infer this is the drill-down for a single item versus a portfolio-wide view. There is no explicit statement of when to prefer inv_moves, inv_stock, or inv_moves-style siblings, and no prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_movesStock movesBRead-onlyIdempotentInspect
Every change to stock, newest first: received, shipped, returned, counted, adjusted, opening.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many. Defaults to 200. | |
| item_id | No | Only this item. An existing item id. |
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 covered. The description adds useful behavioral context by saying it returns all stock changes and orders them newest first, but it does not discuss pagination behavior or return shape beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the resource, ordering, and included movement types without filler. Every part of the sentence contributes to understanding the listing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 full schema coverage and rich annotations, the description provides enough context: it identifies the resource, says it is comprehensive, and specifies newest-first ordering. The remaining gap is minor because the schema covers parameters and annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. 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 two parameters are already documented in the schema. The description does not add any parameter-specific meaning, such as how item_id filtering interacts with the movement history, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns every change to stock as a newest-first list, and it enumerates the movement types included. It is specific about the resource and ordering, but it does not explicitly distinguish this from sibling tools such as inv_stock or inv_item_stock.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a stock-movement history use case through phrases like 'Every change to stock' and 'newest first', but it gives no explicit when-to-use guidance, exclusions, or alternatives. An agent comparing this with inv_stock or inv_item_stock receives no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_set_opening_costSet opening costAInspect
What one unit was worth when it came in without a cost: stock on hand before these books, or a correction received by hand. Everything after it is derived. Only for stock that came in without a cost. Take the figure from a record the person has: the last supplier invoice, a stock sheet, the accountant's figure. Never estimate it yourself, and never use the selling price. It is the one cost anyone states; every other cost is derived from what was paid on purchase orders. Changing it later re-derives everything after it, so say why. Effects: opening cost stated; average cost, value and cost of goods sold re-derived.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Where the figure comes from: "last Bay Gasket invoice, March". | |
| item_id | Yes | The item. An existing item id. | |
| unit_cost | Yes | What one unit was worth. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds real value beyond them: the cascade effect ('average cost, value and cost of goods sold re-derived') and the requirement to justify changes because re-derivation is retroactive. It stops short of saying whether the call fails if an opening cost already exists, but the added context is substantial.
Agents need to know what a tool does to the 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 definition, then scope, then sourcing rules, then effects — a sensible order. It is somewhat wordy ('It is the one cost anyone states') and could be trimmed, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers what the tool does, when it applies, where the input must come from, and what downstream figures change. That is everything an agent needs to call it correctly and explain the consequence.
Complex tools with many parameters or behaviors need more documentation. 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 nonetheless adds semantics the schema lacks — unit_cost must be sourced from a real record, never estimated and never the selling price, and reason must explain the provenance and the motive for a change. These are genuine constraints, not restatements.
Input schemas describe structure but not intent. Descriptions should explain 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 (setting the opening cost of an item) and defines the exact scope: 'stock on hand before these books, or a correction received by hand.' It also draws the boundary against all other cost data by noting 'every other cost is derived from what was paid on purchase orders,' so an agent can distinguish it from valuation/cost-of-sales 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?
Explicit when-to-use ('Only for stock that came in without a cost'), explicit exclusions ('Never estimate it yourself, and never use the selling price'), and a positive sourcing rule (last supplier invoice, stock sheet, accountant's figure). An agent knows both the trigger and the acceptable inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_stockStockBRead-onlyIdempotentInspect
Every stocked item: on hand, average cost and value, and any stock without a cost.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed world, so the safety profile is fully covered. The description contributes one genuinely useful behavioral detail — the report intentionally includes items with no cost — but says nothing about ordering, scope, or volume of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler and the key qualifier about costless stock placed last. The phrasing 'any stock without a cost' is slightly ambiguous between 'items missing a cost' and 'free stock', which is the only minor structural weakness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 input parameters and no output schema, the description is the sole source of return-value information and it only sketches four fields. For a reporting tool with no output schema, it should say more about what a row contains and whether the list is complete or filtered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The schema is empty and fully consistent with the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource (stocked items) and enumerates the specific payload: quantity on hand, average cost, value, and items lacking a cost. What's missing is the verb/operation framing and any differentiation from the near-duplicate sibling inv_item_stock, which an agent cannot resolve from this text 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 call this versus inv_item_stock, inv_valuation, inv_count_stock, or inv_moves — all plausibly adjacent. The agent must infer from the name that this is the full stock-on-hand listing rather than a per-item or valuation view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inv_valuationStock valuationARead-onlyIdempotentInspect
What the stock was worth on a day, per item and in total, beside the Inventory balance the books derive for that day.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | The day. Defaults to today. ISO date, YYYY-MM-DD. |
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. The description adds useful output context—per-item and total valuation plus the books' Inventory balance—but does not disclose caveats, data freshness, or response shape beyond that.
Agents need to know what a tool does to the 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 a single efficient sentence with no redundant clauses. The key scope—valuation by day, per item and total, beside book balance—is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only report with one optional parameter and no output schema, the description adequately explains what the report contains. It could be slightly more complete by explicitly distinguishing the valuation view from stock-quantity views.
Complex tools with many parameters or behaviors need more documentation. 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 single as_of parameter is fully documented by the schema itself, including its default and ISO format. The description's phrase 'on a day' aligns with as_of but adds no syntax or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource and output: stock worth on a given day, per item and in total, alongside the derived Inventory balance. It does not explicitly name or contrast with sibling tools like inv_stock or inv_item_stock, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'on a day' and the default-to-today parameter, suggesting a point-in-time valuation report. However, there is no explicit guidance on when to use this tool versus inv_stock, inv_item_stock, or inv_cost_of_sales.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_addAdd a loanAInspect
Start a loan from the lender's figures: what was owed on a day, the rate, the monthly payment, escrow and the due day. The schedule, payoff date and interest are worked out from these. Take the figures from a lender statement or the loan papers the person hands you, and say which (source). Never fill a rate or a balance in from memory or the market. The loan gets an account in the register under its name ("Chase mortgage ending 7731"). A variable rate is outside this version: record the current rate and say so in the source. Effects: loan recorded from the lender's figures; its account added to the register.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What it is. | |
| name | Yes | As the lender prints it, e.g. "Chase mortgage ending 7731". | |
| escrow | No | Taxes and insurance collected with each payment, if any. In cents (integer minor units) — 1250 means $12.50. | |
| lender | No | Who holds it. | |
| source | Yes | Where the figures come from: "lender statement, October 2026". | |
| balance | Yes | What was owed on balance_date, from the lender. In cents (integer minor units) — 1250 means $12.50. | |
| due_day | Yes | Day of the month the payment is due (1 to 31). | |
| payment | Yes | The scheduled monthly payment of principal and interest. In cents (integer minor units) — 1250 means $12.50. | |
| rate_bp | Yes | Annual rate in basis points: 650 means 6.5%. | |
| currency | Yes | ISO 4217 code. | |
| term_months | No | The original term in months, if known. | |
| balance_date | Yes | The day that balance is for. ISO date, YYYY-MM-DD. | |
| original_principal | No | What was first borrowed, if known. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-readonly, non-idempotent, non-destructive write, so the description's job is to say what is created. It does: a loan plus a register account named after the lender, with schedule, payoff date and interest derived from the input figures. The remaining gap is duplicate handling given idempotentHint=false — nothing says what happens if the same loan is added twice.
Agents need to know what a tool does to the 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 intent and the required-source rule early, and each sentence carries a rule. The final "Effects" line partly restates the earlier "The loan gets an account in the register under its name" sentence, which is the one piece of duplicated 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 13-parameter mutation with no output schema, the description covers creation, sourcing rules, side effects and scope exclusions, which is close to enough. What it leaves unstated is duplicate/error behavior and confirmation of what the caller gets back, minor against annotation coverage of the safety profile.
Complex tools with many parameters or behaviors need more documentation. 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 still adds real value: it explains why rate_bp and balance must be lender-sourced, why source is mandatory, how name should be formatted, and that a variable rate must be recorded as the current rate with a note. That is behavioral semantics the schema's terse field descriptions do not carry.
Input schemas describe structure but not intent. Descriptions should explain 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 and resource ("Start a loan") and enumerates the figures the record is built from, so an agent knows exactly what this tool creates. It does not name any sibling (loan_get, loan_loans, loan_interest, loan_link_payment) to sharpen the boundary between creating a loan and reading or servicing one, 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?
It states where the figures must come from ("a lender statement or the loan papers the person hands you") and forbids inventing a rate or balance, which is concrete usage guidance. It also carves out a when-not case: variable rate loans are outside this version. It stops short of naming an alternative tool for the excluded case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_candidatesPayment suggestionsBRead-onlyIdempotentInspect
Statement rows that look like a loan payment: its amount near a due date, or the lender named. Suggestions only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the useful behavioral detail that results are 'Suggestions only', clarifying they are not authoritative links, but it does not describe return format, scope of the statement scan, or pagination.
Agents need to know what a tool does to the 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 that front-loads the key output and matching criteria. The phrase 'its amount near a due date' is slightly ambiguous in antecedent, but overall the structure is tight and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with annotations covering safety, the description adequately explains what the tool returns at a high level. However, it omits routing guidance to loan_link_payment and does not describe the shape or scope of the suggestions, leaving an agent unsure how to use the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter syntax or meaning to explain. The baseline for no parameters is 4, and nothing in the description creates confusion about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific output: statement rows that look like loan payments, with two matching criteria (amount near a due date or lender named). It is clear what the tool returns, though it does not explicitly distinguish itself from sibling tools such as loan_link_payment or loan_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The phrase 'Suggestions only' hints that results are advisory, but it does not tell an agent whether to call this before loan_link_payment, how to act on the suggestions, or what prerequisites exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_getLoanBRead-onlyIdempotentInspect
One loan whole: the payments with their splits, the twelve months ahead, the payoff, and the lender's figure against ours.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ISO date, YYYY-MM-DD. | |
| loan_id | Yes | e.g. LN-0001. |
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 real value by naming the returned sections (payments/splits, 12-month outlook, payoff, lender comparison), but says nothing about the effect of as_of or error behavior. A 3 fits: useful content disclosure with gaps.
Agents need to know what a tool does to the 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 compact sentence with no padding, front-loading the resource ('One loan whole'). The poetic phrasing ('the lender's figure against ours') slightly reduces immediate clarity but costs little 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, the description must carry the return-value burden, and it partially does by listing the returned sections. It leaves open what as_of defaults to and how the lender comparison is expressed, and gives no routing guidance versus loan_loans.
Complex tools with many parameters or behaviors need more documentation. 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 loan_id and as_of already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the specific content of a single-loan detail view: payments with splits, a twelve-month forward view, payoff, and lender-vs-ours comparison. That distinguishes it from loan_loans (a list) without naming the sibling. The phrasing is idiosyncratic ('One loan whole') but the resource and scope are still clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use statement, no mention of when to prefer loan_loans or loan_candidates, and no prerequisites. The agent must infer that this fetches detail for one already-known loan_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_interestInterest paidARead-onlyIdempotentInspect
Interest, principal and escrow paid per loan in a year, from the payments' splits, saying which were split by the schedule rather than the lender.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | e.g. 2026. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful provenance ('from the payments' splits') and an output distinction ('saying which were split by the schedule rather than the lender'), though it does not explain default behavior when year is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence with no filler, but it is a sentence fragment lacking a clear main verb. The final clause is somewhat awkward, though it is concise overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 report with one optional parameter and no output schema, the description gives the key output categories and data source. However, it omits what happens when 'year' is omitted and does not describe the return structure, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the single optional 'year' parameter with an example. The description reinforces the yearly scope but adds no format or default-behavior details beyond what the schema provides, 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 clearly identifies the resource and scope: interest, principal, and escrow paid per loan in a year, derived from payment splits. It does not explicitly distinguish itself from siblings like loan_get or loan_loans, but the reporting nature is evident from the content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase 'per loan in a year' and the reporting focus, but there is no explicit guidance on when to choose this tool over siblings. 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.
loan_link_paymentLink a paymentAInspect
Tie the statement row that paid the loan to it, split into principal, interest and escrow: as the lender printed it, or by the schedule when no split is given. Read loan_candidates for rows that look like the payment. When the lender's statement prints the split (principal, interest, escrow), pass it: it is the record, and it must add up to the row. With no split given, the schedule works it out from the balance and the rate, and the result says so. Anything above the scheduled payment and escrow goes to principal. Effects: payment split and recorded; the row posts once, through the loan.
| Name | Required | Description | Default |
|---|---|---|---|
| escrow | No | As the lender printed it, if it did. In cents (integer minor units) — 1250 means $12.50. | |
| reason | Yes | Why this row is this payment. | |
| loan_id | Yes | The loan, e.g. LN-0001. An existing loan_loan id. | |
| interest | No | As the lender printed it, if it did. In cents (integer minor units) — 1250 means $12.50. | |
| principal | No | As the lender printed it, if it did. In cents (integer minor units) — 1250 means $12.50. | |
| transaction_id | Yes | The statement row that paid it. An existing purch_transaction id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses the effects: the split is recorded, the row posts once through the loan, and surplus above the scheduled payment plus escrow is allocated to principal. It does not say what happens on a repeated link or on a failing split, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outcome, then the split rules, then effects. Slightly dense and the second paragraph packs several rules into long sentences, but nothing is redundant with 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?
There is no output schema, and the description covers the resulting state (payment split and recorded, row posts once) and notes that the result indicates when the schedule computed the split. For a non-idempotent financial mutation it could still spell out re-link/duplicate behavior and failure modes when the split doesn't add up.
Complex tools with many parameters or behaviors need more documentation. 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 explains each field's type and units. The description still adds real semantics: the split fields must sum to the row amount, they are optional and only used when the lender printed them, and unmapped excess flows to principal.
Input schemas describe structure but not intent. Descriptions should explain 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: ties a statement row to a loan and records the split into principal, interest and escrow. It is clearly distinguishable from siblings loan_candidates (discovery) and loan_unlink_payment (reverse operation) by naming the row-linking action and its outcome.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to loan_candidates to find candidate rows, and gives a clear rule for the two modes: pass the lender's printed split when available, otherwise let the schedule derive it. It stops short of naming loan_unlink_payment as the reverse or stating when not to use this tool, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_loansLoansARead-onlyIdempotentInspect
Each loan: what is owed and as of when, the rate, the next payment, the payoff date, interest this year, and whether it ties to the lender's figure.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a read-only, idempotent, non-destructive operation. The description adds valuable return-content context, including balances, next payment, payoff date, interest, and lender reconciliation status, though it does not describe collection scope or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that lists the relevant per-loan fields with little wasted text. It is front-loaded with 'Each loan' but remains a fragment rather than an action-oriented statement, so it is not maximally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields that an agent would need to judge relevance. For a low-complexity read-only list tool, this is largely complete, though it omits whether all loans are returned, ordering, and default as_of 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 coverage is 100% and the single as_of parameter is documented as an ISO date, so the schema carries the parameter semantics. The description's phrase 'as of when' hints at the as-of concept but does not add format, default, or behavior details 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 identifies the resource as loans and enumerates the per-loan fields returned, making the tool's content clear. However, it lacks an explicit verb such as 'list' or 'return' and does not distinguish itself from siblings like loan_get or loan_interest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 plural phrasing 'Each loan' implies an overview/list use case, but the description gives no explicit when-to-use guidance or alternatives. An agent must infer from the name and siblings that loan_get is for a single loan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loan_unlink_paymentUnlink a paymentAInspect
Undo a payment link, with a reason. The row goes back to how it was reviewed; the balance moves back. For a link that was wrong, or to relink it with the lender's split once the statement arrives. Say so to the person. Effects: payment unlinked; the row back to its earlier review.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why. | |
| loan_id | Yes | The loan. An existing loan_loan id. | |
| payment_id | Yes | e.g. LP-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false and idempotentHint=false, and the description goes beyond that by spelling out the state effects (payment unlinked, row back to its earlier review, balance moves back) and implying re-linking is possible afterwards. It also adds a communication obligation ("Say so to the person"), which is behavior an agent cannot infer from the schema. It does not say whether the unlinked payment becomes unapplied cash or what is 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?
Purpose is front-loaded in the first clause and the whole thing is under ~50 words. The fragment "Say so to the person" and the "Effects:" recap are slightly clipped in style, but every line carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema and coverage-rich annotations, the description covers purpose, trigger conditions, and state effects. The remaining gap is what happens to the unlinked payment downstream (unapplied cash / reconciliation) and what the call returns.
Complex tools with many parameters or behaviors need more documentation. 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 loan_id and payment_id are already documented. The description adds only that the unlink is done "with a reason", signalling that reason is mandatory and substantive, but gives no guidance on what a good reason contains beyond the schema's terse "Why."
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Undo a payment link" gives a specific verb + resource and immediately states the effect (row returns to its earlier review, balance moves back). It is unambiguous against the sibling set, though it never names its counterpart loan_link_payment 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?
"For a link that was wrong, or to relink it with the lender's split once the statement arrives" gives two concrete situations that select this tool. It stops short of naming when-not-to-use or pointing at a specific alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_accept_quoteCustomer acceptedAInspect
Record customer acceptance and raise the sales order from the quoted lines. Prices copy across at acceptance and are then frozen on the order. If the list price moves tomorrow, this order keeps what was quoted — that is the whole reason the quote existed. The order arrives in draft: acceptance is the customer's act, confirmation is ours. Effects: quote.status -> accepted; draft order created with the quoted prices.
| Name | Required | Description | Default |
|---|---|---|---|
| po_ref | No | The customer's own PO number, if they gave one. | |
| quote_id | Yes | The accepted quote. An existing quote id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: prices copy at acceptance and freeze on the order, status transitions to accepted, and a draft order is created. This is exactly the kind of consequence detail annotations can't convey. The gap is idempotency — annotations declare idempotentHint=false but the description never says what a repeat call does (duplicate order? error?), which matters for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the pricing consequence, then the state semantics, then an explicit effects line. The rhetorical aside ('that is the whole reason the quote existed') earns its place by motivating the price-freeze rule. No wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers side effects well but not the return payload — an agent doesn't know whether the new draft order id comes back in the response, which it would need to chain into o2c_confirm_order. Otherwise complete for a two-parameter mutation.
Complex tools with many parameters or behaviors need more documentation. 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 adds no field-level meaning — notably po_ref is never mentioned, and there is no hint about what quote_id must reference beyond 'the quoted lines'. 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 pair and resource: 'Record customer acceptance and raise the sales order from the quoted lines.' It also implicitly separates itself from the sibling o2c_confirm_order by declaring 'acceptance is the customer's act, confirmation is ours.' An agent can route cleanly 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?
Clearly frames the context of use: customer has said yes to a quote, and the resulting order is a draft awaiting our confirmation. It does not explicitly name o2c_confirm_order as the follow-up tool or state prerequisites (e.g. quote must have been sent), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_amend_orderAmend orderAInspect
Replace the lines of a DRAFT order. Amendment exists only while the order is draft. After confirmation "what was confirmed" is a fixed fact the credit gate evaluated: the only permitted shrink is o2c_close_short, and growth is a new order. The passed lines replace all existing lines. Effects: order lines replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The new full set of lines. | |
| order_id | Yes | The draft order. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the draft-only lifecycle gate, the credit-gate rationale for why confirmed lines are immutable, and the replace-all effect on existing lines. It does not cover permissions or whether the credit gate re-evaluates amended lines, which keeps it off 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 the core action and constraint, and the lifecycle/alternative guidance earns its space. The closing "Effects: order lines replaced." restates the first sentence, and the mid-sentence line break hurts readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, fully-described schema with annotations present and no output schema, the definition covers everything an agent needs to decide and call correctly. Only the post-amend re-evaluation behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says "The new full set of lines," so parameter semantics are largely carried by structured fields. The description reinforces the replace-not-merge semantics, which is useful but only marginally additive 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?
States a specific verb and resource plus a hard precondition: "Replace the lines of a DRAFT order." It is immediately distinguishable from o2c_create_order (growth) and o2c_close_short (post-confirmation shrink), both of which are named in the body.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (draft only) and when-not (after confirmation) rules, and routes the agent to the correct alternative for each non-draft case: o2c_close_short for shrink, a new order for growth. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_apply_creditApply credit to invoiceAInspect
Apply some or all of a credit note to an invoice. Same bounds as cash: never more than the credit note has left, never more than the invoice still owes, never across customers. A credit note the customer wants paid out instead is a refund, not an application. Effects: application recorded; invoice.status -> paid when fully settled; credit_note.status -> settled when exhausted.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | How much to apply. Omit to apply the smaller of what is left on each side. In cents (integer minor units) — 1250 means $12.50. | |
| invoice_id | Yes | The invoice it settles. An existing invoice id. | |
| credit_note_id | Yes | The credit note. An existing credit_note id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond simple 'apply' behavior by specifying critical state transitions: the invoice status moves to 'paid' when settled, and the credit note status moves to 'settled' when exhausted.
Agents need to know what a tool does to the 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 highly dense and structured, efficiently covering the core definition, constraints, alternatives, and resulting effects in a brief manner without any unnecessary 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 state-changing financial tool, the description is complete. It outlines how the tool affects multiple related records (invoice status and credit note status), providing a complete picture of the call's impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema defines the type, the description adds vital logic: that omitting the 'amount' defaults to the lesser of the remaining credit or remaining debt. This functional logic significantly elevates the input definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly and concisely states the core function: applying credit notes to invoices. It establishes the operational scope (O2C financial application) and is clearly distinguished from actions like full payment recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides comprehensive boundaries, explicitly defining constraints (cannot exceed credit or debt bounds) and correctly identifying the alternative (a refund) for when the customer wants cash out instead of application.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_apply_paymentApply to invoiceAInspect
Apply some or all of a payment to an invoice. Bounded on both sides: never more than the payment has left, never more than the invoice still owes. Both refusals name the actual numbers, so the right next step is obvious.
Overpayment is real and stays as unapplied cash against the customer. Do not spread it across invoices the customer did not name. Effects: application recorded; invoice.status -> paid when fully settled.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | How much to apply. Omit to apply the smaller of what is left on each side. In cents (integer minor units) — 1250 means $12.50. | |
| invoice_id | Yes | The invoice it settles. An existing invoice id. | |
| payment_id | Yes | The payment. An existing payment id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation and non-idempotent profile, so the description's added value is the state effects: overpayment persists as unapplied cash and invoice.status flips to paid when fully settled. It also discloses the failure mode (refusals naming actual numbers on both the payment and invoice bound), which is behavior an agent cannot read from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then bounds, then overpayment policy, then effects — a sensible order with no filler sentences. The aside 'so the right next step is obvious' is mild editorializing that could be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers the action, the validation envelope, the overpayment residue, and the resulting state change, which is close to everything an agent needs. It stops short of stating permissions, idempotency/retry behavior (relevant since idempotentHint is false), or what an application result contains.
Complex tools with many parameters or behaviors need more documentation. 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 amount/invoice_id/payment_id semantics, including the cents convention and the omit-to-take-the-smaller default, are already documented in structured fields. The description's only addition is the two-sided bound on amount, which is useful but largely behavioral rather than parameter-level, 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 opens with a specific verb and resource: apply a payment (some or all) to an invoice. It is immediately distinguishable from a generic payment tool, though it never names its closest siblings (o2c_record_payment, o2c_apply_credit, o2c_unapplied_cash), so the 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?
It gives one real usage constraint — do not spread overpayment across invoices the customer did not name — which is a usable when-not rule. But it never says when to reach for this versus recording a payment or applying a credit note, and prerequisites (payment must exist, be unapplied) are only implied by the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_ar_agingAR agingARead-onlyIdempotentInspect
Open receivables bucketed by days past due, with the invoice-level detail behind each bucket. The report to open when asked how the business is doing on cash. Buckets are current / 1-30 / 31-60 / 61-90 / 90+ against the invoice due date.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | As-of date. Defaults to today. ISO date, YYYY-MM-DD. |
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 safety is covered. The description earns credit beyond that by disclosing the output shape (buckets plus underlying invoice detail) and the exact bucket boundaries (current / 1-30 / 31-60 / 61-90 / 90+) and the aging basis (invoice due date) — behaviour an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the report contains, then the routing intent, then the bucket definitions. No filler and nothing 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?
With no output schema, the description must carry return-value information and it does: buckets plus invoice-level detail, with bucket edges spelled out. The one meaningful gap is whether the report is broken down per customer or is a single company-wide aggregate — relevant given the adjacent o2c_customer_statement and solo_outstanding tools.
Complex tools with many parameters or behaviors need more documentation. 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% for the single `as_of` parameter, including its default of today and ISO YYYY-MM-DD format, so the schema does the heavy lifting. The description only indirectly implies the aging basis ('against the invoice due date') without ever mentioning the as-of date parameter, so it adds no parameter meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific artifact (open receivables bucketed by days past due) and its internal structure (invoice-level detail behind each bucket), which is far more than a restatement of the title. It does not explicitly differentiate itself from near-neighbours like o2c_customer_statement, solo_outstanding, or o2c_unapplied_cash, so an agent must infer the boundary from the bucket definition 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 report to open when asked how the business is doing on cash' gives a concrete triggering intent, which is exactly the routing signal an agent needs. It stops short of naming an alternative or an exclusion (e.g. per-customer statements), so it is clear context without full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_backordersBackordersARead-onlyIdempotentInspect
Every open confirmed quantity, by order, item and customer — what we owe whom. The honest ends of a backorder are fulfilment or close-short; this view is where you find the ones waiting for either.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful conceptual framing about what a backorder represents, but does not disclose return grouping, pagination, scoping, or other behavioral traits beyond the schema and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the core scope front-loaded. The second sentence is slightly stylized, but it earns its place by explaining why the view exists rather than padding the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool without an output schema, the description gives enough scope to know what the result represents: open confirmed quantities by order, item, and customer. It could be stronger with explicit sibling routing or expected result shape, but it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics burden. Baseline 4 applies, and the description correctly does not invent parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain 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 resource and scope: every open confirmed quantity broken down by order, item, and customer. It is clearly a read-only backorder listing, but it does not explicitly distinguish itself from siblings such as o2c_get_order or o2c_close_short beyond the conceptual reference to fulfilment and close-short.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when the view is useful — finding backorders waiting for fulfilment or close-short — but gives no explicit when-not guidance and does not name alternative tools. The usage context is present but requires the agent to infer the boundary against related order and close-short tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_cancel_orderCancel orderADestructiveInspect
Cancel an order that has not shipped. Once anything has shipped the order cannot be cancelled — bill it and issue a credit instead. Cancellation is not a way to make a mistake disappear; the order stays visible as cancelled. Effects: order.status -> cancelled; committed value released.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was cancelled. Kept as pattern memory. | |
| order_id | Yes | The order. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, so the safety profile is known. The description adds meaningful behavior beyond that: the status becomes cancelled, committed value is released, and the cancellation remains visible rather than erasing the order. It does not cover permissions, reversal behavior, or response details, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The eligibility condition is front-loaded, followed by the alternative path and the state effects. Every sentence contributes operational guidance without repeating schema or annotation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive mutation with full schema coverage and no output schema, the description covers the key decision criteria and state effects. It gives the agent enough to decide correctly between cancelling, billing, and crediting.
Complex tools with many parameters or behaviors need more documentation. 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 order_id and reason are already documented in the schema. The description adds no additional parameter-level meaning, 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 gives a specific verb and resource ("Cancel an order") and immediately qualifies the eligible state ("that has not shipped"). It distinguishes this action from the shipped-order path by naming the alternative: bill it and issue a credit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 the tool applies and when it does not: once anything has shipped, the order cannot be cancelled. It also names the correct alternative in that case, so the agent does not have to infer routing from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_close_shortClose shortAInspect
Cancel the open remainder of a partially fulfilled order. This is how backorders die honestly: the customer is no longer owed the difference, committed credit exposure is released, and the reason is kept. Pass line ids to close only some lines; omit to close every open remainder. The fulfilled part stays exactly as it is. Effects: open quantities reduced to shipped; committed exposure released; order may derive closed.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Only these lines. Omit to close all open remainders. | |
| reason | Yes | Why the remainder is being abandoned. | |
| order_id | Yes | The order. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring this is a non-read-only, non-idempotent mutation, the description adds meaningful behavioral detail: open quantities are reduced to shipped, committed exposure is released, the reason is retained, and the order may derive closed. It does not fully discuss reversibility or authorization requirements, but it discloses the core state changes beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then gives scoping and effects. The phrase 'backorders die honestly' is colorful but adds limited operational information; otherwise, the sentences are purposeful and well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers the essential action, scoping behavior, and business effects. It could be slightly more complete about return behavior or failure conditions, but it is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all three parameters. The description adds only a restatement of the lines behavior and a note that the reason is kept, which is useful but does not significantly extend the parameter semantics beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and scope: cancel the open remainder of a partially fulfilled order. It clearly distinguishes this from canceling a whole order by emphasizing that the fulfilled part stays intact, so an agent can identify when this tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance for the partial-vs-full case: pass line ids to close only some lines, omit them to close every open remainder. It also clarifies the operational context that this is for unfulfilled remainders, though it does not name a specific alternative sibling tool such as full-order cancellation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_confirm_orderConfirm orderAInspect
Accept the order into the books. Runs the credit check. This is the credit gate, and it is the only one. Exposure counts open AR plus the uninvoiced value of everything already confirmed — a limit that only looks at issued invoices lets a slow biller be robbed politely.
If the check fails, that is the answer. Do not confirm around it by splitting the order, raising the limit, or invoicing early. Report the shortfall and let a human decide; a refusal recorded in the log is worth more than an order. Effects: order.status -> confirmed; value counts against the credit limit.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | The order to confirm. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false, idempotentHint=false), so the bar is lower, and the description adds real value beyond them: the state effect (order.status -> confirmed), that value then counts against the credit limit, and the precise exposure formula (open AR plus uninvoiced confirmed value). It does not say whether a retry is safe or how to undo a confirmation, which is the remaining gap for a non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the gate are front-loaded in the first two sentences, and the effects line is a compact, scannable trailer. The middle passage drifts toward policy commentary ('a refusal recorded in the log is worth more than an order'), which is behaviorally useful but slightly editorial for a tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the definition covers what the agent cannot get elsewhere: the credit-check semantics, the failure protocol, and the resulting state change. Nothing needed to call it correctly is missing, and the absence of a return schema means no further output documentation is owed.
Complex tools with many parameters or behaviors need more documentation. 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 a single required order_id, and the schema already says 'The order to confirm. An existing order id.' The description adds no further constraint on the parameter (e.g., which order states are eligible), 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?
"Accept the order into the books. Runs the credit check." gives a specific verb (confirm/accept) and resource (order) plus the distinguishing mechanic (credit gate). It does not name the adjacent steps (o2c_accept_quote, o2c_ship_order, o2c_amend_order) explicitly, so sibling routing relies on the agent inferring the O2C flow, but the 'only credit gate' framing still singles it out clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong negative guidance: on failure, do not split the order, raise the limit, or invoice early — report the shortfall. That is an explicit when-not-to-work-around rule with named alternative workarounds being ruled out. It stops short of stating when to choose this over the surrounding O2C steps (e.g., that the order must already exist and be accepted), so it is clear context without full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_create_credit_noteCredit noteAInspect
Raise a credit note: the universal downward correction. Pricing errors, short-pay resolution, goodwill — anything past draft is corrected downward this way and only this way (INV-11). A credit note has its own open balance: apply it to invoices like a payment, or refund it. Standalone credits (no invoice reference) are allowed but the reason is mandatory and it will be read back. Effects: credit note raised as unapplied credit.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What kind of correction this is. Returns and write-offs have their own commands. | |
| amount | Yes | Credit amount, tax-inclusive. In cents (integer minor units) — 1250 means $12.50. | |
| reason | Yes | Why. Mandatory — this is money. | |
| invoice_id | No | The invoice being corrected, when there is one. An existing invoice id. | |
| customer_id | Yes | Whose balance this relieves. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: the note becomes an unapplied credit with its own open balance that can be applied like a payment or refunded, and that the reason is mandatory and read back. Annotations already cover the safety profile (not readOnly, not idempotent, closed world), so this is useful added detail rather than load-bearing.
Agents need to know what a tool does to the 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 an 'Effects:' trailer that states the outcome. Mostly efficient, though the INV-11 jargon and 'universal downward correction' phrasing add minor noise without much payoff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 stating the resulting state ('raised as unapplied credit') and downstream options (apply or refund). Sufficient for an agent to call it correctly, though it could tie explicitly to the apply/refund sibling tools.
Complex tools with many parameters or behaviors need more documentation. 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 carries the parameter burden, but the description adds meaning: it explains invoice_id is optional ('standalone credits... allowed') and that reason is mandatory. This gives semantic framing beyond the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Raise a credit note') with a strong scoping claim ('the universal downward correction... only this way'). It differentiates the concept from returns/write-offs indirectly, but never names the actual sibling commands (o2c_write_off, o2c_record_return) that compete for the same intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use cases (pricing errors, short-pay resolution, goodwill) and clarifies that standalone credits without an invoice are allowed. It stops short of explicit when-not-to-use guidance against sibling tools like o2c_write_off or o2c_record_return, leaving that to the schema's 'kind' description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_create_orderNew orderAInspect
Raise a sales order directly, without a quote. Use this for repeat business and phone orders. Anything the customer negotiated should go through a quote instead, so the agreed price has a document behind it. Effects: order created in draft.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The ordered lines. | |
| po_ref | No | The customer's own PO number. | |
| customer_id | Yes | Who is buying. An existing customer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/non-destructive profile is known. The description adds genuinely new information with "Effects: order created in draft", telling the agent the order is not confirmed or fulfilled and that downstream steps are needed. It stops short of noting validation failures (e.g. unknown customer/item) or whether a price override needs approval.
Agents need to know what a tool does to the 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: what it does, when to use it, when not to, then the resulting state. Zero filler and the distinguishing clause is front-loaded in sentence one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with full annotation coverage and full schema coverage, the description supplies the one thing structured fields cannot: the draft outcome and the quote-vs-order decision rule. Nothing essential is missing, though a note on failure modes or the next step (confirm order) would have made it 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% — customer_id, lines, item_id, qty, unit_price and po_ref are all documented in-schema, including the cents/minor-units convention. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Raise a sales order") plus the key differentiator "directly, without a quote", which cleanly separates it from o2c_create_quote in the sibling list. An agent can pick the right tool 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?
"Use this for repeat business and phone orders" gives positive selection criteria, and "Anything the customer negotiated should go through a quote instead" gives the explicit exclusion plus the named alternative. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_create_quoteNew quoteInspect
Draft a quote for a customer. A quote commits nothing: no stock is reserved, no credit is consumed. Omit unit_price to take the list price — that is the honest default. A discount is an explicit unit_price and shows up as a discount in the log, which is the point. Effects: quote created in draft.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The quoted lines. | |
| customer_id | Yes | Who we are quoting. An existing customer id. | |
| valid_until | No | Expiry. ISO date, YYYY-MM-DD. |
o2c_customer_statementCustomer statementARead-onlyIdempotentInspect
One customer, period-bounded: opening balance, invoices, credits, payments, refunds, closing balance. Balance-forward style — the document a controller sends monthly. Rendering and sending are out of scope; the content is not.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Period end. ISO date, YYYY-MM-DD. | |
| from | Yes | Period start. ISO date, YYYY-MM-DD. | |
| customer_id | Yes | The customer. An existing customer id. |
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 bar is lower, and the description still adds real value: it discloses that rendering and delivery are out of scope while the underlying content is in scope, preventing an agent from expecting a send action. It also flags the balance-forward structure, which tells the agent the output reconciles opening-to-closing rather than being a flat transaction dump.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with scope (one customer, period-bounded) followed by the exact output contents, then the structural framing and the scope exclusion. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates well by enumerating the return sections in order, which is more than most tool definitions at this tier offer. Gaps are minor: no mention of behavior for customers with no activity in the period, and no indication of size or pagination for a statement covering a long window.
Complex tools with many parameters or behaviors need more documentation. 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 (customer_id, from, to) are already documented with types and ISO date format. The description reinforces the key semantic — the period is bounded and scoped to exactly one customer — and the balance-forward framing implies the opening balance is derived as of `from` rather than passed in, but no additional parameter guidance is given beyond that. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (customer statement) and enumerates exactly what it contains: opening balance, invoices, credits, payments, refunds, closing balance, scoped to one customer and a bounded period. An agent can tell this is a report, not a mutation. It does not, however, explicitly distinguish itself from near-siblings such as o2c_ar_aging or solo_statement, which an agent could plausibly reach for instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Balance-forward style — the document a controller sends monthly" implies the consumption scenario (a periodic customer-facing statement) and the exclusion clause tells the agent it will not send anything. But there is no explicit when-to-use versus o2c_ar_aging (aging summary) or solo_statement, and no stated prerequisite such as the customer having posted activity in the period.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_get_customerCustomerBRead-onlyIdempotentInspect
Customer with live credit position: limit, open AR, committed value, available.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | The customer. An existing customer id. |
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 operation. The description adds useful context by indicating that the credit position is live and by naming key returned credit fields, but it does not describe permissions, errors, or other behavioral constraints.
Agents need to know what a tool does to the 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 fragment with no wasted words. The colon-separated list of credit fields is compact and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, one-parameter read tool with full schema coverage and clear annotations, the description provides enough return-value context by naming the key credit fields. It is not fully complete because it does not clarify whether the response includes the full customer record or only credit-position data, but no output schema exists to fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, and the single parameter customer_id is fully documented in the schema. The description does not add any parameter semantics beyond what the schema already 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 clearly identifies the resource as a customer and specifies that it includes live credit position data: limit, open AR, committed value, and available. It is specific enough to understand what the tool returns, but it does not distinguish itself from close siblings such as core_get_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance on when to use this tool versus alternatives like core_get_customer or crm_get_account. The description implies it is for retrieving customer credit position, but it provides no when-to-use or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_get_invoiceInvoiceCRead-onlyIdempotentInspect
Invoice with lines and what is still open on it.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The invoice. An existing invoice id. |
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 safety and repeatability are fully covered. The description's only addition is that the payload includes line items and the remaining open amount, which is useful but thin. It says nothing about what 'open' means (unpaid vs. unapplied credit), so behavioral context beyond annotations is minimal.
Agents need to know what a tool does to the 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 the key noun front-loaded and no filler. Its brevity costs it though — the same word budget could have carried the retrieve verb and the return 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?
No output schema exists, so the description carries the burden of describing returns, and it only sketches them ('lines and what is still open'). For a simple single-id read tool this is roughly adequate, but an agent cannot tell whether open balances are per-line or header-level, or whether related payments and credits are included.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter at 100% schema description coverage, so the schema fully documents invoice_id. The description adds nothing about where to obtain a valid invoice id or what happens with an unknown id, which is the normal baseline-3 case when the schema already 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?
The description names the resource (invoice) and hints at the return content (lines and open balance), and the tool name supplies the retrieve verb. However 'Invoice with lines and what is still open on it' is closer to a label than a stated action, so an agent must infer that this fetches a single invoice by id rather than listing invoices. It does not distinguish itself from siblings such as o2c_get_order, o2c_customer_statement, or solo_get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when-to-use guidance, no prerequisites, and no mention of alternatives. The agent is left to infer from the name alone whether to call this versus o2c_get_customer, o2c_ar_aging, or o2c_get_order to answer an invoice question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_get_orderOrderCRead-onlyIdempotentInspect
Full order: lines, open and uninvoiced quantities, deliveries, invoices, and what can be done to it now.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | The order. An existing order id. |
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 one genuinely new behavioral fact — that the response includes 'what can be done to it now', i.e. computed available next actions — which is not derivable from the schema. It does not say what happens for a missing or cancelled order.
Agents need to know what a tool does to the 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 compact sentence-fragment with no filler, and the key attribute ('Full') is front-loaded. It is terse to the point of being ungrammatical, which slightly hurts readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return value, and it does list the main sections. It omits error behavior for unknown order ids and does not clarify whether the payload is large or how the 'available actions' are represented, leaving the agent with an incomplete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (order_id) and schema description coverage is 100%, so the schema already documents it adequately. The description adds no format, source, or resolution guidance for the id, 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 enumerates the contents of the response (lines, open/uninvoiced quantities, deliveries, invoices, available actions), which tells an agent this is the full-detail order read. However, it is a noun phrase with no verb, so the operation itself ('retrieve') is only inferred. It also does not explicitly contrast with siblings like o2c_get_invoice or o2c_amend_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to use this tool versus the many order-related siblings (o2c_amend_order, o2c_confirm_order, o2c_ship_order, o2c_get_invoice). An agent must infer from the word 'Full' that this is the read-everything view, but no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_invoice_shippedInvoice shippedAInspect
Issue an invoice for everything shipped on this order and not yet billed. We bill what shipped, never what was ordered. That single rule is what keeps AR reconcilable: every invoice line traces to a delivery line, and an order that shipped in three parts produces three invoices, not one guess.
The due date comes from the customer's terms. Do not pass a due date; if the terms are wrong, fix the terms. Effects: invoice created; order_line.qty_invoiced increased; order.status -> closed when fully billed.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | The order to bill. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses concrete state effects: an invoice is created, order_line.qty_invoiced increases, and order.status moves to closed when fully billed. It also identifies the due-date source and warns against overriding it, which is exactly the kind of mutation context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and billing rule, then gives the due-date constraint and effects. It is appropriately sized for a financial mutation and every sentence contributes useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the key billing rule, due-date behavior, and side effects. It could be slightly more complete by stating what happens when there is nothing shipped or unbilled, but the core invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so order_id is already documented as the existing order to bill. The description adds business context about shipped/unbilled scope, but it does not add syntax or deeper 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 a specific verb and resource: issue an invoice for everything shipped on an order and not yet billed. It also distinguishes the billing rule from billing ordered quantities, so an agent can tell this is the shipment-based invoicing action rather than a generic invoice creator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the usage context: bill shipped-but-unbilled order lines, and do not pass a due date because terms govern it. However, it does not explicitly name alternative tools or when-not-to-use conditions, such as what to do before shipment or when to use void/credit-note tools instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_record_paymentRecord paymentAInspect
Record cash received from a customer. Recording the receipt and deciding what it settles are two acts, and this is only the first. A payment that arrives without a remittance advice sits as unapplied cash — which is the correct state, and visible in o2c_unapplied_cash. Never guess which invoice a payment is for to make the aging look tidy. Effects: payment recorded as unapplied cash.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount received. In cents (integer minor units) — 1250 means $12.50. | |
| method | No | How it arrived. | |
| reference | No | Check number, wire reference, remittance id — exactly as printed. | |
| customer_id | Yes | Who paid. An existing customer id. | |
| received_at | No | Value date. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, non-idempotent; the description adds genuinely new context by naming the resulting state ("payment recorded as unapplied cash") and warning against premature allocation. The one notable omission is that idempotentHint=false means re-posting the same payment creates a duplicate record — a real risk for a cash-receipt tool that the description does not surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence and the effects line is a compact, useful closer. The middle paragraph is slightly discursive but each sentence carries a distinct instruction rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the post-condition of the call (unapplied cash) and where that state is observable. It does not say what identifier or payload the call returns, which would help an agent chain into allocation, but the essential calling contract is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the cents convention, the ISO date default, and the enum for method. The description adds no parameter-level 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?
"Record cash received from a customer" is a specific verb+resource, and the description immediately draws the boundary against the sibling concern: "Recording the receipt and deciding what it settles are two acts, and this is only the first." An agent can distinguish this from o2c_apply_payment and o2c_unapplied_cash without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the correct condition (a payment arriving without remittance advice) and gives an explicit prohibition — "Never guess which invoice a payment is for to make the aging look tidy" — with a pointer to o2c_unapplied_cash for the resulting state. It stops short of naming the follow-up allocation tool (o2c_apply_payment) explicitly, leaving the agent to infer which tool performs the second act.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_record_returnRecord returnAInspect
Record goods coming back against an order; restock the sellable part; raise the credit note. Restock only what physically returns sellable (INV-12): lines flagged restock go back to stock through core; damaged goods are recorded but never re-enter it. You can never return more than was fulfilled, less what already came back. The credit note is valued at the charged price plus the tax as invoiced — the customer gets back what they were billed, not the list price. Effects: return recorded; sellable qty restocked via core; credit note (kind return) raised.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | What came back, row per disposition. | |
| reason | Yes | Why. Kept on the return and the credit note. | |
| order_id | Yes | The order the goods belong to. An existing order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false. The description goes well beyond that: it names the invariant on cumulative return quantity, explains that damaged lines are recorded but never re-enter stock, specifies credit note valuation as charged price plus invoiced tax rather than list price, and enumerates the resulting effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its three effects, then the constraints, then a compact effects recap. The final 'Effects:' sentence partially restates the opening, but it serves as a useful atomic summary rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing what gets created (return record, stock movement, credit note of kind return). What it omits is any indication of what identifiers or payload the caller receives back, which would matter for chaining into payment or invoice tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: the restock flag's business consequence (sellable vs damaged disposition) and the note that reason is persisted onto both the return and the credit note. It doesn't say why the nested line grouping is structured per disposition, but the added semantics justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Record goods coming back against an order') and immediately names the three side effects: restock, and credit note. This distinguishes it from siblings like o2c_create_credit_note and o2c_refund, which handle only one of those pieces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the operative constraint clearly ('You can never return more than was fulfilled, less what already came back') and defines how the restock flag selects behavior, giving strong context for when this tool is the right call. It does not, however, explicitly point the agent to o2c_refund or o2c_create_credit_note for cases that aren't a physical goods return.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_refundRefundADestructiveInspect
Record money returned to the customer against an unapplied payment or credit note balance. Records the fact that money went back; actually moving it is out of scope, like every other outbound act. Bounded by the unapplied balance of the source instrument — you cannot refund what is already applied to an invoice without unwinding that application first (which does not exist yet, on purpose: reverse by credit note instead). Effects: refund recorded; source unapplied balance reduced; credit_note.status -> settled when exhausted.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount returned. In cents (integer minor units) — 1250 means $12.50. | |
| method | No | How it went back. | |
| reference | No | Bank reference, exactly as printed. | |
| source_id | Yes | The payment or credit note id. | |
| source_type | Yes | What the refund draws down. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: it states that money movement is out of scope so only the fact is recorded, defines the balance ceiling, and enumerates resulting state changes (unapplied balance reduced, credit_note.status -> settled when exhausted). That is exactly the consequence disclosure an agent needs before a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then constraints, then effects in a clearly labelled 'Effects:' clause. It runs slightly long and the parenthetical aside plus 'like every other outbound act' are conversational, but every sentence carries actionable 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?
With no output schema, the description correctly compensates by spelling out the resulting state changes, and with 100% schema coverage plus full annotation coverage the remaining burden is small. An agent has everything needed to decide and call 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 baseline is 3, and the description earns an increment by adding a constraint the schema lacks: the amount and source are bounded by the source instrument's unapplied balance. It doesn't add format or routing detail for method/reference, but the key semantic limit is supplied.
Input schemas describe structure but not intent. Descriptions should explain 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 and resource ('Record money returned to the customer') plus a precise scope qualifier ('against an unapplied payment or credit note balance'). This cleanly separates it from inbound siblings like o2c_record_payment and from application siblings o2c_apply_payment / o2c_apply_credit without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a real eligibility rule (bounded by the unapplied balance; you cannot refund what is already applied) and routes the excluded case to an explicit alternative ('reverse by credit note instead'). It stops short of a full when-to-use enumeration against o2c_create_credit_note or o2c_record_payment, so it's strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_send_quoteSend quoteAInspect
Mark a quote as sent to the customer. This records that it went out. It does not send anything — this system has no outbound channel, by design. Effects: quote.status -> sent.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The quote. An existing quote id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the safety profile (not read-only, not destructive, not idempotent), but the description adds real value the annotations can't: there is no outbound channel by design, and the concrete effect is 'quote.status -> sent'. It stops short of stating whether repeat calls are rejected or what happens on an invalid status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short lines, front-loaded with the action and the key disclaimer, and the effect statement is compact. Slight overlap between 'Mark a quote as sent' and 'This records that it went out' keeps it from being maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers what changes and what does not happen, and annotations cover the risk profile. Missing are precondition/status requirements and the behavior of repeat invocations given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('The quote. An existing quote id.'), so the schema carries the semantics. The description adds nothing about the identifier's format or origin, 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 states a specific verb and resource ('Mark a quote as sent') and immediately disambiguates the misleading 'send' in the tool name by saying it records status only and does not actually transmit anything. An agent can tell this apart from other quote tools without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clarifies the operation's semantics ('records that it went out') but never names an alternative or a precondition, e.g. whether the quote must be in draft status, or how this differs from o2c_accept_quote or o2c_create_quote. The usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_ship_orderShipAInspect
Record a shipment against a confirmed order. Partial shipments are normal. Omit lines to ship everything still open. Pass lines to ship part of it — a short ship is a fact, not a failure, and the order stays open for the rest.
Stock is checked per line and cannot go negative. If there is not enough, ship what there is and say so; do not silently reduce the ordered quantity, because the customer is still owed the difference and the open quantity is how anyone knows that. Effects: delivery created; order_line.qty_shipped increased; item.on_hand decreased via core; order.status -> shipped when nothing remains.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Leave empty to ship everything still open. | |
| carrier | No | Carrier. | |
| order_id | Yes | The order being shipped. An existing order id. | |
| tracking | No | Tracking number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by enumerating side effects: delivery created, order_line.qty_shipped increased, item.on_hand decreased via core, order.status -> shipped when nothing remains. It also discloses the stock constraint ('cannot go negative') and the invariant that the order stays open for the shortfall — exactly the mutation context annotations like destructiveHint=false cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then behavior, then effects — a good structure. The short-ship paragraph is slightly redundant, restating the 'don't silently reduce quantity' point twice, but every section still carries actionable 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?
No output schema exists, yet the description covers the mutation effects, the partial-shipment edge case, and the insufficient-stock failure mode. An agent has everything needed to invoke this correctly and report 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 coverage is 100%, so baseline is 3, but the description adds genuine meaning about the `lines` parameter's omission semantics (empty = ship all open, present = partial) and reinforces the open-quantity ceiling on qty. Carrier and tracking are only covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Record a shipment against a confirmed order') plus the precondition (order must be confirmed). The partial-shipment framing lets an agent distinguish this from o2c_close_short and o2c_invoice_shipped without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating guidance: omit lines to ship everything open, pass lines for a partial ship, and ship available stock rather than silently reducing the ordered quantity. It does not name sibling tools (close_short, invoice_shipped, cancel_order) as explicit alternatives for the remaining cases, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_unapplied_cashUnapplied cashCRead-onlyIdempotentInspect
Payments received that no invoice claims yet.
| 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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only a definition of the concept; it says nothing about whether results span all customers, whether amounts or dates are included, or how large the result set typically is.
Agents need to know what a tool does to the 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-loaded on the defining characteristic. It is efficient, though its terseness is arguably under-specification rather than true 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?
No output schema exists, so the description carries the burden of describing what comes back — a list of payments, with amounts, customer, and date? — and it delivers none of that. For a zero-parameter query tool, an agent is left guessing at the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is no parameter surface for the description to compensate for, and it does not create confusion by implying hidden filters.
Input schemas describe structure but not intent. Descriptions should explain 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 phrase identifies the resource domain — payments received that no invoice has claimed — which is meaningfully narrower than siblings like o2c_apply_payment, but it is a noun fragment with no verb. An agent cannot tell whether the tool lists, summarizes, or reports unapplied cash, only what domain it covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 or when-not-to-use guidance and no named alternative. The obvious companions (o2c_apply_payment, o2c_apply_credit, o2c_ar_aging) are never referenced, so routing must be inferred entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_void_invoiceVoid invoiceADestructiveInspect
Void an invoice that should never have been issued. Only an invoice with no cash applied to it can be voided, and voiding puts the quantities back to uninvoiced so the order can be billed correctly. An invoice the customer has already paid against is corrected with a credit note, never voided — the money moved, and the record has to keep saying so. Effects: invoice.status -> void; order_line.qty_invoiced released.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it is being voided. | |
| invoice_id | Yes | The invoice. An existing invoice id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and not read-only, but the description adds essential context beyond them: the no-cash precondition, the exact effects on invoice status and qty_invoiced, and why paid invoices must not be voided. That is a strong disclosure profile for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but front-loaded with purpose, precondition, alternative, and effects. The rationale about money having moved earns its place because it prevents a dangerous misuse of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, it supplies the preconditions, correct alternative, and resulting state changes an agent needs before invoking it. Nothing critical about safe 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 adds a substantive invocation constraint on invoice_id by requiring that no cash be applied, though it does not add meaning beyond the schema for the reason parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Void an invoice') and immediately scopes the purpose to invoices that should never have been issued. It distinguishes this action from correcting a paid invoice with a credit note, so an agent can tell it apart from related O2C 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 states the core precondition ('Only an invoice with no cash applied to it can be voided') and the exclusion with an explicit alternative: a paid invoice is corrected with a credit note, never voided. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
o2c_write_offWrite offADestructiveInspect
Close an uncollectible open invoice balance as a visible, reasoned credit act. A write-off is a credit note of kind write_off, raised for the open balance and applied to the invoice in the same act — never a deletion, never silent (INV-16). The threshold for who may write off how much is yours to police; the record that it happened is not. Effects: credit note (kind write_off) raised and applied; invoice.status -> paid.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it will not be collected. | |
| invoice_id | Yes | The invoice. An existing invoice id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive=true and idempotent=false; the description goes well beyond that by disclosing the concrete side effects (credit note raised and applied, invoice.status -> paid) and by insisting the act is visible and reasoned rather than silent. This tells an agent exactly what state changes to expect, which annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and mechanism in the first two sentences, with effects spelled out at the end. Mostly tight, though the aphoristic 'the threshold ... is yours to police; the record that it happened is not' is stylistic filler an agent does not need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 'Effects' line usefully substitutes for a return-value description. The notable gap is that the tool is non-idempotent and destructive, yet the description never warns against retrying, which risks duplicate write-off credit notes.
Complex tools with many parameters or behaviors need more documentation. 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% for both parameters, so the schema already defines invoice_id and reason fully. The description adds only indirect meaning — that the reason becomes a visible, audited record — without format, length, or validation detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (write off an uncollectible invoice balance) and immediately clarifies the mechanism: a credit note of kind write_off raised and applied to the invoice. It distinguishes itself from deletion/void ('never a deletion'), which implicitly separates it from siblings like o2c_void_invoice and o2c_create_credit_note, though those tools are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger condition is clear — an uncollectible open invoice balance — but there is no explicit routing against alternatives (void_invoice, close_short, create_credit_note) or stated preconditions such as invoice state or approval threshold. The line about who may write off how much being 'yours to police' explicitly defers policy rather than guiding tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_bill_matchBill matchBRead-onlyIdempotentInspect
The 3-way match for one bill: each line against what was received (or ordered, for services) and against the order's price, with the tolerance that applies.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | The bill, e.g. B-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds genuinely useful domain behavior: matching is 3-way, services fall back to the order rather than a receipt, and the applicable tolerance is applied. It says nothing about what happens when no tolerance is configured, whether it reports per-line discrepancies, or the format of the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler, front-loaded on the core operation. It is information-rich rather than padded, though the parenthetical '(or ordered, for services)' interrupts the flow slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 telling the agent what comes back — match status, per-line variances, exceptions — and it does not. It explains what is compared but not what the caller learns, which is the main missing piece for a diagnostic 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?
Only one parameter (bill_id) with 100% schema description coverage including an example value, so the schema already does the work. The description adds no format or lookup guidance beyond the schema, which is the expected 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 operation on a specific resource: performs the 3-way match for one bill, checking each line against receipts (or orders for services) and against the order price. An agent can tell it is a read-only matching/comparison tool rather than a bill-creation tool like p2p_record_vendor_bill. It stops short of naming the sibling it is distinguished from (e.g. p2p_set_match_tolerance or p2p_unbilled_receipts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 call this versus alternatives such as p2p_record_vendor_bill (which presumably triggers matching) or the purchasing-side match tools. It presupposes the agent already knows it wants to inspect a bill's match, and offers no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_cancel_poCancel orderADestructiveInspect
Cancel an order nothing has arrived against and no bill points at. With a reason. Once anything has arrived, the order cannot be cancelled: close the rest short instead. The order stays on the record as cancelled. Effects: order cancelled.
| Name | Required | Description | Default |
|---|---|---|---|
| po_id | Yes | The order. An existing p2p_po id. | |
| reason | Yes | Why it is cancelled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond destructiveHint=true by explaining what destruction means here: the order is retained on record in a cancelled state rather than deleted. It also flags the blocking precondition. Gap: nothing about calling it twice or on an already-cancelled order, despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, precondition front-loaded, alternative and post-state follow. 'Effects: order cancelled' is slightly redundant but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 and no annotations about reversibility, so the description carries that burden and does so for the pre-state and post-state. Missing only re-invocation behavior and any permission/authorization notes.
Complex tools with many parameters or behaviors need more documentation. 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-schema. The description only adds 'With a reason', which is marginal value over the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('cancel an order') plus the eligibility condition and required input. It differentiates from p2p_close_po_short by pointing to that alternative when goods have arrived.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (nothing received, no bill linked) and when-not (anything arrived), with the alternative route named ('close the rest short instead'). Preconditions and the fallback path are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_close_po_shortClose the rest shortAInspect
Stop waiting for what has not arrived: the vendor will not send it. What did arrive stays received and billable. With a reason. Use it when the vendor says the rest is not coming. When nothing has arrived at all, cancel instead. Effects: order closed short.
| Name | Required | Description | Default |
|---|---|---|---|
| po_id | Yes | The order. An existing p2p_po id. | |
| reason | Yes | Why the rest will not come. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-open-world mutation, so the description's job is to add business context. It does that well by explaining that received goods stay received and billable and that a reason is required, though it does not describe reversibility or downstream posting effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: it establishes the business situation, then the usage condition, then the alternative, then the effect. Every sentence contributes to deciding whether and how to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation with full schema coverage, annotations, and no output schema, the description is complete enough to select and invoke the tool correctly. It covers the trigger, the exclusion, the required reason, and the key business effect on received and billable quantities.
Complex tools with many parameters or behaviors need more documentation. 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: the existing PO id and the reason. The description reinforces that a reason is needed but adds no syntax, format, or selection guidance beyond what the schema provides, 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 states a specific business action: stop expecting undelivered quantities and close the order short, while received quantities remain received and billable. The final line, 'Effects: order closed short,' anchors the exact outcome, and the 'cancel instead' sentence distinguishes this tool from the sibling cancel path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 this tool: when the vendor says the remaining quantity is not coming. It also states when not to use it: when nothing has arrived at all, use cancel instead. That is the exact when/when-not/alternative guidance required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_create_poNew purchase orderAInspect
Draft an order to a vendor: what, how many, at the price they quoted. A draft commits to nothing until it is issued. Use the items as they are on record (core items); the price is the vendor's price for one, as they quoted it, never the price you sell at. One line per item. Never invent a price or a quantity: ask. A draft can be cancelled and raised again; once issued, the prices are frozen and the order is what bills are matched against. Effects: purchase order created in draft.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Anything about the order. | |
| lines | Yes | What is being ordered. | |
| vendor | Yes | The vendor's name as a person would say it (Acme Supply). | |
| currency | No | ISO 4217. Defaults to the company currency. | |
| vendor_ref | No | The vendor's quote or order reference. | |
| expected_date | No | When the vendor said it will arrive. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-destructive, non-idempotent, not open-world), the description explains the lifecycle: a draft commits to nothing, can be cancelled and re-raised, and once issued prices are frozen and matched against bills. It also states the direct effect ('purchase order created in draft'), which tells the agent exactly what state change to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with purpose and key constraints, then lifecycle and effects. It is slightly long but each sentence carries operational value, 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?
No output schema exists, but the description states the effect (created in draft) and the post-draft/issue consequences, which is enough for a mutation tool whose annotations already cover the safety profile. It doesn't describe what ID or handle is returned, but that is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description still adds real semantic content: it explains that unit_price must be the vendor's quote price (not sell price) and that lines must reference core items, clarifying intent beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Draft an order to a vendor') and immediately clarifies the semantic content ('what, how many, at the price they quoted'). The distinction from issuing (p2p_issue_po) is implied via 'drives nothing until issued', so an agent can separate drafting from committing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 operational guidance: use items as on record (core items), one line per item, use the vendor's quote price never the sell price, and 'never invent a price or a quantity: ask'. It doesn't explicitly name a sibling alternative, but the draft-vs-issue lifecycle is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_goods_receivedGoods receivedARead-onlyIdempotentInspect
What arrived, against which order, when, at the order's prices. Newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| po_id | No | Only this order. An existing p2p_po id. |
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 still adds genuine behavior not in the structured fields: result ordering ('Newest first') and data provenance ('at the order's prices'), i.e. prices come from the PO rather than the receipt. It omits volume/pagination limits, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence of four clauses, zero filler; ordering is stated last for emphasis. It is lean to the point of being fragmentary — a leading verb such as 'List' would make the operation unambiguous at no length cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 one optional param, no output schema, and rich safety annotations, the description does most of the remaining work by telling the agent what each row contains (order, date, prices) and how it is sorted. Only the aggregation scope (all receipts vs. unbilled only) and result size are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter with 100% schema description coverage, so the schema already explains po_id fully. The phrase 'against which order' loosely maps to that filter but adds no syntax, default behavior, or what happens when omitted (presumably all receipts). 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 states the resource and its content precisely — receipts with their linked order, arrival date, and order pricing — plus result ordering ('Newest first'). It doesn't use an explicit list/read verb or name the write-side sibling (p2p_receive_goods), but an agent can distinguish this as the goods-receipt reading tool from the four content clauses 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?
Usage is only implied: 'What arrived, against which order, when' suggests reviewing received goods. There is no statement of when to prefer it over p2p_unbilled_receipts, p2p_po, or p2p_receive_goods, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_issue_poIssue orderAInspect
Record that the order went to the vendor. Its prices freeze: bills are matched against them. Issue when the person says the order went out (Saybooks sends nothing; they send it). After this the order cannot be edited, only received against, closed short or, while nothing has arrived, cancelled. Effects: order issued, prices frozen.
| Name | Required | Description | Default |
|---|---|---|---|
| po_id | Yes | The order, e.g. PO-0001. An existing p2p_po id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by detailing critical business consequences that a simple write operation hint misses, such as prices being 'freeze[d]' and the subsequent lifecycle restrictions (can only be received, closed short, or cancelled). This provides vital behavioral context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While slightly verbose, the description is highly effective. It front-loads the core definition and then organizes the remaining sentences logically: consequence, trigger, restriction, and final effects. It earns its length by providing necessary business logic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 inherent complexity of a state-transition tool in a procurement workflow, the description is exceptionally complete. It defines the action, the trigger for the action, and all the resulting behavioral constraints on the order object.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the parameters are fully documented in the schema itself. The description correctly identifies the requirement for an existing PO ID but adds no semantic value regarding the input beyond what is already specified in the structured data. Baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description defines the action as recording that an order has been officially sent to the vendor, which clearly distinguishes it from creation tools (like p2p_create_po) and reception tools (like p2p_goods_received). It focuses on a specific point in the PO lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 extremely clear usage guidelines by specifying the exact trigger: 'Issue when the person says the order went out.' It also clearly defines the 'when not' conditions by stating that after issuing, the order cannot be edited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_poPurchase orderARead-onlyIdempotentInspect
One order: each line with what was ordered, received and billed; its receipts and bills, and whether each bill matches.
| Name | Required | Description | Default |
|---|---|---|---|
| po_id | Yes | e.g. PO-0001. An existing p2p_po id. |
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's job is to add substance — which it does by describing the returned structure (lines, receipts, bills, match verdict) in the absence of an output schema. It stops short of noting behavior for a missing or unknown PO id.
Agents need to know what a tool does to the 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 compact sentence that front-loads the scope ('One order') before enumerating contents; every clause carries information. The grammar is slightly elliptical ('each line with what was ordered'), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description gives a usable picture of the response shape and match semantics. Only edge-case behavior (unknown po_id, what an unmatched bill looks like) is unaddressed, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (po_id) and schema description coverage is 100%, with the schema itself giving the 'PO-0001' format example. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('One order') and enumerates exactly what the caller gets back: line-level ordered/received/billed quantities, receipts, bills, and bill-match status. 'One order' implicitly contrasts with the plural p2p_pos, but no sibling is named explicitly, so sibling differentiation 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?
Usage is only implied — the agent can infer this is the drill-down for a single PO after seeing it in p2p_pos, but the description never says when to use this versus p2p_bill_match, p2p_unbilled_receipts, or p2p_pos, and offers no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_posPurchase ordersCRead-onlyIdempotentInspect
Orders by state, with what is still to arrive on each.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Only this state. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and closed-world, so safety is covered. The description adds one genuinely useful behavioral note: each row carries 'what is still to arrive,' i.e. pending receipt quantities. It does not say whether rows are grouped or flat, or how large the result can be.
Agents need to know what a tool does to the 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, and the scoping idea is front-loaded. It is terse rather than padded — the problem is under-specification, not verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema list tool this is nearly sufficient, but with no output schema the agent must guess the return shape; 'what is still to arrive on each' is the only hint and is vague about whether it is a quantity, a date, or nested lines.
Complex tools with many parameters or behaviors need more documentation. 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 enum parameter is fully documented, so the baseline is 3. The description's 'by state' is consistent with the parameter but adds no syntax, default-behavior, or omission semantics 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 fragment 'Orders by state, with what is still to arrive on each' conveys scope (grouping orders by state plus outstanding receipts) but has no verb and never says 'purchase orders' — the title carries that. Against siblings like p2p_goods_received, p2p_bill_match and p2p_unbilled_receipts, the agent has to infer that this is the read/list endpoint for POs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to use this versus p2p_goods_received, p2p_bill_match, or p2p_unbilled_receipts, nor any mention that omitting the state parameter returns all states. The agent gets no routing hints at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_receive_goodsReceive goodsAInspect
Record what arrived against an order, as counted. Stock goes up; the goods are owed for until their bill is approved. Record what was counted at the door, against the order it came on, with the packing slip number when there is one. Never receive what was not counted, and never more than is still open on a line: that is refused with the numbers, and the answer is a conversation with the vendor, not a second order. Services are not received; their bill is matched against the order. A receipt cannot be changed afterwards. Effects: goods receipt recorded; stock increased through core; order received when every stocked line has arrived.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Anything about the delivery (one box damaged). | |
| lines | Yes | What arrived. | |
| po_id | Yes | The order the goods came on. An existing p2p_po id. | |
| reference | No | The packing slip or delivery note number. | |
| received_at | No | The day it arrived. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that stock increases, goods remain owed until bill approval, over-receipts are refused with numbers, services are excluded, receipts are immutable, and the order is received once all stocked lines arrive. This is rich behavioral context for a non-idempotent write 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 front-loaded and operationally useful, but the opening two sentences substantially restate the same receiving action. Some prose could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 multi-line receiving mutation with no output schema, it covers the important effects, refusal behavior, immutability, and services exclusion. An agent has enough context to call it correctly and understand the consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description reinforces counting semantics and the open-quantity constraint, but it does not add much 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: record what arrived against an order as counted. It also distinguishes receiving from bill matching for services, so an agent can tell it apart from related p2p 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 when-to-use guidance, clear when-not rules such as never receiving uncounted goods or more than remains open, and points to bill matching for services. It also states that over-receipt is a vendor conversation rather than a second order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_record_vendor_billRecord a bill on this orderInspect
Record a vendor's bill against an order, line by line as printed. It is matched against what was ordered and received; a person approves paying it only when it matches. You were handed the vendor's invoice for goods on an order. Record it line by line as printed: the item, the quantity and the price for one, plus the vendor's invoice number and the dates. Never correct a line to make it match; the bill is what the vendor says, and the match exists to show where it differs. The result says whether it matches the order and, when it does not, by how much. Recording is never refused for a mismatch; approving it is. Tell the person what the match says; when it does not match, the answer is a corrected bill from the vendor (record it, and the person rejects the old one) or a person loosening the tolerance with a reason. Effects: bill recorded in Bills, waiting for approval; its lines kept for the 3-way match.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | What the bill charges, line by line. | |
| po_id | Yes | The order the bill is for. An existing p2p_po id. | |
| number | No | The vendor's own invoice number, as printed. | |
| reason | No | Where it came from: "emailed by Acme on the 3rd". | |
| category | No | For service lines only (freight, installation): what it is for, in the person's words. | |
| due_date | No | When it is due, as printed. ISO date, YYYY-MM-DD. | |
| bill_date | Yes | The date on the bill. ISO date, YYYY-MM-DD. | |
| file_hash | No | A hash of that file, if you have one. | |
| file_name | No | The file you were handed, for the record. | |
| terms_days | No | Or the days the bill gives (30 for net 30), when it prints no due date. |
p2p_set_match_toleranceSet match toleranceAInspect
How far a bill may stray from its order before approval is refused: a price percentage and a quantity percentage. 0 by default. HUMAN-ONLY: this act is refused to you whatever your role — Loosening the match is a decision about how much a vendor may overcharge before a person is told no. Ask your human to do it. Refused to you whatever your role. If a bill is refused by the match, show the person the numbers (p2p_bill_match); they decide whether to loosen it. Effects: match tolerance set.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why, for the record. | |
| qty_pct | No | Percent a billed or received quantity may exceed what was received or ordered. | |
| price_pct | No | Percent a billed price may exceed the order's price (2 for 2%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The most important behavioral fact — the call is refused to the agent regardless of role, because loosening tolerance is a human judgment about vendor overcharge — is disclosed up front and is not derivable from the annotations. It also states the default (0) and the effect, and nothing contradicts readOnlyHint=false or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The front-loaded definition and effects line are efficient, but the human-only refusal is stated twice in near-identical wording ('this act is refused to you whatever your role' and 'Refused to you whatever your role'), which wastes space even though the repetition reflects deliberate emphasis.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter config setter with no output schema and full annotation coverage, the definition supplies what an agent needs: what the setting means, its default, the refusal policy and the escalation path. Return-shape detail is unnecessary since no output schema exists and the effect is stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the schema already documents reason, qty_pct and price_pct thoroughly. The description adds the useful default value ('0 by default') and the joint framing of the two percentages, but offers no additional format or edge-case guidance 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 defines the resource precisely (price percentage and quantity percentage a bill may stray from its order before approval fails) and the closing 'Effects: match tolerance set.' confirms it is the setter for that tolerance. It never states the verb itself in the body — the name carries it — but the resource is unambiguous and no sibling tool touches match tolerance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicitly that the act is refused to the agent whatever its role, instructs it to ask a human, and names the alternative workflow (show the numbers via p2p_bill_match so the person decides). When-to-use, when-not-to-use and the alternative are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
p2p_unbilled_receiptsReceived, not yet billedARead-onlyIdempotentInspect
Goods received and not yet on an approved bill, line by line, with their value: what is owed for and not yet billed (GRNI).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 the useful nuance that only receipts absent from an *approved* bill qualify (draft bills presumably still count) and that output is line-level with values. It says nothing about ordering, volume, or whether receipts partially billed are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler, and the defining scope ('not yet on an approved bill') is front-loaded. The parenthetical gloss (GRNI) is the only slight redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only report with no output schema, the description covers what is listed, the unit of output ('line by line'), and that value is included. Only minor gaps remain: no indication of ordering or of how partially billed receipts are treated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there are no arguments for the description to disambiguate. The description correctly implies an unfiltered, full-dataset report rather than a query.
Input schemas describe structure but not intent. Descriptions should explain 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 the exact resource and its discriminating condition: goods received but 'not yet on an approved bill', i.e. the GRNI accrual. That qualifier distinguishes it from p2p_goods_received (all receipts) and p2p_bill_match without needing the schema. It stops short of naming a sibling explicitly, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 GRNI framing implies the period-end accrual use case, but there is no explicit 'use this when...' statement and no mention of alternatives such as p2p_goods_received or p2p_bill_match. An agent must infer the usage from the accounting term rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pros_discard_pullDiscard a pullBInspect
Throw out one staged pull and every unpromoted row from it, with a reason, so it can be re-read and staged again. A wrong pull means a wrong file: staged rows are never edited, the pull is discarded and handed over again from a fresh read. Rows that already became accounts are NOT removed and are listed back — an account is a real thing now and deleting the row behind it would leave the account with no provenance. The hash is free again afterwards. Effects: pull and its unpromoted rows deleted; promoted rows kept and listed; hash free to stage again.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why — the wrong file, a misread column, a re-pull. | |
| source_id | Yes | The pull, e.g. PUL-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states plainly that the pull and its unpromoted rows are deleted, yet annotations declare destructiveHint=false, which asserts the tool performs only additive updates. That is a direct conflict an agent relying on annotations would resolve incorrectly. The effect disclosure itself is otherwise unusually rich (promoted rows kept and returned, hash reusable), but it contradicts the declared hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, which is good, but the same idea is restated three times ("so it can be re-read and staged again", "handed over again from a fresh read", "The hash is free again afterwards"), and the trailing "Effects:" line duplicates the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (promoted rows are "listed back") and what survives the operation. Missing only an explicit statement of the failure modes (e.g. what happens if the pull id is unknown or rows are already promoted beyond the listed case).
Complex tools with many parameters or behaviors need more documentation. 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 required parameters are fully documented in the schema (reason: "Why — the wrong file, a misread column, a re-pull."; source_id: "The pull, e.g. PUL-0001."). The description adds only the requirement that a reason accompany the discard, not new syntax or validation rules. Baseline 3 applies at 100% 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?
Specific verb and resource: "Throw out one staged pull and every unpromoted row from it, with a reason." The scope (pull + unpromoted rows only) is precise enough to distinguish it from pros_promote and pros_rows, though it never names those siblings 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?
"A wrong pull means a wrong file: staged rows are never edited, the pull is discarded and handed over again from a fresh read" gives a clear triggering condition and explains the correct workflow (discard then re-stage rather than editing). No explicit when-not guidance or named alternative (e.g. inspect with pros_rows first) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pros_import_rowsImport a pullAInspect
Hand over one pulled list: what it was bought or scraped under, and its rows. These are not accounts and never become accounts here. You read the file; this records it. Nothing here parses and nothing here qualifies.
CRITERIA IS MANDATORY AND IT IS THE POINT (PRO-2). Write the brief this pull was actually made under: the size band, the geography, the industries asked for. A pull whose criteria nobody wrote down cannot have its verdicts checked against anything afterwards, and rows judged against a brief that was never stated are judged against your memory of it.
The same hash is refused twice (PRO-1). Rows whose company name is already staged, or already an account, are skipped and listed back — say so to the person. The batch is accepted whole or refused: if the file says a row count and you hand over a different number, re-read it.
Hand over the seller's own description verbatim rather than your summary of it. Your reading of the row belongs in a verdict, where it is attributed to you and can be argued with. Effects: pull recorded with its criteria; rows staged with provenance; duplicates skipped and listed.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes | Content hash of the file, or a stable id it carries (vendor + list id + date). | |
| rows | Yes | Every row, in the file's order. | |
| label | Yes | What this pull was, in your human's words — "Phoenix metro, 200-1000 staff". | |
| criteria | Yes | The brief this pull was made under: size band, geography, industries asked for. Mandatory, and read later by whoever checks the verdicts. | |
| row_count | Yes | How many rows the file holds. | |
| campaign_id | No | The campaign this pull was made for, if that is already decided. An existing campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile, and the description goes well past them: it discloses hash-based duplicate refusal (PRO-1), per-row duplicate skipping with results listed back to the caller, and whole-batch accept-or-refuse atomicity. It closes with an explicit effects summary — pull recorded with criteria, rows staged with provenance, duplicates skipped and listed. The non-idempotent annotation is consistent with the same-hash-refused-twice 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 the imperative and organized by concern (criteria, duplicates, verbatim text). It is longer than typical and has some rhetorical flourish ('CRITERIA IS MANDATORY AND IT IS THE POINT', 'judged against your memory of it'), but those lines carry real behavioral instruction rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, it supplies dedup behavior, atomicity, and a closing effects statement that effectively stands in for return values. The gap is campaign_id: nothing says whether it is optional, what happens if omitted, or when a pull should be tied to an existing campaign.
Complex tools with many parameters or behaviors need more documentation. 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 more: it explains why criteria is mandatory and what belongs in it (size band, geography, industries), insists on verbatim seller description over summary, and requires row_count to match the file rather than be an estimate. The only unaddressed parameter is campaign_id, which the description never mentions.
Input schemas describe structure but not intent. Descriptions should explain 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 states a specific verb and resource — hand over one pulled list plus the terms it was made under — and immediately draws the boundary that matters: 'These are not accounts and never become accounts here,' which separates it from pros_promote and pros_qualify. An agent knows from sentence one that this records a file, not that it parses or qualifies 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?
It gives clear when-conditions (criteria mandatory, verbatim seller description, matching row count) and points elsewhere for the other job: 'Your reading of the row belongs in a verdict, where it is attributed to you.' That routes judgment work away from this tool, though it never names the specific sibling to use instead, so the alternative is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pros_promotePromote to accountsInspect
Turn qualified staged rows into real accounts under a campaign. A person's act, always. HUMAN-ONLY: this act is refused to you whatever your role — the curated list is the asset, and an agent that could fill it from a bought list would empty the curation of meaning. Ask your human to do it. This is the door between a bought list and a curated one, and it opens from one side only. An agent may stage rows and judge them; a person decides which become accounts.
Only rows with a 'qualified' verdict promote. Each becomes an account carrying the verdict's reason as its why_them and the row's own source as its source_url, so the account arrives with the provenance CRM-3 demands rather than an invented justification. Read the verdicts first: promoting is agreeing with them.
A row promotes once. What it became is recorded on the row, so the pull keeps saying what came of it long after the rows stop mattering. Effects: crm accounts created from qualified rows; rows marked promoted with the account they became.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | Tier for the new accounts, if they share one. | |
| row_ids | Yes | The rows to promote. | |
| campaign_id | Yes | The campaign these accounts pursue. An existing campaign id. |
pros_qualifyQualify staged rowsAInspect
Record a judgement on staged rows. Never creates an account. One row or a whole pull in a single call. READ THE PULL'S CRITERIA FIRST (pros_sources). A verdict is a judgement against a stated brief, not against your general sense of a good customer.
THE REASON IS THE PRODUCT (PRO-3). It is read by a person deciding whether to overrule you, and by somebody months later asking why this company was dropped. "Hospitality, no desk-based back office to measure" is useful. "Not a fit" is not, and is refused. Cite a source_url when the answer came from the company's own site rather than the row.
AN INDUSTRY LABEL IS NOT EVIDENCE. The seller's label covers two different businesses more often than not; read the description and the site before deciding.
USE "unclear" RATHER THAN GUESSING. If the row does not say what you need, that is a real finding and leaves the row for a person. A confident wrong rejection is invisible: nobody ever audits the companies that were dropped.
A bad row does not discard the rest — each is applied on its own and the response reports what failed. Qualifying is not promoting: you cannot create an account from a bought list, and that is deliberate (PRO-5). Effects: verdicts recorded against staged rows, per row.
| Name | Required | Description | Default |
|---|---|---|---|
| verdicts | Yes | The judgements. One row is a batch of one; a whole metro is one pass. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-open-world, and the description adds real behavioral context beyond them: per-row application with partial-failure semantics ("each is applied on its own and the response reports what failed"), the non-creation guarantee, and the audience for the reason field. It does not address re-qualification of an already-judged row, which matters because idempotentHint=false is set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key constraint in the first two sentences, then organized into short labeled rules. It is on the long side and cites internal ticket codes (PRO-3, PRO-5) that add no information for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter batch mutation with no output schema, it covers the essentials an agent cannot infer: batch semantics, partial failure behavior, the prerequisite lookup, verdict selection policy, and the evidence expectation. Nothing central 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 met by structured data, but the description adds genuine meaning: it makes the reason field's quality bar and failure mode concrete ("'Not a fit' is not, and is refused") and explains when source_url applies ("when the answer came from the company's own site rather than the row").
Input schemas describe structure but not intent. Descriptions should explain 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 ("Record a judgement on staged rows") and immediately scopes what it is not ("Never creates an account"), pointing at pros_promote by implication. It also differentiates from pros_rows by naming row_id's origin and from pros_sources by deferring to it for criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 preconditions ("READ THE PULL'S CRITERIA FIRST (pros_sources)") and an explicit alternative to use instead of guessing ("USE 'unclear' RATHER THAN GUESSING"). It also defines when a reason is acceptable vs refused, which is a usability rule, not just flavor text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pros_rowsStaged rowsARead-onlyIdempotentInspect
One page of staged rows, with an honest count of everything the filter matched. judged=false IS THE "WHAT IS LEFT TO JUDGE" QUERY and it is usually the one you want. It is not the same as any verdict filter: an unjudged row has no verdict at all.
BRIEF IS THE DEFAULT AND YOU ALMOST ALWAYS WANT IT. The seller's description is a marketing paragraph; fifty of them at full length exceed the tool output cap and the call fails outright rather than truncating. Brief cuts each to 200 characters, which decides most rows. Ask for brief=false on the handful where the cut description genuinely is not enough, and lower the limit when you do.
ALWAYS READ total_matching AND has_more. The page caps at 200 and the sort is total, so paging with offset never skips or repeats a row — but a page is not the answer to "how many".
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | Default true. false returns the full description and provenance. | |
| limit | No | Rows per page, up to 200. Default 50. | |
| judged | No | false: rows with no verdict yet. true: rows already judged. | |
| offset | No | Where the page starts. Default 0. | |
| company | No | Name contains this. | |
| verdict | No | Only rows carrying this verdict. | |
| promoted | No | false: not yet an account. true: already promoted. | |
| source_id | No | One pull, e.g. PUL-0001. Judging is a pass over one pull, not over everything staged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds material behavior an agent could not infer: full-length descriptions exceed the output cap and the call fails outright rather than truncating, the page caps at 200, and offset paging never skips or repeats because the sort is total. It also explains count semantics — total_matching is a count of everything the filter matched, not the page size.
Agents need to know what a tool does to the 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 the tool returns, then the two highest-stakes directives (the unjudged query, and brief as default) before the paging caution. The all-caps emphasis is justified by a real failure mode (call fails outright), and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 optional params and no output schema, the description does the heavy lifting: it names the two response fields that matter (total_matching, has_more) and warns that a page is not an answer to 'how many'. It stops short of describing row fields or the actual sort order, which leaves a small gap for a listing tool this configurable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: judged=false is not equivalent to any verdict filter because an unjudged row has no verdict at all, and brief interacts with limit (lower the limit when using brief=false). It does not add anything for offset, company, source_id, or promoted 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 first sentence states the resource precisely — 'one page of staged rows, with an honest count of everything the filter matched' — which tells an agent it is a paged, filtered list rather than a single-record fetch or a mutation. It does not name the sibling that would be used instead (e.g. pros_sources for pulls, pros_qualify for judging), so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use direction: 'judged=false IS THE "WHAT IS LEFT TO JUDGE" QUERY and it is usually the one you want', plus 'ask for brief=false on the handful where the cut description genuinely is not enough, and lower the limit when you do.' That is real operational guidance, but it never routes to or excludes an alternative sibling tool by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pros_sourcesPullsARead-onlyIdempotentInspect
Every staged pull with the brief it was made under and how far it has been judged. Read the criteria before judging any of its rows: a verdict is a judgement against a stated brief, not against your general sense of a good customer.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | No | One pull. |
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 real context beyond that: the returned records include the governing brief and a judging-progress indicator, and it sets an evaluation standard for interpreting those records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The scope statement is front-loaded and the interpretive caveat follows. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list with one optional filter this covers what is returned and how to read it, but it leaves out how pulls relate to their rows (pros_rows) and to the downstream qualify/promote flow, which matters in this dense sibling set. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single source_id param is documented as 'One pull.' The description adds nothing about the parameter — in fact 'Every staged pull' reads as unfiltered listing, which slightly undersells that source_id narrows to one pull. 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 states a specific resource and scope: 'Every staged pull with the brief it was made under and how far it has been judged' — an agent can tell this enumerates pulls plus their brief and judging progress. It stops short of distinguishing it from siblings like pros_rows or pros_qualify, but the verb+resource is concrete rather than tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a workflow instruction — 'Read the criteria before judging any of its rows' — and warns that verdicts must be made against the stated brief. That implies usage (call this to see pulls, then judge rows), but it never names an alternative tool or says when to use pros_rows/pros_qualify instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_accept_suggestionsAccept suggestionsAInspect
Confirm what standing rules suggest, in one reasoned act: every waiting row, or one rule's rows, minus any the person says are not part of it. This is a review act, so it follows the person's confirmation, never the rule alone. Show them the rows first (purch_rules lists each rule with the rows it is suggesting for), and leave out any row they say does not belong with except. The reason is their confirmation. Effects: status and category recorded on every row accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| except | No | Rows to leave unreviewed, comma separated (T-0012, T-0015). | |
| reason | Yes | Why: typically "confirmed by the person" plus anything they said. | |
| rule_id | No | Only this rule's suggestions, e.g. RL-0001. Omit for every waiting row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=false), and the description adds value beyond them: it discloses the effect ('status and category recorded on every row accepted') and the human-confirmation requirement. It does not address what happens on a repeat call (no waiting rows? error?) despite idempotentHint=false, which is the one meaningful 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 operation and constraint are front-loaded, and the 'Effects:' line is efficient, but the prose is padded with stylistic framing ('in one reasoned act', 'This is a review act') that costs tokens without adding decision-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?
For a 3-parameter mutation with no output schema, the description covers the prerequisite, the human-confirmation rule, the field-selection behavior, and the resulting side effects on the records. It lacks only return/response expectations and repeat-call 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 coverage is 100%, so baseline is 3, but the description genuinely adds meaning: 'minus any the person says are not part of it' explains the role of `except` as a subtractive filter, 'every waiting row, or one rule's rows' explains `rule_id` scoping, and 'The reason is their confirmation' tells the agent what `reason` should contain.
Input schemas describe structure but not intent. Descriptions should explain 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 (confirm/accept) and resource (rows suggested by standing rules), and scopes it as 'every waiting row, or one rule's rows'. The phrasing 'what standing rules suggest' is indirect rather than saying 'pending rule suggestions', but an agent can still distinguish it from purch_rules (which lists suggestions) 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 a clear precondition — 'Show them the rows first (purch_rules lists each rule with the rows it is suggesting for)' — routing the agent to the sibling that surfaces what would be accepted, plus a hard usage constraint: 'never the rule alone', i.e. only after human confirmation. No explicit when-not-to-use case or named alternative action (e.g. for rejecting rows) is given, 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.
purch_accountsAccountsARead-onlyIdempotentInspect
Every account with its balance (from its latest statement, a stated value, or its loan), as of when, and any gap or jump between its statements. With account_id: that one account whole, its statements in order and the values stated for it.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | The day. Defaults to today. ISO date, YYYY-MM-DD. | |
| account_id | No | One account, e.g. ACC-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior. The description adds substantive return behavior: balance source (latest statement, stated value, or loan), as-of timing, gaps/jumps between statements, and account_id expanding to ordered statements and stated values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences front-load the list behavior and then the account_id variation, with no filler. Phrasing like 'as of when' is slightly cryptic but compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, no output schema, and annotations covering safety, the description supplies enough return-shape detail for an agent to call it correctly. It could clarify list ordering and what 'gap or jump' means, but those are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and documents both optional parameters. The description adds meaning beyond the schema for account_id by explaining the single-account expansion and mentions balance 'as of' the as_of date, though it does not add date syntax.
Input schemas describe structure but not intent. Descriptions should explain 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 that it returns every account with its balance, how the balance is derived, as-of timing, and statement gaps; the conditional sentence clarifies the single-account mode. It is clear but does not differentiate from sibling tools such as rec_accounts or purch_net_worth.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 branch guidance: omit account_id to list accounts, supply it to get one account with its statements and stated values. It does not state when to use this versus related sibling tools or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_add_accountAdd accountAInspect
Add an account to the register: a bank or savings account, a credit card, a loan, or something with a value (a house, a car). Name it as its statements print it ("Chase Checking ending 4410"), so statements find it. Importing a statement for an account that is not here yet adds it by itself; add one by hand for a card or loan before its first statement, or for something that never has statements (a house, a car): give that its value with purch_record_value, from a source the person names. Effects: account added to the register.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What it is. | |
| name | Yes | As statements print it, e.g. "Visa ending 8827". | |
| last4 | No | Last four digits, as printed. | |
| notes | No | Anything the person said about it. | |
| currency | Yes | ISO 4217 code. | |
| opened_on | No | When it was opened, if known. ISO date, YYYY-MM-DD. | |
| institution | No | The bank or lender. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/safety profile (readOnly=false, idempotent=false, destructive=false), so the bar is lower; the description adds real context by stating the terminal effect ('account added to the register') and by disclosing the auto-creation overlap with statement import. It doesn't say what happens on a duplicate name, which is the one behavioral gap for a non-idempotent add.
Agents need to know what a tool does to the 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 kind list are front-loaded, and the import/record_value routing follows in a single dense sentence. Some clauses (the house/car parenthetical repeated twice) are mildly redundant, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation with no output schema, the description covers purpose, naming, the import overlap, and the asset-value follow-up. It leaves duplicate-name behavior unstated, which is the main thing an agent would still need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining the rationale behind the `name` convention ('so statements find it'), which tells the agent why matching statement text matters, not just the format. The kind enumeration also maps onto the enum in plain language.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Add an account to the register') and immediately enumerates the account kinds covered, so an agent can distinguish it from purch_update_account, purch_import_statement, and crm_add_account. The scope statement is concrete enough to route on without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the alternative path: importing a statement auto-creates a missing account, so hand-adding is only needed for a card/loan before its first statement or for a non-statement asset. It also names the follow-on tool (purch_record_value) and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_add_billAdd a billAInspect
Record a bill a vendor sent: who, their number, the dates, the amount. It waits for a person to approve paying it; nothing is paid from here. You were handed a vendor's invoice (a PDF, a photo, an email). Record what it says: the vendor's name, their invoice number, the bill date, the due date (or the days they give), the amount and currency as printed, and the category in the person's words. Never invent a number or a date; empty beats guessed. The same vendor and number is refused a second time, so a bill forwarded twice is caught. Then tell the person it is waiting for their approval: only a person approves paying a bill (purch_approve_bill), and the payment itself happens in their bank. purch_payables shows what is coming due against the cash on their latest statement. Effects: bill recorded, waiting for approval.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | The total due, as printed. In cents (integer minor units) — 1250 means $12.50. | |
| number | No | The vendor's own invoice number, as printed. | |
| reason | No | Where it came from: "emailed by Acme on the 3rd". | |
| vendor | Yes | The vendor's name as a person would say it (Acme Supply). | |
| category | No | What it is for, in the person's words (supplies, contractor, rent). | |
| currency | No | ISO 4217, as printed. Defaults to the company currency. | |
| due_date | No | When it is due, as printed. ISO date, YYYY-MM-DD. | |
| bill_date | Yes | The date on the bill. ISO date, YYYY-MM-DD. | |
| file_hash | No | A hash of that file, if you have one. | |
| file_name | No | The file you were handed, for the record. The file itself stays with the person. | |
| terms_days | No | Or the days the bill gives (30 for net 30), when it prints no due date. | |
| description | No | A line about it, if the bill has one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the dedupe rule ('the same vendor and number is refused a second time'), the approval lifecycle, and the preservation rule ('Never invent a number or a date; empty beats guessed'). It closes with an explicit effects statement. These are behaviors an agent could not infer from readOnlyHint=false/idempotentHint=false alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then extraction guidance, then workflow routing. Slightly long and the closing 'Effects: bill recorded, waiting for approval' restates the earlier approval sentence, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 params, no output schema, and mutation annotations, the description covers what to extract, what happens on success, duplicate handling, and who approves next. It stops short of saying how to recover from a rejected duplicate or what the created bill's identifier looks like, which matters without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds genuine guidance on how to fill fields — vendor name 'as a person would say it', amount and currency 'as printed', category 'in the person's words', and bill date vs due date vs terms_days. That is more than restating 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 and resource: 'Record a bill a vendor sent: who, their number, the dates, the amount,' and it explicitly bounds scope with 'nothing is paid from here.' It does not, however, address the near-identical sibling p2p_record_vendor_bill (PO-matched vendor bills), leaving an agent to guess between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit triggering situation ('You were handed a vendor's invoice (a PDF, a photo, an email)') and rules out the wrong expectation ('nothing is paid from here'), pointing to purch_approve_bill for approval, the bank for payment, and purch_payables for cash-against-due.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_add_receiptAdd receiptAInspect
Record a receipt you read: vendor, date, total, and the file's name and hash. Candidates to match come back; matching is a separate act. The file stays with the person (P-9); this keeps what it says. HAND OVER THE LINES TOO when the receipt prints them, tax as its own line: they must add up to the total, and that check is what catches a misread digit in a photo, the same way a statement's printed balances catch a misread row. If the lines do not add up, the receipt is refused and you look again; never adjust a number to make it fit. Then look at the candidates and match with purch_match_receipt, with a reason. An unmatched receipt is a visible state, not an error. Effects: receipt recorded, unmatched.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Receipt date. ISO date, YYYY-MM-DD. | |
| hash | Yes | Content hash, or a stable id you can repeat. | |
| name | Yes | File name as given. | |
| note | No | ||
| lines | No | The lines on the receipt, when it prints them. They must add up to the total, tax included as its own line: that is how a misread digit is caught. | |
| total | Yes | The total on the receipt, positive. In cents (integer minor units) — 1250 means $12.50. | |
| vendor | No | The shop as printed on the receipt. | |
| currency | Yes | ISO 4217 code. | |
| return_by | No | The last day to return it, when the receipt prints one. ISO date, YYYY-MM-DD. | |
| warranty_until | No | When the warranty ends, when the receipt or the box states it. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description adds real behavior beyond that: the file is not moved ("The file stays with the person (P-9); this keeps what it says"), the lines must sum to the total or "the receipt is refused," and the resulting state is stated outright ("Effects: receipt recorded, unmatched"). That is exactly the kind of failure-mode disclosure 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?
Front-loaded with the core action and the fields, then the line-sum rule, then the handoff to matching, then effects — a sensible order with little filler. It loses a point for the shouty "HAND OVER THE LINES TOO" and the opaque internal reference "(P-9)", which cost tokens without informing an outside agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 10-parameter mutation with no output schema, the description covers what gets created, what comes back (candidate matches), the validation failure path, and the required next step. The main remaining gap is the optional fields — nothing tells the agent when to populate return_by, warranty_until or note, leaving the agent to guess from terse schema strings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 90%, so the schema documents date, hash, total, currency and the rest; the description earns credit for adding the validation rule that governs the lines/total relationship and the rationale (catching a misread digit), which the schema only states in summary form. It does not clarify the optional fields (return_by, warranty_until, note) or when to supply them, so it falls short of 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 ("Record a receipt you read") and immediately enumerates the fields it captures (vendor, date, total, file name and hash). It also names the boundary against its sibling: "Candidates to match come back; matching is a separate act," so an agent can distinguish this from purch_match_receipt 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 an explicit sequence: record here first, then "look at the candidates and match with purch_match_receipt, with a reason." It also sets an exclusion/edge case — "An unmatched receipt is a visible state, not an error" — and a hard constraint ("never adjust a number to make it fit") that prevents a foreseeable misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_add_ruleAdd standing ruleAInspect
Remember something ahead of time ("the next five days are the Texas conference, book it to travel"): matching rows get a suggested category until someone reviews them. When the person tells you about spending before it shows up on a statement (a trip, an event, a project, "everything from this shop is office supplies"), record it as a standing rule. Turn relative dates into real ones from today ("the next five days" from 2026-10-05 is 2026-10-05 to 2026-10-09) and say them back. A rule needs a window, words the statement line will contain, or a vendor; the category is the person's word. A rule SUGGESTS: it never books a row. Rows it matches show the suggestion and stay unreviewed until the person confirms them, in review or with purch_accept_suggestions. Effects: rule recorded; matching unreviewed rows carry its suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day it applies, inclusive. ISO date, YYYY-MM-DD. | |
| from | No | First day it applies. ISO date, YYYY-MM-DD. | |
| label | Yes | The person's name for it: "Texas conference", "Q4 office move". | |
| match | No | Words the statement line contains, any case (UBER, MARRIOTT). Optional. | |
| reason | No | What the person said, in their words. | |
| status | No | What matching rows are suggested as. Defaults to purchase. | |
| vendor | No | Only rows already named to this vendor. Optional. | |
| category | Yes | The category matching rows are suggested as, in the person's words (travel, office supplies). | |
| currency | No | Only rows in this currency (ISO 4217). Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety envelope (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description goes well beyond them with a non-obvious state effect: "A rule SUGGESTS: it never books a row" and matched rows "stay unreviewed until the person confirms them", plus an explicit Effects block. For a non-idempotent write, the "never books / stays unreviewed" side-effect profile is exactly the context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Intent and the when-to-use trigger are front-loaded, then constraints, then the Effects line — good ordering with no filler. It is on the long side, with the date-conversion example taking a full sentence, but each sentence contributes a distinct rule the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter write tool with no output schema, the description covers the full picture: triggering situation, required inputs, date handling, the fact that the result is a suggestion rather than a booking, and the confirmation path. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description earns more by adding a cross-field constraint absent from the schema: "A rule needs a window, words the statement line will contain, or a vendor" (from/to, match, vendor are all optional individually). The date-normalization instruction ("the next five days" from 2026-10-05 is 2026-10-05 to 2026-10-09) adds real semantics for from/to beyond "ISO date, YYYY-MM-DD".
Input schemas describe structure but not intent. Descriptions should explain 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 concrete verb-and-resource framing ("record it as a standing rule" / "remember something ahead of time") with two worked examples (Texas conference, shop supplies), so the agent knows this creates a forward-looking matching rule, not a transaction edit. It implicitly contrasts with purch_accept_suggestions (the confirming action) but never names purch_end_rule or purch_rules as the sibling pair, 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?
It states exactly when to call it: "When the person tells you about spending before it shows up on a statement (a trip, an event, a project...)". It also hands off the alternative path explicitly: matched rows are confirmed "in review or with purch_accept_suggestions", which tells the agent what this tool must not be used to do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_approve_billApprove paymentAInspect
A person approves paying a bill, optionally by a date. Approval is not payment: the money moves in their bank. HUMAN-ONLY: this act is refused to you whatever your role — Approving a payment is a person's decision about their own money. Ask your human to do it. Refused to you whatever your role. Show the person the bill and what is due around it (purch_payables), and let them approve it in the app. Effects: bill approved for payment.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Anything about it ("pay after the client's payment lands"). | |
| pay_by | No | When to pay it by. Defaults to its due date. ISO date, YYYY-MM-DD. | |
| bill_id | Yes | The bill, e.g. B-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: annotations only say readOnlyHint=false and destructiveHint=false, while the description discloses the authorization model (refused to the agent regardless of role), the real-world consequence ('money moves in their bank'), and the resulting state ('bill approved for payment'). It also makes clear the bill is not yet paid, which prevents a costly misinterpretation.
Agents need to know what a tool does to the 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 meaning and the refusal, which is the right order. It loses a point for redundancy: 'refused to you whatever your role' is stated twice in near-identical wording, which is wasted space in a short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a human-only, three-parameter mutation with no output schema, this gives the agent everything it needs: what the action means, that it must not perform it, and the exact fallback (show purch_payables, ask the human). Nothing required to call or correctly avoid the 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?
Schema description coverage is 100%, so bill_id, pay_by, and note are already documented with examples and formats. The description only echoes the optional pay-by date and adds nothing about format or defaults beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('a person approves paying a bill'), names the optional parameter (pay by a date), and explicitly distinguishes the act from payment ('Approval is not payment: the money moves in their bank'). That distinction separates it from purch_record_bill_payment without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says who may use it and who may not ('HUMAN-ONLY: this act is refused to you whatever your role'), then names the correct alternative workflow: show the bill via purch_payables and let the person approve in the app. There is no ambiguity about when to call this versus defer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_billsBillsARead-onlyIdempotentInspect
Bills on record: open ones waiting for approval first, then approved, paid and rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only this status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and non-openWorld, so the safety profile is covered. The description adds genuine behavioral value beyond them by disclosing the default result ordering (open/pending-approval first, then approved, paid, rejected), which tells the agent what a no-parameter call returns. It omits pagination, result volume and any indication of record 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?
A single sentence with zero filler; the resource and its default ordering are front-loaded in one clause. Nothing could be removed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter, read-only list tool with full annotations, the definition covers purpose and default ordering adequately. Since there is no output schema, the description would ideally hint at what a bill record contains, but that gap is minor for a simple enumerating 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 enum parameter is already documented, so the baseline is 3. The description earns an extra point by glossing "open" as "waiting for approval" and by enumerating the status sequence, clarifying enum semantics and the default unfiltered behavior beyond the schema's terse "Only this status."
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Bills on record" identifies the resource and implies a read/list operation, and the ordering clause (open first, then approved, paid, rejected) hints at the default sort. However no explicit verb is used and nothing distinguishes it from siblings such as purch_get_bill, purch_payables or purch_upcoming, so an agent must still infer when this is the right retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to use this versus alternatives (purch_get_bill for a single bill, purch_payables, purch_upcoming) and gives no prerequisites or exclusions. Usage is only implied by the noun phrase itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_bill_seriesExpected billsARead-onlyIdempotentInspect
Each bill that comes every period: its usual amount from its own history, when the next is expected, whether one is missing or unusually high, and autopay. With series_id: that one with its bills.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ISO date, YYYY-MM-DD. | |
| series_id | No | One, e.g. BS-0001. |
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 usefully adds that values are derived analytics (usual amount 'from its own history', missing/unusually-high detection, autopay), but it omits how as_of affects those computations and whether results are paginated or time-bounded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the single-series case is called out last as a modifier. The first sentence is a run-on enumeration of outputs rather than a front-loaded statement of what the tool does, which slightly weakens orientation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 wisely enumerates the returned fields (usual amount, next expected, missing/unusually-high, autopay), which is most of what an agent needs. The remaining gap is as_of semantics and any boundary/pagination behaviour, on an otherwise simple read-only two-parameter 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% but both schema entries are thin ('One, e.g. BS-0001.', 'ISO date, YYYY-MM-DD.'). The description adds real meaning for series_id (returns that series together with its bills), yet as_of — the evaluation date that drives 'next expected' and anomaly flags — is left unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain 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 concrete resource — recurring period bills (series), with their historical usual amount, next expected date, missing/anomaly flags and autopay status. It is clear what data the tool surfaces, but it never states the operation in a verb ('list'/'get') and does not distinguish itself from neighbours like purch_subscriptions or purch_upcoming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'With series_id: that one with its bills' gives one conditional usage cue (narrow scope to a single series when you have an id). There is no guidance on when to choose this over purch_upcoming, purch_subscriptions, or purch_bills, and no statement of preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_cancel_subscriptionCancel subscriptionADestructiveInspect
Record that a subscription was cancelled, with a reason. Periods after the cancellation are no longer expected. Cancelled is a fact the person states, not something the module infers: a subscription that stops charging shows as lapsed on its own, and stays that way until the person says it was cancelled. Record when, if they know, in the reason. Effects: subscription cancelled.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why, and when if you know. | |
| subscription_id | Yes | The subscription, e.g. SUB-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false; the description adds real value by disclosing the downstream effect that future periods are no longer expected and framing the reason field as the place to capture timing. It stops short of saying whether cancellation is reversible, which is a notable gap for a destructive, non-idempotent 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?
Front-loaded with the action and the key semantic distinction, then effects. The trailing 'Effects: subscription cancelled.' largely restates the opening sentence and is close to wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-param mutation with rich annotations and no output schema, the description covers purpose, the fact-vs-inference rule, and downstream effect. The main missing piece is reversibility/undo path, which matters given destructive=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both params. The description says to record when in the reason, matching the schema's own 'Why, and when if you know' — marginal added value over structured data. 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 ('Record that a subscription was cancelled') and immediately contrasts with the automatic 'lapsed' state, which differentiates it from inference-driven sibling behavior like purch_subscriptions or purch_declare_subscription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not guidance: only record when the person states cancellation, not when charging merely stops. It does not name a specific sibling tool as the alternative, but the semantic boundary (fact vs. inferred lapse) is clear enough to route an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_card_costsInterest and feesBRead-onlyIdempotentInspect
Interest and fees per card for a year, from the rows reviewed as fees.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | e.g. 2026. Defaults to this 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 a closed-world scope, so safety is covered. The description adds one genuinely useful behavioral fact — the figures are derived only from rows already reviewed/categorized as fees — which tells the agent the output depends on prior categorization work. It says nothing about units, currency, or whether cards with no fees appear.
Agents need to know what a tool does to the 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 sentence with the resource and scope front-loaded and no filler. It is arguably too terse rather than bloated, which is a completeness issue rather than a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 carry the return shape, and it only partially does: it implies a per-card annual figure but not whether the result is a list, what fields each card carries, or how interest is separated from fees. For a read-only aggregation tool this is workable but leaves the agent guessing about 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% and the single optional 'year' parameter is fully documented in the schema, including its default. The description's 'for a year' merely echoes that. Baseline 3 applies since 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 resource and scope: interest and fees, broken out per card, for a given year. An agent can tell it is an aggregation/report tool rather than a transaction lister. It does not, however, distinguish itself from the close sibling purch_card_dues, which an agent would have to disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to use this versus purch_card_dues, purch_spend, purch_year, or purch_purchases. The only guidance-like content ('from the rows reviewed as fees') describes data provenance, not selection criteria. An agent must guess from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_card_duesCard payments dueBRead-onlyIdempotentInspect
Each card: its latest statement balance, minimum and due date, the payments seen toward it, and whether it is paid in full, minimum paid, due, or missed.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | The day. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent, read-only, closed-world lookup. The description adds real value beyond that by spelling out the status taxonomy (paid in full / minimum paid / due / missed), but it does not say that these statuses are derived from imported statements and payments, so the agent cannot judge how complete or trustworthy the result is when coverage is 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?
A single tight sentence that front-loads the per-card framing and lists content in priority order. It is efficient, though the missing leading verb makes it read as a field legend rather than a statement of action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only report with a fully documented single parameter and no output schema, the description does the essential job of describing the returned fields. What is missing is the relationship to the surrounding card tools and any note on data provenance (statement imports), which matters for interpreting 'due' and 'missed'.
Complex tools with many parameters or behaviors need more documentation. 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 parameter as_of is fully documented in the schema (ISO date, defaults to today). The description adds nothing about as_of semantics, so the baseline 3 applies — 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?
The description enumerates exactly what the tool yields per card: latest statement balance, minimum, due date, payments applied, and the paid/minimum/due/missed status. That makes the resource and output content unmistakable, though the sentence is a noun phrase with no verb and does not distinguish it from near neighbours such as purch_card_costs or purch_upcoming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 call this versus alternatives — not purch_card_costs (cost/spend view), purch_set_autopay or purch_set_card_facts (configuration), or purch_upcoming (forward-looking obligations). The agent must infer usage purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_close_accountClose accountAInspect
Mark an account closed from a day, with a reason. It stays in the register and its statements stay; it leaves net worth from that day. Only when the person says it is closed. A closing balance that is not zero is named in the result, not refused: that money went somewhere worth recording. Effects: account closed from a day.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why, for the record. | |
| closed_on | Yes | The day it closed. ISO date, YYYY-MM-DD. | |
| account_id | Yes | The account. An existing purch_account id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely non-obvious behavior beyond the annotations: the account stays in the register, statements survive, and it only leaves net worth from the given day — clarifying what destructiveHint=false means in practice. It also discloses the edge case that a non-zero closing balance is reported rather than refused. Missing: what a re-close does (idempotentHint=false) and whether closure can be reversed.
Agents need to know what a tool does to the 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 guardrail are front-loaded in the first two short paragraphs. The trailing 'Effects: account closed from a day.' restates the opening sentence and adds no information, which is the only waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the note that a non-zero closing balance 'is named in the result' gives the agent a useful hint about the response. Combined with the preservation/net-worth effects, an agent has enough to call it correctly; only idempotency and reversal behavior remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each of the three parameters is described there, so the baseline is 3. The description adds one real semantic point — that closed_on is the day from which net worth excludes the account — but adds nothing for reason or account_id 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?
Starts with a specific verb+resource: 'Mark an account closed from a day, with a reason.' That is clearly distinct from the account-editing siblings (purch_update_account, crm_set_account_status). It does not name those siblings explicitly, 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?
'Only when the person says it is closed' supplies a hard precondition that prevents an agent from closing accounts unprompted — a real usage constraint rather than an implied one. It does not point at the alternative (e.g. purch_update_account for non-closure edits), so no explicit when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_declare_bill_seriesExpect a billAInspect
Say a vendor's bill comes every period (the electric bill, the phone, insurance), so a missing one, or one well above the usual amount, is named. When the person says a bill comes regularly, declare it once: the vendor as they say it, how often, the category, and the usual amount if they know it. Its bills are then the vendor's bills on record; the usual amount comes from them once there are a few. Never guess a usual amount. Effects: bill expected every period from this vendor.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | What the person said. | |
| vendor | Yes | The vendor, as the person says it. | |
| cadence | Yes | How often it comes. | |
| due_day | No | The day of the month it is usually due, if the person says. | |
| category | No | What it is for, in the person's words. | |
| currency | No | ISO 4217 code; the default currency when left out. | |
| typical_amount | No | What it usually is, if the person says. In cents (integer minor units) — 1250 means $12.50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the write/read/destructive profile, and the description adds behavior the annotations cannot: declaring sets up an ongoing expectation whose usual amount is learned from recorded bills later, plus a hard rule not to fabricate a typical amount. "Declare it once" is consistent with, not contradictory to, idempotentHint=false — it warns about duplicates rather than promising deduplication.
Agents need to know what a tool does to the 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 trigger and scoped tightly to one action; the parenthetical examples and "Never guess a usual amount" both do real work. Some phrasing is folksy and redundant ("a missing one, or one well above the usual amount, is named"), costing a bit of crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, 2-required mutation with annotations but no output schema, the description covers the trigger, the effect, the amount-learning behavior, and the anti-guessing rule. The only omission — how to undo or terminate a series — is handled by the clearly named sibling purch_end_bill_series.
Complex tools with many parameters or behaviors need more documentation. 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, including the cents convention for typical_amount and the cadence enum. The description restates the same fields in prose (vendor as spoken, cadence, category, typical amount) and adds only the "never guess" constraint, so it earns the baseline rather than more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action — declaring that a vendor's bill arrives on a recurring cadence — with concrete examples (electric, phone, insurance) and the downstream meaning (missing or unusually large bills get flagged). It is clearly distinct from recording an actual bill, though it never names its closest sibling purch_add_bill or purch_declare_subscription to sharpen 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 an explicit trigger ("When the person says a bill comes regularly") and a discipline constraint ("declare it once", "Never guess a usual amount"). It lacks an explicit negative case or pointer to alternatives such as purch_add_bill for one-off bills or purch_declare_subscription for subscriptions, which is where the real ambiguity with siblings lives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_declare_subscriptionDeclare subscriptionAInspect
Declare a recurring charge from one you have seen. The record then confirms it period by period. Declared, then confirmed (P-6): every period from the start date is matched against the vendor's charges within a tolerance; a period with none shows as missed, two in a row make it lapsed. Never declare one the person has not confirmed exists. Effects: subscription declared active.
| Name | Required | Description | Default |
|---|---|---|---|
| start | No | First expected charge. Defaults to the earliest matching charge on record, else today. ISO date, YYYY-MM-DD. | |
| amount | Yes | Expected charge, positive. In cents (integer minor units) — 1250 means $12.50. | |
| reason | No | Why — part of the record. | |
| vendor | Yes | The vendor's proper name; created if new. | |
| cadence | Yes | How often it charges. | |
| currency | Yes | ISO 4217 code. | |
| tolerance_bp | No | How far a charge may drift and still count, in basis points. Default 1000 (10%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, non-read-only, non-idempotent, closed-world mutation, so the safety profile is covered. The description adds genuine substance beyond that: the period-by-period matching lifecycle, the tolerance rule, the missed/lapsed escalation, and the terminal effect ('subscription declared active'). It stops short of saying what happens on duplicate declaration or how to undo it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, the lifecycle explanation is compressed into one line, and the effect line is clearly separated. The '(P-6)' reference and the phrase 'from one you have seen' are slightly opaque, but 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 seven fully documented parameters and no output schema, the description covers the mutation's consequence and its ongoing matching semantics, which is most of what an agent needs. The remaining gap is duplicate/already-exists handling, notable given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter carries a description, so the baseline applies. The description only loosely reinforces tolerance semantics ('within a tolerance') without adding format or default detail that the schema doesn't already supply.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Declare a recurring charge') and scopes it to charges the agent has already observed ('from one you have seen'). It doesn't name any sibling (e.g. purch_subscriptions, purch_declare_bill_series, purch_get_subscription), so the agent must infer which subscription tool to pick, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit prohibition: 'Never declare one the person has not confirmed exists,' which is a real when-not condition. What's missing is routing to alternatives — nothing tells the agent whether to use purch_declare_bill_series or purch_subscriptions instead, or what to do if the subscription already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_discard_sourceDiscard statementAInspect
Throw out one imported statement and every row that came from it, with a reason, so it can be re-read and imported again. A wrong row means a wrong source (P-2): rows are never edited, the statement is discarded and imported again from a fresh read. Receipts matched to its rows go back to unmatched and are listed; vendors, aliases and subscriptions stay — they are the person's words, not the statement's. The hash is free again afterwards. Owner's act, on the record. Effects: source and its transactions deleted; matched receipts unmatched; hash free to import again.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why — a misread column, the wrong file, a re-read. | |
| source_id | Yes | The statement, e.g. SRC-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contributes a lot that annotations do not: what is destroyed (source + its transactions), what is preserved (vendors, aliases, subscriptions — "the person's words"), what is side-effected (receipts unmatch and are listed), and what is freed (the hash). However, "source and its transactions deleted" directly conflicts with destructiveHint=false, and an agent reading the annotation alone would be misled about the operation's weight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequence, and mostly dense. The closing "Effects:" line restates material already given ("the hash is free again afterwards" / "hash free to import again"), and shorthand like "(P-2)" and "Owner's act" carries little meaning for an outside agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation tool with no output schema, the description covers the important unknowns: reversibility, what survives, and the re-import path. It stops short of stating the permission/authority check implied by "Owner's act" or what the listed unmatched receipts look like in 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 coverage is 100%, so both parameters are already documented with examples ("SRC-0001", "a misread column, the wrong file, a re-read"). The description adds only the framing that the reason is recorded ("on the record"), which is marginal above 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?
The first sentence names a specific verb and resource ("throw out one imported statement and every row that came from it, with a reason") plus the intent behind it ("so it can be re-read and imported again"). That is enough to separate it from purch_import_statement, purch_get_transaction and pros_discard_pull without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The P-2 policy sentence gives the agent the decision rule: a wrong row means a wrong source, so rows are never edited; the statement is discarded and re-imported from a fresh read. It never names an explicit alternative tool or a "do not use this when" exclusion, which is why 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.
purch_end_bill_seriesStop expectingAInspect
Stop expecting a vendor's bill (moved, cancelled, switched provider), with a reason. Its bills stay on record. Only when the person says the bill has stopped. Autopay ends with it. Effects: bill no longer expected; autopay ended.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it stopped. | |
| series_id | Yes | e.g. BS-0001. An existing purch_bill_series id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructiveHint=false, idempotentHint=false), and the description adds genuinely useful context beyond them: the bill history is retained, autopay is terminated as a side effect, and the bill is removed from expectations. It doesn't cover reversibility or failure behavior, but it clears the bar set by the existing 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 and short, with the gating condition early. Minor redundancy: 'Autopay ends with it' is restated in 'Effects: … autopay ended', slightly denting efficiency but not readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 mutation tool with full annotations and no output schema, the description supplies the essential facts: retained history, autopay termination, and the precondition. Only irreversibility/reinstatement and permission requirements are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with two required parameters, and the schema already documents series_id format and reason. The description only echoes 'with a reason' and adds nothing about the series_id or what a valid reason looks like, 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 action – ending the expectation of a recurring vendor bill series – and the parenthetical '(moved, cancelled, switched provider)' plus 'Its bills stay on record' make the effect explicit. It is distinguishable from siblings like purch_declare_bill_series or purch_cancel_subscription by focus on the expectation, though it never names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Only when the person says the bill has stopped' gives a clear gating condition for use, which is more than most tools offer. However, there is no explicit routing away from near-neighbours such as purch_declare_bill_series, purch_cancel_subscription, or purch_end_rule, so the agent must infer when this is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_end_ruleEnd ruleAInspect
Stop a standing rule. Its suggestions go away; rows already reviewed keep what the person confirmed. End a rule when the person says it no longer holds, or when it was recorded wrong (then add the right one). Ending never changes a reviewed row. Effects: rule ended; its suggestions removed from unreviewed rows.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it ends. | |
| rule_id | Yes | The rule, e.g. RL-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains exactly what happens: the rule ends, suggestions disappear from unreviewed rows, and reviewed rows keep their confirmed values. That closely matches the rubric's credit for saying what gets destroyed and what stays intact. The removal is scoped to unreviewed suggestions and explicitly does not change reviewed rows, so it does not contradict destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and compact, with the purpose first and effects close behind. However, the final 'Effects' sentence largely repeats the first two sentences, and 'Ending never changes a reviewed row' repeats the earlier reviewed-row guarantee.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no output schema and strong annotations, the description covers purpose, usage triggers, and side effects well. It does not describe the response, error cases, or behavior on an already-ended rule, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds context about why a rule might end, which indirectly informs the reason field, but it does not add syntax or format details beyond the schema. This fits the baseline 3 for high 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 gives a specific verb and resource: 'Stop a standing rule.' It also clarifies the effect on suggestions and reviewed rows, clearly separating ending a rule from adding one. It does not explicitly name sibling tools such as purch_add_rule, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear triggers: end a rule when the person says it no longer holds, or when it was recorded wrong. It also points toward adding the correct rule in the mistaken-record case. It does not explicitly name the sibling add/get/list tools or give broader exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_get_billBillBRead-onlyIdempotentInspect
One bill with its approval and payment.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | e.g. B-0001. |
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 value by noting that the result includes approval and payment information, but it does not describe error behavior or the exact shape of the returned bill data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence fragment with no wasted words. It is efficient, though its terseness leaves some details unstated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 getter with one fully documented parameter, the description gives the essential idea of what is returned. However, with no output schema, it could say more about what 'approval and payment' includes or what happens when the bill is not found.
Complex tools with many parameters or behaviors need more documentation. 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%: the single bill_id parameter is already documented in the schema with an example format. The description does not add further 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 clearly identifies the resource as a single bill and adds scope by saying it includes its approval and payment. It implicitly contrasts with list-oriented siblings like purch_bills, though it does not explicitly name an 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 explicit guidance on when to use this tool versus purch_bills, purch_get_transaction, or related bill tools. Usage is only inferable from the tool name and the fact that it returns one bill.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_get_receiptReceiptCRead-onlyIdempotentInspect
One receipt and, if unmatched, its candidate rows.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id | Yes | e.g. R-0003. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorldHint=false, so the safety profile is covered. The description's one genuine contribution is disclosing that the response may include candidate rows when the receipt is unmatched — helpful return-shape context, though it says nothing about how matching state is determined or what a candidate row 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?
One short, front-loaded sentence with no filler. Its brevity is efficient rather than padded, though the missing verb costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 is the only source of return-value information, and it provides just the headline (receipt plus conditional candidate rows). That is enough to orient an agent but leaves the receipt's own fields and candidate structure unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
A single required receipt_id with full schema description coverage, so the schema does the work and a baseline 3 applies. The description adds no information about the identifier format or what happens if it is unknown.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"One receipt and, if unmatched, its candidate rows" identifies the resource (a single receipt) and hints at the return shape, but the verb is elided and the name alone carries most of the meaning. It is distinguishable from purch_receipts (plural list) only by the near-identical naming convention, not by anything the description says.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance is given. An agent must infer that this is the single-record fetch relative to purch_receipts, and nothing points to the related purch_match_receipt / purch_unmatch_receipt actions that consume the candidate rows mentioned here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_get_ruleStanding ruleCRead-onlyIdempotentInspect
One rule with the unreviewed rows it is suggesting for.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | e.g. RL-0001. |
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 one genuine behavioral fact beyond them: the payload includes the unreviewed rows the rule is suggesting, which hints at the intended review flow. It says nothing about what happens for an unknown or already-ended rule_id, nor about row volume.
Agents need to know what a tool does to the 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 clause with zero padding, which is good, but it is a sentence fragment rather than a front-loaded statement, and a verb would cost a single word while removing real ambiguity. Brevity here shades into under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only lookup with full annotation coverage and a 100%-described schema, the description covers the essentials. With no output schema, however, the return shape rests entirely on the phrase 'with the unreviewed rows', which leaves the agent guessing at field structure and whether accepted suggestions drop out of 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% and the schema already gives the format hint 'e.g. RL-0001', so the single parameter is adequately documented. The description adds no further meaning about rule_id (e.g. that it must reference an active rule), which is the baseline-3 outcome 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?
The phrase 'One rule with the unreviewed rows it is suggesting for' identifies the resource (a single standing rule) and what is bundled with it (pending suggested rows), so the gist is recoverable. But it is a noun fragment with no verb ('get'/'fetch'), and it draws no line against purch_rules, purch_accept_suggestions, or purch_review_batch, so an agent must infer that this is the single-item lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to call this versus purch_rules (list) or purch_accept_suggestions (act on the suggestions this tool returns). The natural workflow — fetch the rule to inspect proposed rows before accepting — is nowhere stated, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_get_subscriptionSubscriptionBRead-onlyIdempotentInspect
One subscription with every period matched or missed.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | Evaluate as of this date. ISO date, YYYY-MM-DD. | |
| subscription_id | Yes | e.g. SUB-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since comprehensive annotations like readOnlyHint and destructiveHint are present, the description does not need to detail safety. The description focuses on the content of the result (matched/missed periods), which provides functional context but no deep operational behavioral traits like rate limits or complex authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is extremely concise and uses a single, highly effective sentence that immediately communicates the core value of the tool. There is no unnecessary 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?
Given that the tool is read-only and provides a specific status check, the description provides enough context regarding what data it will return. It is complete enough for an agent to confidently choose it when the user asks about matching or missed subscription periods.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% coverage in the input schema, the schema provides sufficient documentation for both the subscription_id format and the as_of date format. The description offers no additional semantic meaning beyond what is structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies that the tool provides information regarding a subscription's status concerning matched or missed periods, which is specific to subscription status. However, it does not formally state it is a 'retrieval' or 'lookup' function, lacking the standard functional phrasing found in other tool definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this specific tool versus other subscription-related functions, such as listing all subscriptions or retrieving general billing details. It makes no comparative guidance to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_get_transactionTransactionCRead-onlyIdempotentInspect
One row: provenance, review, vendor, receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | e.g. T-0012. |
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's only added behavior context is that the response is exactly one row containing provenance, review, vendor, and receipt sections, which is useful but thinly expressed.
Agents need to know what a tool does to the 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 short with no wasted words and front-loads the most important fact (one row). However, the telegraphic fragment style crosses from concise into under-specified, since the listed nouns ("review", "provenance") are not self-explanatory.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-param read tool with rich annotations this could be nearly complete, but there is no output schema, so the description must explain what comes back — and a four-word fragment naming cryptic sections does not convey the return structure, ordering, or failure modes (e.g., unknown transaction id).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single required parameter at 100% schema description coverage (the schema even gives the format example "T-0012"), the schema carries parameter meaning. The description adds nothing about the transaction_id or how invalid ids behave, 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?
"One row" implies a single-record fetch, and the field list (provenance, review, vendor, receipt) hints at the resource shape, but the description is a noun-phrase fragment with no verb and no explicit statement that this retrieves a transaction by id. It does not differentiate itself from neighbors like purch_get_bill, purch_get_receipt, or the list tool purch_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 indication of when to call this versus purch_transactions (list) or the sibling single-record getters (purch_get_bill, purch_get_receipt), nor any prerequisite such as needing an existing transaction id. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_import_statementImport statementAInspect
Hand over one statement: the balances it prints and its lines as you were given them. Accepted whole, or refused with the gap named.
You were handed a file; this reads it. Pass the statement's lines in text
exactly as you have them, one row per line, and state the opening and closing balance the
statement PRINTS. That is the normal way, and the only way when you have the text: retyping
rows is where digits slip. The rows are read here; the batch is refused unless opening + rows
= closing, and the refusal names the gap (P-3). Never adjust a line to make it fit: re-read.
rows as typed fields exists for one case only: a statement you have no text for, a person
reading from paper. row_count is the count the statement prints, if it prints one; leave
it out otherwise. hash is computed from the text; pass one only with rows. The same
statement is refused a second time (P-4); rows already on record are skipped and listed back.
Nothing is categorised here; review follows.
Effects: source recorded; transactions recorded with provenance; duplicates skipped and listed.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | No | Only with rows: a content hash of the file, or a stable id the statement carries. With text the hash is computed here. | |
| kind | Yes | What kind of statement. | |
| name | Yes | File name as given. | |
| rows | No | Only when there is no text to pass: every row as typed fields, in the statement's order. | |
| text | No | The statement's lines exactly as you were given them, unchanged: one row per line, date first, amount last. A running-balance column after the amount is fine; dates without a year are fine. Header and footer lines are ignored. This is the normal way. | |
| apr_bp | No | Card statements: the purchase rate in basis points, as printed (2499 = 24.99%). | |
| account | No | The account label as printed (e.g. "Visa ending 4421"). Matched to the register by name; a new name adds the account. | |
| currency | Yes | ISO 4217 code of the statement. | |
| row_count | No | The number of rows the statement prints, if it prints one. Checked against the rows read; leave it out when the statement does not say. | |
| account_id | No | Or the account in the register this statement belongs to, e.g. ACC-0002. An existing purch_account id. | |
| period_end | Yes | Last day the statement covers. ISO date, YYYY-MM-DD. | |
| minimum_due | No | Card statements: the minimum payment due, as printed. In cents (integer minor units) — 1250 means $12.50. | |
| credit_limit | No | Card statements: the credit limit, as printed. In cents (integer minor units) — 1250 means $12.50. | |
| period_start | Yes | First day the statement covers. ISO date, YYYY-MM-DD. | |
| closing_balance | Yes | Closing balance as printed, signed. In cents (integer minor units) — 1250 means $12.50. | |
| opening_balance | Yes | Opening balance as printed, signed. In cents (integer minor units) — 1250 means $12.50. | |
| payment_due_date | No | Card statements: the payment due date, as printed. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description carries substantial behavioral detail beyond the annotations: the arithmetic validation (opening + rows = closing), the refusal that names the gap (P-3), duplicate statements refused a second time (P-4), rows already on record skipped and listed back, and an explicit effects list (source recorded, transactions recorded with provenance). With readOnlyHint=false and destructiveHint=false already declared, this adds real operational context rather than repeating it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core instruction is front-loaded and most sentences do work, but the prose is stylistically ornate ('Hand over one statement', 'retyping rows is where digits slip') and the bare codes P-3 and P-4 are introduced without explanation. Slightly tightened wording would carry the same payload in less 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?
For a 17-parameter mutation with no output schema, the description covers validation rules, failure modes, duplicate handling, and resulting side effects, which is what an agent needs to call it safely. What is missing is any statement of what comes back on success (a batch or source id) to bridge into review, and the opaque P-3/P-4 references are left for the agent 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 coverage is 100%, so a baseline of 3 would be defensible, but the description adds genuine meaning: `text` is the preferred input, `rows` is the paper-only fallback, `hash` is passed only with rows because it is computed from text, and `row_count` should be omitted when the statement does not print one. It also supplies the strong warning never to adjust a line to make it balance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the resource (one statement: printed balances plus its lines) and the outcome (accepted whole or refused with the gap named), which is specific enough to distinguish it from neighbouring purchase tools. It stops short of naming sibling tools, though 'Nothing is categorised here; review follows' points at the review step without naming purch_review_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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, explicit guidance on which input mode to use: `text` is 'the normal way, and the only way when you have the text', and `rows` 'exists for one case only'. That said, the guidance is entirely about choosing between its own parameters and says nothing about when to reach for this tool versus purch_add_receipt, purch_add_bill, or purch_review_batch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_link_refundLink a refundADestructiveInspect
Tie money back to the purchase it reverses. It takes back that much of the purchase's spending, in its category; it is not income. Read purch_refunds: money in that looks like money back from the same shop. Show the person and link with a reason. A refund is never more than what is left of the purchase after earlier refunds. Money back for something not on record stays income. Effects: refund row tied to its purchase; the purchase's spending reduced by it.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why they belong together: "returned the chair". | |
| refund_transaction_id | Yes | The money-in row. An existing purch_transaction id. | |
| purchase_transaction_id | Yes | The purchase it reverses. An existing purch_transaction id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: the refund row becomes tied to its purchase, and the purchase's spending is reduced by the refund amount rather than treated as income. It also discloses the running-balance limit after prior refunds, which an agent needs before invoking a modifying 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 purpose is front-loaded in the first sentence, followed by relevant limits, alternatives, and effects. There is minor redundancy between “takes back that much of the purchase's spending” and the final Effects sentence, but the overall length is justified by the constraints conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers purpose, effects, amount constraints, alternative review via purch_refunds, and the case where money back should remain income. No critical invocation context appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all three parameters clearly. The description reinforces that the refund is a money-in row and the purchase is the transaction being reversed, but it does not add substantial parameter-level detail beyond the schema and the refund-amount limit is more behavioral than parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain 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: tying a refund (money back) to the purchase it reverses. It distinguishes this from simply reading refunds by naming purch_refunds and clarifies that money back for something not on record stays income.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies when to link, when not to link (unrecorded money back stays income), and points to purch_refunds for identifying candidate refund rows. It also states the refund amount cannot exceed what remains of the purchase after earlier refunds, which is a clear usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_match_receiptMatch receiptAInspect
Tie a receipt to one transaction, with a reason. Refused when the total does not fit. One receipt, one transaction (P-7). Refused when the receipt total is not the row's amount or the dates are more than seven days apart — unless you pass override with a reason that says why (a split payment, a tip added at the till). Effects: receipt matched to transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why this row — part of the record. | |
| override | No | The total or date does not fit and the reason explains why. | |
| receipt_id | Yes | The receipt, e.g. R-0003. | |
| transaction_id | Yes | The row it belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-readonly, non-destructive, non-idempotent. The description goes well beyond by disclosing the two validation gates, the override path, and a concrete Effects line. The refusal semantics are exactly the behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then rules, then effects — no filler. The long em-dash sentence and the opaque '(P-7)' policy reference absorb a little space that could have been trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the 'Effects: receipt matched to transaction' line correctly covers the post-condition, and the validity rules are stated. It stops short of saying whether a match can later be undone or what is returned on refusal, but nothing critical 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 coverage is 100%, so the baseline would be 3; the description earns more by explaining what override actually overrides (total mismatch or >7-day date gap) and giving example reason content, which the schema's one-line 'Why this row' does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact verb and resource — 'Tie a receipt to one transaction' — plus the cardinality constraint (one receipt, one transaction). An agent can distinguish this from purch_unmatch_receipt and purch_link_refund without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It spells out the preconditions for success (total must equal the row amount, dates within seven days) and the escape hatch (pass override with an explanatory reason, e.g. split payment or till tip). It does not explicitly name the alternative tools, but the when-to-use/when-refused boundary is unusually explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_net_worthNet worthBRead-onlyIdempotentInspect
What is held less what is owed, per currency, on a day: each account's figure with its date and source; old figures named.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | The day. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, closed-world, non-destructive behavior, so the bar is lower; the description then adds non-trivial output semantics — per-currency grouping, per-account figures with date and source, and a flag that stale figures are named. That staleness disclosure is behavior an agent would otherwise not know since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with no filler, and the core definition is front-loaded. The trailing clause 'old figures named' is cryptic jargon that costs a little clarity, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only, single-optional-param tool this is close to sufficient, and it usefully sketches return contents in the absence of an output schema. However, 'old figures named' is never explained (no staleness threshold), and it doesn't say how accounts are classified as held vs owed or how currencies are 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% and the single as_of parameter is fully documented with default and ISO format, so baseline is 3. The description's 'on a day' restates the schema rather than adding syntax or edge-case 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 defines the computation precisely ('what is held less what is owed, per currency, on a day') and enumerates the per-account output (figure, date, source), which is far more specific than the bare title 'Net worth'. It lacks an explicit verb and never names a sibling, but no other tool in the large sibling list computes net worth, so it is distinguishable by topic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to use this over purch_accounts, purch_payables, or purch_spend, and no prerequisites or exclusions. Usage is only implied by the word 'per currency'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_pair_transferPair a transferAInspect
Tie the two sides of one move between your own accounts: the row where money left and the row where it arrived. Counted once, as neither spending nor income. Paying the card from checking shows twice: out of checking, into the card. Read purch_transfers for the suggested pairs (same amount, close in time, worded as a payment), show the person, and pair with a reason. The amounts must be exactly opposite and the accounts different; a pair is refused otherwise. A transfer to an account that has no statements here (a savings account kept elsewhere, an owner draw) is not a pair: review that row as a transfer naming where the money went. Effects: both rows reviewed as one transfer; the move counted once, between the two accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why they are one move. | |
| in_transaction_id | Yes | The row where it arrived, e.g. the card's payment row. An existing purch_transaction id. | |
| out_transaction_id | Yes | The row where money left, e.g. the checking row. An existing purch_transaction id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive mutation; the description goes further with an explicit 'Effects' line (both rows reviewed as one transfer, move counted once between the two accounts) and the refusal condition on mismatched amounts. It stops short of saying whether the pairing is reversible or pointing at purch_unpair_transfer as the undo, which would complete the 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?
Front-loaded with the core definition, then prerequisites, then the exception, then effects — a sensible order. Some sentences are wordier than needed ('a savings account kept elsewhere, an owner draw' parenthetical, the slightly tangled 'into the card' example), but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description carries the return burden via the 'Effects' sentence. For a 3-param mutation with annotations already covering safety flags, it supplies everything needed: preconditions, the upstream discovery tool, the edge-case routing, and the resulting state change.
Complex tools with many parameters or behaviors need more documentation. 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 semantics the schema does not: the two ids must be exactly opposite in amount and belong to different accounts, and that they represent paired movement between the caller's own accounts. The 'reason' parameter's purpose ('show the person... pair with a reason') is contextualized even though its schema description already exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Tie the two sides of one move between your own accounts: the row where money left and the row where it arrived.' This is unmistakably distinct from purch_transfers (suggestions), purch_review_transaction (single-row review), and purch_unpair_transfer (the inverse operation). The accounting consequence ('counted once, as neither spending nor income') further pins down intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 workflow: read purch_transfers for suggested pairs, show the person, then pair with a reason. Preconditions are stated as hard rules ('amounts must be exactly opposite and the accounts different; a pair is refused otherwise'). It also names the case where this tool is the WRONG choice — an account with no statements here is not a pair and should be handled as a transfer row naming the destination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_payablesWhat is coming dueBRead-onlyIdempotentInspect
Bills waiting to be paid by when they are due (overdue, next 7 days, next 30, later), set against the cash on the latest bank statements.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | Evaluate as of this date. Defaults to today. ISO 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, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: results are grouped into fixed due-date buckets and cross-referenced against cash on the latest bank statements. It stops short of saying what happens when no bank statements exist or how the buckets are ordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with no filler, and the core concept (bills due, bucketed by time) is front-loaded ahead of the cash comparison. It could be slightly tighter but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only source for return shape, and it only sketches it (time buckets plus a cash figure) without naming fields or units. The as_of parameter's effect on the evaluation is likewise unstated. Adequate to call correctly, thin for interpreting 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% for the single as_of parameter, including ISO format and the today default, so the schema does the heavy lifting. The description never mentions as_of or that the bucket boundaries shift with it, but baseline 3 applies given full 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?
States a specific resource and framing: bills awaiting payment bucketed by due window (overdue, 7, 30, later) and compared against cash on latest bank statements. That is far more than a restatement of the name. It does not, however, distinguish itself from close siblings like purch_upcoming or purch_bills, which an agent would need to choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement, no exclusions, and no named alternative. With purch_upcoming, purch_bills, and purch_card_dues in the sibling set, the agent is left to infer the distinction from the description alone, which never mentions them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_purchasesPurchasesCRead-onlyIdempotentInspect
Reviewed spending: by category, by month, by vendor, per currency.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | To date. ISO date, YYYY-MM-DD. | |
| from | No | From date. ISO date, YYYY-MM-DD. | |
| vendor | No | Only this vendor. | |
| category | No | Only this category. |
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, so the bar is lower. The description adds only the grouping dimensions and leaves unexplained what 'reviewed' means, how currency is handled, or what defaults apply.
Agents need to know what a tool does to the 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 single-line fragment is concise and front-loads the grouping dimensions, but it lacks an action verb and is too terse for an ambiguous reporting tool. It avoids waste but sacrifices clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 clarify the return shape, but it does not say whether the result is a transaction list or a summary, how date defaults work, or what 'reviewed' filters. An agent cannot reliably predict the output from this definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the four optional filters are already documented in the input schema. The description loosely echoes vendor and category and implies date/month handling, but adds no syntax, default, or combination semantics 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 identifies the subject as reviewed spending broken down by category, month, vendor, and currency, but it uses no explicit verb and does not make clear whether the tool returns individual purchases or an aggregated report. This vagueness makes it hard to distinguish from purch_spend or purch_transactions 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?
There is no guidance on when to use this tool versus alternatives such as purch_spend, purch_transactions, or purch_card_costs. No exclusions, prerequisites, or routing hints are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_receiptsReceiptsCRead-onlyIdempotentInspect
Receipts on record, matched or not.
| Name | Required | Description | Default |
|---|---|---|---|
| unmatched | No | Only unmatched ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only that matched and unmatched receipts are included, with no detail on ordering, pagination, scope limits, or what is 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?
The description is a single front-loaded sentence with no wasted words, but it is too fragmented and under-specified for its role. Brevity here comes at the cost of clarity rather than efficient communication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 list-style tool with one optional parameter and no output schema, the description is still too sparse. It does not clarify whether this returns full receipt records, summaries, or how it relates to purch_get_receipt.
Complex tools with many parameters or behaviors need more documentation. 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 unmatched parameter is already documented as 'Only unmatched ones.' The description does not add any semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (receipts) and a scope (matched or not), but it never states the action verb, such as listing or searching. It also does not distinguish this tool from siblings like purch_get_receipt or purch_unbilled_receipts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance on when to use this tool versus purch_get_receipt, purch_match_receipt, or purch_unbilled_receipts. The only implied usage is through the optional unmatched filter, leaving the agent to infer that this is the general receipts list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_record_bill_paymentRecord the paymentAInspect
Record that a bill was paid, after the fact: the day it went, how, and the statement row that shows it when there is one. Only after the person paid it, and only with the day it actually went. An agent records payments for approved bills only; a person recording one approves it in the same act. Link the statement row (transaction_id) when the payment is on an imported statement: the amount and currency must match and it must be money out. An unreviewed row is reviewed as the bill says (purchase, its category and vendor), because the bill is the person's word for what it was. Effects: bill marked paid; statement row linked and reviewed when given.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | How it was paid. | |
| bill_id | Yes | The bill, e.g. B-0001. | |
| paid_at | Yes | The day it was paid. ISO date, YYYY-MM-DD. | |
| reference | No | The bank's or the vendor's reference, if any. | |
| transaction_id | No | The statement row that shows the payment, e.g. T-0042. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (not readOnly, not destructive, not idempotent). The description adds real behavioral substance beyond that: the downstream effects ("bill marked paid; statement row linked and reviewed when given"), the permission model for agents vs. people, the validation invariants on transaction_id, and the fact that an unreviewed row is re-categorized from the bill's category and vendor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information and the ordering is sensible: what it does, the precondition, the linking rule, then the effects. The opening clause is slightly tangled ("the day it went, how, and the statement row that shows it when there is one") and the after-the-fact idea is stated twice, but 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 non-idempotent write tool with no output schema, the description covers the critical unknowns: preconditions, validation rules, and post-call state changes. It stops short of saying what is returned (payment id? updated bill?) or what happens on a failed match, which an agent may still need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all five fields; baseline would be 3. The description earns the extra point by adding a constraint the schema does not express — that transaction_id must match the amount and currency and must be money out — and by framing paid_at as the actual settlement date rather than an arbitrary timestamp.
Input schemas describe structure but not intent. Descriptions should explain 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 ("Record that a bill was paid") plus the facts captured (date, method, statement row), which is clearly distinct from invoice-payment siblings like o2c_record_payment or solo_record_payment. It never names a sibling or scopes itself against one, so an agent must infer the boundary from the word "bill" alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions: only after the payment happened, only with the actual settlement date, agents only for approved bills. It also states the conditional rule for linking a statement row (only when the payment appears on an imported statement, amount/currency must match, must be money out). No alternative tool is named for the related cases (e.g. reimbursements, non-bill payments), 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.
purch_record_reimbursementPaid backAInspect
Tie money in to the work expenses it paid back. They must add up to it exactly; together they are no longer personal spending. Work expenses are marked when reviewed (reimbursable_by, claim_ref). When the employer or client pays them back, read purch_reimbursements, find the expenses the money covers (often one claim), show the person, and tie them with a reason. The expenses must add up to the money in exactly; if less came back than was claimed, tie the ones it covers and leave the rest waiting. Effects: money in tied to the expenses it paid back; those expenses no longer personal spending.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Which claim it was: "expense report 14, October travel". | |
| expenses | Yes | The expenses it covers. | |
| in_transaction_id | Yes | The money in that paid them back. An existing purch_transaction id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, idempotent=false; the description adds genuine behavioral context beyond that — what the link means semantically (the expenses stop counting as personal spending) and the hard invariant that the tied expenses must equal the money in exactly. It does not say what happens if the sums mismatch, nor that the link is reversible via purch_unlink_reimbursement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core rule is front-loaded, but the exact-sum constraint is stated twice and the "no longer personal spending" outcome is likewise repeated in the closing Effects line. The phrasing is oddly colloquial ("Tie money in"), which costs a beat of comprehension. It is not bloated, but sentences could be merged without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 three fully described parameters, no output schema, and annotations covering the safety profile, the description supplies what's missing: the workflow, the equal-sum invariant, and the post-state. Residual gaps are error behavior on a sum mismatch and the undo path, neither of which blocks a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns above baseline by adding constraints the schema lacks: the expenses array must sum exactly to in_transaction_id, both are existing purch_transaction ids drawn from a prior purch_reimbursements read, and reason should identify the originating claim. It does not clarify ordering or behavior for a zero/over-amount input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete operation: tying an inbound money transaction to the expense transactions it reimburses, and lists the resulting state change (expenses cease to be personal spending). It also names the read-side sibling purch_reimbursements, which orients the agent in the purchases family. It does not name purch_unlink_reimbursement as the inverse, so full sibling differentiation is incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 procedure: read purch_reimbursements, identify the expenses the money covers, confirm the person, then tie with a reason. It also handles the partial-settlement case ("if less came back than was claimed, tie the ones it covers and leave the rest waiting"), which is a real branching decision an agent would otherwise get wrong. No exclusion against adjacent tools like purch_pair_transfer or purch_link_refund is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_record_valueRecord a valueAInspect
State what something without statements is worth, or what is still owed on it, on a day, with where the figure comes from: a house, a car, an outside loan. A value is the person's figure with where it comes from (according_to: "county assessment 2026", "Kelley Blue Book, private party", "lender's payoff letter"). Never estimate one yourself. Bank and card balances come from their statements, not from here. Give the amount as a positive number: what it is worth for a thing you own, what is owed for a loan; the sign follows the kind. Effects: value recorded with its date and source.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | Yes | The day the figure is for. ISO date, YYYY-MM-DD. | |
| amount | Yes | What it is worth, or for a loan what is owed, as a positive amount. In cents (integer minor units) — 1250 means $12.50. | |
| reason | No | Anything the person said. | |
| account_id | Yes | The account. An existing purch_account id. | |
| according_to | Yes | Where the figure comes from: "county assessment 2026", "lender's payoff letter". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive, non-idempotent, closed-world mutation. The description adds useful context by requiring a source and stating the effect: the value is recorded with its date and source.
Agents need to know what a tool does to the 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 appropriately sized and front-loads the purpose and source requirement. The opening sentence is awkwardly ordered and harder to parse than necessary, but no material filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation with full schema coverage, annotations, and no output schema, the description covers purpose, exclusions, source requirements, amount convention, and effects. It does not explain append-versus-overwrite behavior for repeated records, though the non-idempotent annotation signals that.
Complex tools with many parameters or behaviors need more documentation. 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 adds meaning beyond the schema by explaining the asset-versus-loan positive-amount convention and emphasizing that the figure must come from an external source, not an estimate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the action as stating/recording what an asset is worth or what is owed on a loan, with source attribution. It distinguishes this from statement-based balances, though the phrasing is convoluted and does not name a sibling alternative 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 gives clear exclusions: never estimate values, and bank/card balances come from statements rather than this tool. It does not explicitly name the sibling tool to use for those statement-based balances, leaving that routing slightly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_refundsRefundsCRead-onlyIdempotentInspect
Money back linked to the purchase it reverses, and money in that looks like money back from the same shop (suggested, with why). With refund_id: that link whole.
| Name | Required | Description | Default |
|---|---|---|---|
| refund_id | No | One link, e.g. RFD-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral context by saying suggested matches include a reason and that refund_id returns the full link, though "that link whole" remains vague about the actual response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it is not front-loaded with a clear action and the fragment "With refund_id: that link whole" is awkward. It is concise without being easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only retrieval tool with rich annotations, the description covers both listing and detail modes well enough to call it. It still leaves the exact return contents and suggested-match behavior under-explained.
Complex tools with many parameters or behaviors need more documentation. 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 refund_id with an example. The description adds only that supplying refund_id returns the whole link, which is useful but minimal 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 conveys the refund resource indirectly through phrases like "Money back linked to the purchase it reverses" and distinguishes the optional refund_id detail mode. However, it never states a clear verb such as list or get, and the phrasing is cryptic enough that an agent may need to infer the tool's exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies two modes: without refund_id, list refunds plus suggested matches; with refund_id, retrieve one link in full. But it gives no guidance on when to use this instead of siblings like purch_link_refund, purch_unlink_refund, or o2c_refund.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_reimbursementsPaid backCRead-onlyIdempotentInspect
Work expenses waiting to be paid back (with how long; a long wait named), and the money that paid them back.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ISO 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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a modest behavioral detail — that results include elapsed wait time and flag a notably long wait — but leaves the actual threshold or return shape undefined.
Agents need to know what a tool does to the 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 a single short sentence with no filler, though the parenthetical 'with how long; a long wait named' is cryptic and slightly awkward. Nothing is bloated, but the phrasing costs clarity rather than saving 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?
For a read-only, single-optional-parameter list tool with rich annotations and no output schema, the description is minimally sufficient but silent on what a 'long wait' means and on the returned fields. An agent could call it, but could not predict the content precisely.
Complex tools with many parameters or behaviors need more documentation. 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 parameter as_of is documented as an ISO date in the schema, so the description does no extra work here. It never mentions that the aging/elapsed-time view can be anchored to a specific date, which would have been a useful semantic addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (work expenses awaiting reimbursement plus their repayments) but never uses a verb like 'list' or 'show', and it does not distinguish this read tool from siblings such as purch_record_reimbursement or purch_unlink_reimbursement. An agent can infer it is a read view of reimbursements, but only after parsing an unusually literary sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 fetch reimbursements versus related tools (purch_record_reimbursement, purch_unlink_reimbursement, purch_transactions), nor any mention of prerequisites or exclusions. The agent must guess the trigger condition from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_reject_billReject the billBInspect
Record that a bill will not be paid as it stands: wrong, disputed, a duplicate, not theirs. With a reason. Rejecting is a decision about a vendor relationship: do it when the person says so, with their reason. The bill stays on the record. Effects: bill rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it will not be paid as it stands. | |
| bill_id | Yes | The bill, e.g. B-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is mostly carried structurally. The description adds one genuinely useful fact beyond that — 'The bill stays on the record' — clarifying rejection is not a deletion. However, 'Effects: bill rejected.' is a tautology, and it never says whether a rejection can be undone, re-approved, or what the bill's subsequent state is.
Agents need to know what a tool does to the 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 caller condition are front-loaded, which is good. But the closing 'Effects: bill rejected.' restates the first clause verbatim and earns nothing, and the staccato fragments cost more space than they return.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, no-output-schema mutation with annotations present, the description covers what the tool does, when to fire it, and that the bill persists. It is missing the downstream picture an agent would want before an irreversible-sounding vendor decision: reversibility, effect on payables/aging, and whether the bill can later be approved.
Complex tools with many parameters or behaviors need more documentation. 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 bill_id and reason are already documented in the schema, giving a baseline of 3. The description reinforces that a reason is mandatory ('With a reason') but contributes no format, length, or vocabulary guidance 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?
The description gives a specific verb ('record that a bill will not be paid') and names the resource, plus concrete reasons (wrong, disputed, duplicate, not theirs) that let an agent distinguish this from purch_approve_bill or purch_record_bill_payment. It never names a sibling outright, 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?
It offers a real usage condition — 'do it when the person says so, with their reason' — which is better than nothing and captures the human-in-the-loop trigger. But there are no exclusions and no alternatives cited, so an agent facing a disputed bill has no guidance on whether to reject, match/dispute, or issue a credit instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_rename_categoryRename categoryAInspect
Change a category word on every row that carries it, in one act. Categories are the person's words; when the word changes, every row follows in one reasoned act rather than a re-review. Renaming onto an existing word merges the two. Effects: category replaced on every row that carried it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The word it becomes. | |
| from | Yes | The word as it is now. | |
| reason | No | Why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent. The description adds real behavioral substance beyond that: the operation fans out to every row carrying the word, and colliding with an existing word silently merges two categories into one. That merge side effect is exactly the kind of consequence annotations cannot express, and it is a notable omission that reversibility is not stated given destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is well front-loaded, but the closing 'Effects: category replaced on every row that carried it' restates it, and the framing 'Categories are the person's words ... one reasoned act rather than a re-review' is editorial padding that does not change how the tool is called.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with no output schema and solid annotation coverage, the definition covers scope and the merge side effect adequately. It stops short of saying whether the rename can be undone or what happens to rules/reports referencing the old word, which matters for a workspace-wide mutation.
Complex tools with many parameters or behaviors need more documentation. 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 `from` and `to` are already documented. The description adds meaning to `to` by explaining that a value colliding with an existing word triggers a merge, but says nothing about the optional `reason` parameter or the accepted word format.
Input schemas describe structure but not intent. Descriptions should explain 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-plus-resource with scope: change a category word across every row carrying it, as one atomic act. That is clearly distinguishable from the per-row sibling purch_tag_category, though the sibling is never named, so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage (rename when the vocabulary word itself changes rather than re-tagging rows) and discloses a key consequence: renaming onto an existing word merges the two categories. But it never states when to prefer purch_tag_category or purch_vocabulary instead, nor any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_review_batchReview manyAInspect
Review a whole statement in one act: status, category and vendor per row, one reason. Checked whole; refused whole. READ purch_vocabulary FIRST: it holds the statuses and what they mean, and the person's own categories and vendors, which are the words to use. Propose a status, a category and a vendor for every row, show the person the whole table, and write nothing until they have answered. Then write it all in one act with their confirmation as the reason.
Every row marked recurring must carry its vendor (the shop's name, e.g. "Adobe"): naming it is what declares the subscription. A transfer's category is where the money went or came from (checking, savings, the card being paid). Every row is validated before any is written, and the batch is refused whole with the row and the fix named; a row you cannot name stays out of the batch and unreviewed, never guessed. Up to 200 rows. Effects: status, category, vendor recorded on every row listed.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | The rows and what they are. | |
| reason | No | Why — typically "confirmed by the person" plus anything they said. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnly false, destructive false, non-idempotent) by disclosing all-or-nothing atomicity ('checked whole; refused whole'), that failures name the offending row and the fix, the 200-row ceiling, and the exact write effect ('status, category, vendor recorded on every row listed'). The confirmation-as-reason requirement adds audit context an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and consequence ('Checked whole; refused whole') before the workflow and field rules. Slightly repetitive — the refuse-whole guarantee is stated twice ('refused whole' up front, then again in the validation sentence) — but every other clause carries distinct instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-read-only batch mutation with no output schema, it covers the prerequisite read, the propose-then-confirm protocol, per-row validation and rejection semantics, the size limit, and the resulting effects. An agent has enough to invoke it correctly and to explain a refusal without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine field-level meaning: a recurring row must carry its vendor and naming it is what declares the subscription, and a transfer's category is the counterparty account rather than a spending category. These are semantic rules absent from the schema 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?
Names a specific verb and scope: review a whole statement in one act, setting status, category and vendor per row plus one reason. The phrase 'a whole statement in one act' plus the 'Up to 200 rows' cap implicitly separates it from the single-row sibling purch_review_transaction, but that sibling is never named, so the 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?
Gives a strong explicit workflow: read purch_vocabulary first for statuses/categories/vendors, propose for every row, show the whole table to the person, and write nothing until they answer. It also states exclusions ('a row you cannot name stays out of the batch'), but it never names an alternative tool for the single-row or partial case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_review_transactionReviewAInspect
Say what a row is — purchase, recurring, transfer, income, fee, ignored — with a category, a vendor and a reason. Amount and date never change. A reasoned act (P-5). Read purch_vocabulary first and propose from the person's own categories and vendors. purchase is one-off spending; recurring is spending that repeats (rent, streaming, insurance) — name the vendor and the subscription is declared for you, then confirmed month by month (P-6). A transfer is money moving between the person's own accounts (card payoffs, brokerage, savings, an owner draw): give it a category saying WHERE it went, so the ledger's bank balance still ties to the statement. Leave that blank only when the money is already recorded elsewhere in these books, such as a client payment against an invoice you issued; those rows are then listed as not posted rather than counted twice. A fee is the bank's charge; income is money in; ignored is a row that is not theirs to track. Never alter the amount or the date — a wrong row means a wrong source, re-read and re-imported. Effects: status, category, vendor, note recorded; subscription declared for a recurring row with a vendor.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Anything the person said about it. | |
| reason | No | Why — part of the record. | |
| status | Yes | What it is. | |
| vendor | No | The vendor's proper name; the row's description becomes its alias. Required for recurring. | |
| cadence | No | For recurring: how often. Defaults to monthly. | |
| category | No | The person's own word for it (groceries, software, travel). Empty beats guessed. | |
| claim_ref | No | The expense report or claim it went on, if any. | |
| transaction_id | Yes | The row, e.g. T-0012. | |
| reimbursable_by | No | A work expense someone pays back: who ("Acme Corp, expenses"). Clear it with an empty value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important effects: status, category, vendor, and note are recorded, and recurring rows can declare a subscription. It also states a strong invariant that amount and date never change, and explains the downstream handling of transfers with blank categories. It does not discuss idempotency behavior, return values, or permission requirements, but it adds substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the description is a dense paragraph and includes references like P-5 and P-6 that are not explained. The status guidance is valuable, but the length and lack of structure make it less efficient than it could be for a nine-parameter mutation 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?
The description covers the main behavioral contract, including status meanings, prerequisites, effects, and the invariant that amount and date must not change. Because there is no output schema, the absence of return-value details is a gap, but the effects summary partially compensates. For a complex review operation, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all nine parameters. The description still adds meaningful semantic guidance for status choices, vendor handling for recurring rows, and category behavior for transfers. It adds less value for parameters such as claim_ref and reimbursable_by, but overall it exceeds the baseline expected when the schema is fully described.
Input schemas describe structure but not intent. Descriptions should explain 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: classify a transaction row by status, with category, vendor, and reason. It enumerates the status values and makes clear that this is a single-row review action, so the agent can understand the operation without opening the schema. It could distinguish itself more explicitly from reviewed-batch variants, but the purpose itself is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit prerequisite guidance to read purch_vocabulary first and to propose from the person's own categories and vendors. It also explains how to choose among statuses such as purchase, recurring, transfer, fee, income, and ignored. It does not explicitly name when to use this tool versus sibling tools like purch_review_batch, which leaves some routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_rulesStanding rulesCRead-onlyIdempotentInspect
Rules the person set ahead of time, each with its window, what it suggests, and how many unreviewed rows it is suggesting for right now.
| Name | Required | Description | Default |
|---|---|---|---|
| include_ended | No | Include rules that have ended. |
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 covered. The description's added value is the return shape: each rule carries its window, its suggestion, and a live count of unreviewed rows. That is genuinely useful since there is no output schema, but ordering, whether ended rules appear by default, and what 'suggestion' means operationally are left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the resource identification comes first. The trailing clause ('how many unreviewed rows it is suggesting for right now') is slightly clunky but carries real information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-optional-parameter list tool this is close to adequate, and the description partially compensates for the absent output schema by describing the returned fields. Still missing: whether ended rules are excluded by default, result ordering, and any pointer to the suggestion-review workflow that the tool's output feeds.
Complex tools with many parameters or behaviors need more documentation. 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, include_ended, and schema description coverage is 100%, so the schema fully documents it. The description never mentions the parameter or the default behavior around ended rules, so it adds nothing here — the baseline 3 for high coverage 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 identifies the resource as 'rules the person set ahead of time' and even sketches the returned fields, so the subject matter is clear. However, it never states an explicit verb (list/retrieve) and gives no signal distinguishing it from siblings like purch_get_rule, purch_add_rule, or purch_end_rule, leaving the agent to infer this is the collection lister.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 call this versus purch_get_rule (single rule), purch_add_rule (create), purch_end_rule (retire), or purch_accept_suggestions (act on the suggestions this tool reports). The 'unreviewed rows it is suggesting' phrase hints at a downstream workflow but never names the follow-up tool or the condition that triggers it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_set_autopayAutopayAInspect
Put a vendor's bills on autopay from one account, or take them off. Its bills then count as approved by this standing decision, and say so. HUMAN-ONLY: this act is refused to you whatever your role — Letting a vendor take its bills from an account on its own is the person's standing decision to pay them. Ask your human to do it. A person sets autopay in the app, whatever an agent's role: it approves paying every bill of that vendor ahead. An agent records the bills, and the payments when the statement shows them. Effects: vendor's bills approved ahead from one account, or no longer.
| Name | Required | Description | Default |
|---|---|---|---|
| off | No | Stop autopay. | |
| reason | Yes | What the person decided. | |
| series_id | Yes | The expected bill, e.g. BS-0001. An existing purch_bill_series id. | |
| account_id | No | The account it is paid from. Leave out with off to stop autopay. An existing purch_account id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing a hard authorization constraint (refused regardless of role) and the semantic effect on downstream state: the vendor's bills count as approved ahead of time from one account, or stop being so. This is exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the human-only point is repeated three ways (the 'HUMAN-ONLY' line, 'Ask your human to do it', and 'A person sets autopay in the app, whatever an agent's role'), and 'Effects:' restates the opening sentence. Emphasis is justified here, but the text is longer than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers what changes in the system and why an agent must not call it. What remains uncovered (e.g. what the refusal looks like, whether an existing autopay must be off before setting a new one) is minor for a tool agents are told not to invoke.
Complex tools with many parameters or behaviors need more documentation. 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 is documented in-schema, so the baseline is 3. The description only restates the account/off relationship conceptually ('put on autopay from one account, or take them off') without adding format or constraint 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?
First sentence states a specific verb and resource: put a vendor's bills on autopay from one account, or take them off. It is distinguishable from siblings like purch_declare_bill_series and purch_record_bill_payment by describing the standing-approval effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 the act is refused to agents whatever their role and instructs the agent to ask its human to perform it. It also names the agent's legitimate alternatives (recording bills and payments) so the agent knows what it should do instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_set_card_factsCard statement factsAInspect
Record what a card statement prints besides its rows: the minimum payment, the payment due date, the credit limit and the purchase rate. Kept as printed; changing them later needs a reason. Pass them with the import when you have the statement (purch_import_statement takes the same fields). Use this for a statement imported without them, or to correct a misread, with a reason. Copy the figures as printed; never work a minimum out from the balance. Effects: card statement facts recorded.
| Name | Required | Description | Default |
|---|---|---|---|
| apr_bp | No | Purchase rate in basis points, as printed: 2499 means 24.99%. | |
| reason | No | Only when correcting facts already recorded: why. | |
| source_id | Yes | The card statement, e.g. SRC-0003. An existing purch_source id. | |
| minimum_due | No | Minimum payment due, as printed. In cents (integer minor units) — 1250 means $12.50. | |
| credit_limit | No | Credit limit, as printed. In cents (integer minor units) — 1250 means $12.50. | |
| payment_due_date | No | Payment due date, as printed. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, non-idempotent write, and the description adds real context: values are kept as printed, and later changes require a stated reason. It does not say what happens if facts already exist without a reason, nor what a repeat call does despite idempotentHint=false, leaving 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?
Front-loaded with the field list and the import-vs-correct decision, then the sourcing caveat. The trailing 'Effects: card statement facts recorded' is boilerplate that restates the opening, but the rest is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a mutation annotation set, the description covers what is recorded, when to use it versus the import path, and the correction precondition. What is missing is behavior on conflicting existing facts and whether the call replaces or merges recorded values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding sourcing rules the schema cannot express — copy figures as printed and never derive a minimum from the balance — and by tying the 'reason' parameter to correction scenarios.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Record') plus a precisely enumerated resource: minimum payment, payment due date, credit limit, purchase rate. It also scopes the tool as 'besides its rows,' which separates it from row-level statement import, and names purch_import_statement as the related 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?
Explicit routing: pass the fields with purch_import_statement when importing a statement, and use this tool only for a statement imported without them or to correct a misread. The when-to-use, the when-not-to-use, and the alternative are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_set_vendorName the vendorAInspect
Name the shop behind a row once; its statement spelling becomes an alias for every later row. One vendor, many spellings. The alias is the description as printed; pass it (or let it default to the row's description) so the next statement names the shop by itself. Effects: vendor created if new; alias recorded; vendor set on every unassigned row with that description.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | The statement spelling to remember. Defaults to the row's description. | |
| reason | No | Why — optional. | |
| vendor | Yes | The vendor's proper name (Netflix, Countdown). | |
| transaction_id | Yes | The row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive mutation. The description adds meaningful behavioral detail beyond the annotations: a vendor may be created, an alias is recorded, and the vendor is set on every unassigned row with that description. It does not discuss reversibility or conflict handling, so a 4 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 short and front-loaded around the main action, with a separate effects sentence that highlights the important side effects. The phrasing is slightly indirect and poetic, but no sentence is 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?
For a four-parameter mutation with no output schema, the description covers the essential behavior: vendor creation, alias recording, and bulk assignment to matching unassigned rows. It could say more about return values or preconditions, but the core mutation semantics are sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description reinforces the alias default and explains that the alias is the statement spelling, but it does not add much parameter meaning beyond the schema. The baseline score of 3 is therefore appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: naming the vendor behind a transaction row and recording its statement spelling as an alias for later rows. It makes the core effect clear, including that the vendor is applied to unassigned rows sharing that description. It does not explicitly differentiate itself from nearby siblings such as purch_vocabulary or purch_get_transaction, 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 phrase 'Name the shop behind a row once' and 'One vendor, many spellings' imply the intended use case for normalizing repeated vendor descriptions. However, the description does not state when not to use it or name alternatives such as purch_vocabulary or direct transaction updates. Usage is therefore implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_sourceStatementCRead-onlyIdempotentInspect
One statement with its rows and reconciliation.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | e.g. SRC-0001. |
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 covered. The description's one contribution is telling the agent the payload includes the statement's rows and its reconciliation, which is genuinely useful since there is no output schema — but it says nothing about what reconciliation status looks like or behavior for an unknown/source-not-found ID.
Agents need to know what a tool does to the 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 tight clause with zero padding, and the key payload detail (rows + reconciliation) is front-loaded. It is arguably over-compressed — a fragment rather than a sentence — but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool whose annotations cover safety, the description is minimally sufficient, and 'with its rows and reconciliation' partially compensates for the absent output schema. It still leaves the agent guessing how this differs from purch_sources and purch_transactions, which is the main risk in a 150+ sibling namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the source_id property even carries an example ('e.g. SRC-0001'), so the schema does the heavy lifting. The description adds no meaning about the identifier's origin (e.g. that IDs come from purch_sources) or format expectations 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 identifies the resource (a single statement, i.e. one source) and notes it comes with its rows and reconciliation, which hints at the plural sibling purch_sources being the list form. But it is a noun phrase with no verb — an agent must infer 'retrieve/fetch' — and it never names the source_id argument or explicitly contrasts with purch_sources, purch_get_transaction, or purch_import_statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 at all: nothing says to call this after purch_sources lists IDs, or to use it instead of purch_transactions when you need the whole imported statement. The singular/plural relationship with purch_sources is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_sourcesStatementsARead-onlyIdempotentInspect
Every statement imported: period, account, balances, rows in and skipped, who imported it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety and idempotency are covered structurally. The description adds value by disclosing what is reported per statement, including skipped-row counts and the importer identity, which is behavioral context the annotations cannot convey. It does not say whether unpaginated full history is returned, which is a real concern for a list-everything 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?
A single compact sentence, front-loaded with the scope ('Every statement imported') followed by the returned fields. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it does so reasonably by listing the per-statement fields including import diagnostics. What is missing is the volume/pagination expectation and explicit disambiguation from purch_source.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly does not invent any filtering options.
Input schemas describe structure but not intent. Descriptions should explain 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 resource and enumerates the fields returned per record (period, account, balances, rows in/skipped, importer), so an agent knows this is a list of imported statements with import diagnostics. It does not, however, distinguish itself from the near-identical sibling purch_source (singular), which an agent could easily 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?
There is no explicit statement of when to use this versus the obvious alternative purch_source for a single record, nor any mention of purch_import_statement as the write counterpart. The plural name plus 'Every' implies a list-all semantic, but that is inference rather than guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_spendSpendBRead-onlyIdempotentInspect
Spending by month, category and vendor, per currency — the numbers behind the charts.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | To date. ISO date, YYYY-MM-DD. | |
| from | No | From date. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed world, so safety is covered. The description does add useful behavior beyond that: this returns aggregated figures grouped by month/category/vendor in each currency rather than raw transactions. It still omits default date-window behavior, whether results are bucketed or summed, and any currency-conversion semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the grouping dimensions. The trailing '— the numbers behind the charts' is decorative but cheap and reinforces that this is an aggregated report.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 carry return-shape information, and it does so only partially by naming the grouping dimensions. It leaves open what happens with no dates and how results are shaped, which is a real gap for a reporting tool surrounded by many similar 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 description coverage is 100% and both parameters are documented as ISO YYYY-MM-DD dates, so baseline 3 applies. The description adds only the implied 'by month' grouping, not any clarification of inclusive/exclusive bounds or open-ended filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (spending) and the aggregation axes precisely: by month, category, vendor, per currency. That is much more than a restatement of the name, but it never distinguishes this report from close siblings like purch_year, purch_card_costs, or purch_purchases, so an agent cannot route between them on 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?
No when-to-use guidance and no named alternative. Both parameters are optional, yet the description says nothing about the default range when from/to are omitted, which is exactly the decision an agent must make before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_split_transactionSplit a rowAInspect
Say how one statement row breaks down: several categories that add up to it exactly. The row itself never changes. One line on a statement is often several things: a payroll run is wages, employer taxes and the processor's fee; a warehouse trip is supplies and groceries. The statement only knows the total, so the breakdown comes from the person or from a document they have — the payroll report, the receipt. Never invent the split; ask, or leave the row whole.
The legs must add to the row's amount exactly. They are refused otherwise, with the gap named, for the same reason a statement is: a breakdown that does not add up is a transcription error. The row keeps its amount, its date and the line it came from; only the ledger sees the legs, each posting to its own category against the account the money moved on. Pass remove to drop a split and put the row back to its single category. Effects: split legs recorded, replacing any earlier split.
| Name | Required | Description | Default |
|---|---|---|---|
| parts | No | The parts it breaks into. At least two, adding to the row exactly. | |
| reason | No | Where the breakdown came from — the payroll report, the receipt. | |
| remove | No | Drop the split and leave the row whole. | |
| transaction_id | Yes | The row, e.g. T-0014. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses key behavior: the row's amount, date and source line are preserved; invalid legs are refused with the gap named; legs post to their own categories against the source account; and an existing split is replaced. This is unusually rich behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and ends with a clear 'Effects' line. It is somewhat narrative and includes illustrative examples and rationale, but the length is mostly justified by the behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and only basic annotations, the description covers the important gaps: validation and refusal behavior, preservation of the original row, ledger-side effects, replacement of an earlier split, and how to remove a split.
Complex tools with many parameters or behaviors need more documentation. 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 transaction_id, parts, reason and remove. The description reinforces the exact-sum constraint and explains where reason should come from, but it does not add much parameter syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: splitting one statement row into several category legs that add to the row exactly. It also clearly distinguishes the operation from simply editing or retagging the row by saying the row itself never changes and only the ledger sees the legs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: use this when one statement line is really several things, and get the breakdown from the person or a document rather than inventing it. It also covers the remove path. It does not explicitly name sibling alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_subscriptionsSubscriptionsBRead-onlyIdempotentInspect
Every declared subscription with its periods matched or missed, derived status, next expected charge, and the monthly equivalent per currency.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | Evaluate as of this date. Defaults to today. ISO date, YYYY-MM-DD. |
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 bar is lower. The description adds real value by disclosing what the response contains — derived status, next expected charge, per-currency monthly equivalent — which is important given there is no output schema. It does not mention ordering, volume, or behavior when no subscriptions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with no filler, front-loading the resource scope before the returned fields. It is efficient, though it reads as a noun phrase rather than a complete statement of what the tool does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 one optional parameter and no output schema, the description usefully enumerates the return fields. However it omits ordering, volume, and how as_of shifts the derived status, and it never routes the agent away from purch_get_subscription, leaving meaningful gaps for the agent to resolve.
Complex tools with many parameters or behaviors need more documentation. 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 parameter as_of is fully documented in the schema. The description does not mention as_of or explain how the evaluation date affects derived status and 'periods matched or missed', so it adds nothing beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('Every declared subscription') and enumerates the returned content: periods matched/missed, derived status, next expected charge, and monthly equivalent per currency. The scope word 'every' implicitly distinguishes it from the single-record sibling purch_get_subscription, though that sibling is never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of the alternative purch_get_subscription or purch_upcoming, and no stated prerequisites. The only hint is 'every', which implies a full listing but requires the agent to infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_tag_categoryTax tagAInspect
Tag a category for tax time (medical, charitable, business, home office, education, childcare), or clear its tag. The year summary totals tagged spending and lists rows without a receipt. The tag is the person's word on what their category is, never yours on what is deductible: ask, then tag. Clear it with tag none. Saybooks totals; it does not advise. Effects: category tagged, or its tag cleared.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | What it is at tax time; none clears it. | |
| reason | No | What the person said. | |
| category | Yes | The category, as the person uses it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive mutation; the description adds the concrete effect ('category tagged, or its tag cleared'), the downstream consequence that the year summary totals tagged spending and flags missing receipts, and the important semantic boundary that the tool records the user's assertion and does not advise on deductibility. It does not mention reversibility beyond 'none' or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the allowed values, followed by the cautionary rule and the effects line. Slightly sprawling across three paragraphs, but each sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers what changes, what the tag influences downstream, and the social constraint on choosing a tag. For a three-parameter mutation with full annotation coverage, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description restates the tag value list (already in the enum) and reinforces the 'reason' parameter via 'ask, then tag', but adds no format, ordering, or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Tag a category for tax time') and enumerates the exact tag values, including the clearing case. It is clearly distinguishable from nearby siblings such as purch_year or purch_rename_category, which operate on different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 operating rule 'ask, then tag' and tells the agent to use 'tag none' to clear, plus a soft pointer to the year summary. It stops short of naming an alternative tool or an explicit when-not-to-tag condition, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_transactionsTransactionsRead-onlyIdempotentInspect
Rows on record, newest first, with filters. unreviewed says how many still need a word.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | To date. ISO date, YYYY-MM-DD. | |
| from | No | From date. ISO date, YYYY-MM-DD. | |
| limit | No | Max rows, default 500. | |
| status | No | Only this status. | |
| vendor | No | Only this vendor. | |
| category | No | Only this category. | |
| source_id | No | Only this statement. |
purch_transfersTransfersBRead-onlyIdempotentInspect
Moves between your own accounts: the pairs, the rows that look like the two sides of one move (suggested, with why), and transfers with one side so far. With transfer_id: that pair whole.
| Name | Required | Description | Default |
|---|---|---|---|
| transfer_id | No | One pair, e.g. TR-0001. |
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 covered. The description adds that suggested pairs come 'with why' (rationale included in results), which is genuine extra context, but says nothing about ordering, volume, or whether suggestions require downstream action.
Agents need to know what a tool does to the 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 compact sentence with no filler, and the parameter mode is stated last where it belongs. The compression occasionally costs clarity ('that pair whole'), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-shape burden, and it does sketch three result categories. Still missing: whether suggestions are pending-action items, how one-sided transfers are represented, and any ordering or paging behavior for a potentially long list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already carries an example (TR-0001). The description adds only that the result is the 'pair whole' — i.e. both sides returned rather than one — which is marginal value 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?
The description names the resource (transfers between your own accounts) and enumerates the three result categories: complete pairs, suggested pairs with rationale, and one-sided transfers. The verb is implicit ('Moves between your own accounts' describes the domain rather than the operation), but an agent can still tell this is a read of transfer data and distinguish it from purch_pair_transfer / purch_unpair_transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'With transfer_id: that pair whole' does establish a mode split — omit the parameter to browse, supply it to fetch one pair in full. However, there is no explicit when-to-use guidance relative to siblings like purch_pair_transfer (create a pair) or purch_unpair_transfer (break one), which an agent would need to avoid calling the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_unlink_refundUnlink refundADestructiveInspect
Undo a refund link, with a reason. The money-in row goes back to how it was reviewed before. For a link that was wrong: the money in goes back to how it was reviewed, and the purchase counts in full again. Say so to the person. Effects: refund unlinked; the row back to its earlier review.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was wrong. | |
| refund_id | Yes | e.g. RFD-0001. An existing purch_refund id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is covered; the description goes further by naming the concrete consequences ("refund unlinked; the row back to its earlier review", "the purchase counts in full again"). The instruction "Say so to the person" also hints the agent should surface the change to the user, which is behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, but the same consequence is restated twice ("The money-in row goes back to how it was reviewed before" vs. "the money in goes back to how it was reviewed"), and "Say so to the person" is an unexplained instruction that muddies rather than clarifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter mutation with no output schema, the description covers the important thing an agent needs: what state is restored and that the purchase is re-counted in full. It omits error/edge behavior (nonexistent or already-unlinked refund) and permission requirements, but the essential call semantics are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (refund_id, reason) are documented in the schema, so the baseline of 3 applies. The phrase "with a reason" echoes the required reason parameter but adds no format, length, or content guidance beyond "Why it was wrong."
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Undo a refund link, with a reason" gives a specific verb (undo/unlink) and resource (refund link), which cleanly inverts the sibling purch_link_refund. An agent can distinguish it from purch_unlink_reimbursement/purch_unpair_transfer by the resource alone, though the description never names those siblings 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?
Usage is implied by "For a link that was wrong" and "Undo a refund link," which gives a clear trigger condition. However, it names no alternatives (e.g. purch_link_refund, purch_unlink_reimbursement) and states no exclusions or prerequisites, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_unlink_reimbursementUntieAInspect
Undo a reimbursement tie, with a reason. The money in goes back to how it was reviewed; the expenses wait again. For a tie that was wrong: say so to the person, since the expenses count as theirs again until tied correctly. Effects: tie undone; the money in back to its earlier review.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why. | |
| reimbursement_id | Yes | e.g. RB-0001. An existing purch_reimbursement id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive, non-idempotent mutation. The description adds useful state-effect context: the tie is undone, money in returns to its earlier review, and expenses wait again. It still does not discuss permissions or failure modes, but it meaningfully supplements 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 is front-loaded, but the effects are stated twice across the second and fourth sentences. The sentence about telling the person is useful workflow context but adds some verbosity without much tool-call clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 mutation with full schema coverage and annotations, the description is nearly complete: it explains the action, required reason, and resulting state changes. It could say more about error behavior when a tie is already undone, but no output schema exists and the core workflow is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema. The description reiterates that a reason is required but adds no syntax, format, or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: "Undo a reimbursement tie." It clearly distinguishes this from recording a reimbursement, but it does not explicitly name close siblings such as purch_unlink_refund or purch_unpair_transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage in the line "For a tie that was wrong" and gives related guidance about informing the person. However, it does not explicitly say when not to use it or name an alternative tool for a different case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_unmatch_receiptUnmatch receiptAInspect
Detach a receipt from its transaction, with a reason. A match was a reasoned act; undoing it is one too. The receipt goes back to unmatched, a visible state, and the reason stays on the record. Use it when the person says the receipt belongs to a different row or card — then match again. Effects: receipt unmatched.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why. | |
| receipt_id | Yes | The receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, closed-world. The description adds genuinely new behaviour: the receipt returns to an 'unmatched' state, that state is visible, and the reason is retained on the record — telling the agent the action is auditable and effectively reversible. It does not say what happens to the previous match record or whether repeating the call errors, despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded in the first clause, which is good. However 'A match was a reasoned act; undoing it is one too' is atmosphere rather than instruction, and 'The receipt goes back to unmatched, a visible state' duplicates the trailing 'Effects: receipt unmatched.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-required-parameter mutation with annotations and no output schema, the description covers trigger, effect on state, and audit consequence. An agent has enough to invoke it correctly and choose it over purch_match_receipt.
Complex tools with many parameters or behaviors need more documentation. 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%, but the schema text is bare ('Why.', 'The receipt.'). The description adds that the reason is persisted on the record and that receipt_id refers to a receipt currently attached to a transaction. That is useful but thin; baseline 3 applies since the schema nominally documents both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Detach a receipt from its transaction, with a reason.' It also names the implied counterpart ('then match again'), which lets an agent separate it from purch_match_receipt. It does not explicitly name the sibling tool, 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?
'Use it when the person says the receipt belongs to a different row or card — then match again' gives a concrete triggering condition and the follow-up action. There is no explicit when-not or prerequisite/permission guidance, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_unpair_transferUnpairAInspect
Undo a pairing, with a reason. Both rows go back to how they were reviewed before. For a pair that was wrong. Say so to the person: both rows need reviewing again. Effects: pair undone; both rows back to their earlier review.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was wrong. | |
| transfer_id | Yes | The pair, e.g. TR-0001. An existing purch_transfer id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation. The description adds useful state effects: the pair is undone and both rows return to their earlier review state, which goes beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description repeats the same effect multiple times: both rows returning to their earlier review state is stated in several sentences. "Say so to the person" is also distracting rather than clarifying.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 undo operation with full schema coverage and annotation hints, the description supplies the key context: why to use it and what changes. It does not cover error cases or permission requirements, but those are less critical here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters are already documented in the schema. The description reinforces that a reason is required and identifies the target as a pair, but adds no syntax or format details 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 a specific verb and resource: "Undo a pairing." It is clearly the inverse of pairing, but it does not explicitly name or differentiate itself from the sibling purch_pair_transfer, 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 a clear condition for use: "For a pair that was wrong." However, it does not state when not to use it or name alternatives, so it stops short of explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_upcomingWhat is dueARead-onlyIdempotentInspect
Everything on record due in the next weeks (bills, card payments, loan payments, subscriptions, expected bills not received yet) by date, beside the cash on the latest bank statements. Nothing unrecorded is assumed.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How far ahead. Defaults to 30. | |
| as_of | No | From which day. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the description focuses on what annotations can't say: results include only recorded items, plus expected bills not yet received, and are measured against the latest statement cash. 'Nothing unrecorded is assumed' is a genuinely valuable modeling caveat. Missing only notes on result limits or empty-set behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that leads with the object of the query and then qualifies it with the cash comparison and the recorded-only caveat. The parenthetical enumeration is dense but each item adds discriminating information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read tool with full schema coverage, the definition conveys what is included, how it is ordered, what it is compared against, and the key assumption. The absence of an output schema leaves the exact result shape (columns, totals, pagination) unexplained, which is the 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%, with both `days` and `as_of` fully documented including defaults and ISO format. The description's 'next weeks' and 'from which day' only loosely echo those parameters without adding syntax or edge-case 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?
The description enumerates exactly what the tool returns — bills, card payments, loan payments, subscriptions, expected-but-unreceived bills — sorted by date and paired with statement cash. That is a concrete, specific scope an agent can act on. It loses a point only because it never contrasts itself with close siblings like purch_payables or purch_card_dues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the cash-versus-dues framing suggests a near-term liquidity check, but there is no explicit statement of when to call this rather than purch_payables, purch_card_dues, or purch_subscriptions. No exclusions or prerequisites are given, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_update_accountUpdate accountAInspect
Change what the register says about an account: its kind, institution, last four digits, opening date, notes. Its name stays: statements are filed under it. Corrections from what the person or a statement says. A kind that does not fit the statements already on it is refused. Effects: account details updated.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| last4 | No | ||
| notes | No | ||
| opened_on | No | ISO date, YYYY-MM-DD. | |
| account_id | Yes | The account, e.g. ACC-0001. An existing purch_account id. | |
| institution | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation. The description adds useful behavior beyond that: the name is immutable, and a kind that conflicts with existing statements is refused. It does not cover auth or response behavior, but it meaningfully extends the annotation 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 update scope before rules and effects. The final sentence, 'Effects: account details updated,' is somewhat redundant, but overall there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and basic annotations, the description provides enough context: what fields change, what cannot change, when the operation is appropriate, and that invalid kind/statement combinations are refused. It could say more about the required account_id or return behavior, but it is largely complete for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description carries substantial weight. It maps five of the six parameters to plain-language fields (kind, institution, last four digits, opening date, notes) and adds the semantic constraint that name/account_id is not updatable. It still does not spell out optionality or formats beyond what the schema supplies.
Input schemas describe structure but not intent. Descriptions should explain 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: changing what the register says about an existing account. It enumerates exactly which fields can change and explicitly notes that the account name is immutable, making it clearly distinct from add/close/account-listing 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 a clear context for use: corrections sourced from the person or a statement. It also implies an exclusion by stating that the name cannot be changed because statements are filed under it. It does not explicitly name sibling alternatives, but the use case is well framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_vocabularyWords in useARead-onlyIdempotentInspect
Statuses with their meaning, the person's categories and vendors with aliases, cadences, subscriptions — read this before proposing a review.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered elsewhere. The description usefully adds that this is prerequisite lookup knowledge needed before proposing a review, but says nothing about the shape or size of the returned vocabulary lists.
Agents need to know what a tool does to the 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 compact sentence, front-loaded with the returned content and ending with the actionable instruction. The em-dash enumeration is slightly dense but every item earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and full annotation coverage, the description provides what an agent needs: what lists come back and the moment to call it. Only the absence of any hint about return volume keeps 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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and it correctly implies a parameterless full-vocabulary dump.
Input schemas describe structure but not intent. Descriptions should explain 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 enumerates the reference content returned: statuses and their meanings, categories, vendors with aliases, cadences, subscriptions. There is no verb, but for a zero-parameter glossary tool the resource is unambiguous and distinguishable from all the purch_ transaction/bill siblings. It falls short of 5 only because it never says plainly 'returns the controlled vocabulary'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 closing clause 'read this before proposing a review' gives an explicit trigger tied to purch_review_batch / purch_review_transaction. It does not enumerate when-not-to-use or name alternative reference tools (there are none obvious in the sibling list), so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purch_yearThe yearCRead-onlyIdempotentInspect
A year as the record has it: spending by tax tag net of refunds and of what was paid back, rows in a tagged category with no receipt, interest paid on cards and loans and interest earned, fees, and expenses still waiting to be paid back. Totals, not tax advice.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | e.g. 2026. Defaults to this year. |
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. The description adds useful context about netting refunds/paybacks and outstanding reimbursements, plus the 'not tax advice' caveat, but says nothing about output format, permissions, or calculation boundaries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first leads with the annual scope and enumerates the included data, while the second is a compact disclaimer. The phrasing is dense and slightly cryptic, but it is appropriately sized for a report tool with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only annual-summary tool with no output schema, the description enumerates the included data categories reasonably well. It still leaves return shape, grouping, and whether the year is calendar or fiscal unspecified, which matters for interpreting 'Totals'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, year, is fully documented in the schema with an example and default. The description's 'A year' adds no further semantics such as calendar vs fiscal year or accepted formats, 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 names the resource (a year's purchase/expense totals) and enumerates included data such as tax-tag spending, refunds, interest, fees, and unpaid reimbursements. However, it never uses a clear verb like 'get' or 'summarize annual totals' and does not distinguish it from siblings such as purch_spend, purch_purchases, or tax_liability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance and no named alternative. 'Totals, not tax advice' is a scope disclaimer, not routing guidance for choosing between this and purch_spend, purch_net_worth, or tax_liability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_accountsBank accountsBRead-onlyIdempotentInspect
Each bank and card account with its latest statement, where its reconciliation stands, and the last day signed off.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description contributes by naming what the payload contains (statement recency, reconciliation state, sign-off date), which is genuinely useful context. It stops short of richer behavior such as ordering, count limits, or whether accounts with no statements still appear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with no wasted words, and the resource is front-loaded before the payload details. Minor deduction because it is a noun phrase rather than a declarative statement, and phrases like 'where its reconciliation stands' and 'the last day signed off' are colloquial where precise terms would be cheaper to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the entire burden of explaining what comes back, and it does enumerate the meaningful fields (statement, reconciliation position, last sign-off). It is not fully complete because it never states whether all accounts are returned or whether the record shape is a list versus a keyed object, which matters when 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?
The tool takes zero parameters, so per the baseline this scores 4; there is nothing for the description to disambiguate. The description's field-level detail is effectively return-shape information rather than parameter meaning, but there is no parameter gap to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly establishes the resource (bank and card accounts) and the fields returned (latest statement, reconciliation status, last sign-off date), so an agent knows this is a read/list of accounts with reconciliation context. It falls short of a 5 because it never uses an explicit verb like 'list' and does nothing to distinguish itself from siblings such as purch_accounts, bridge_accounts, or rec_signoffs, which an agent could easily 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?
There is no when-to-use guidance at all: nothing says whether to call this before rec_reconciliation, rec_matches, or rec_signoffs, nor whether it is a summary view versus a prerequisite for matching. The agent must infer the workflow position entirely from the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_candidatesMatch suggestionsARead-onlyIdempotentInspect
Statement rows that could be money already recorded here, each with the payments that fit it and why. Suggestions only.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | One account; all bank accounts when left out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower; the description still adds that results are advisory and explains the response content ('each with the payments that fit it and why'). It does not mention whether candidates are ranked or how many 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 with the core concept front-loaded and the important 'suggestions only' qualifier placed last for emphasis. The phrase 'money already recorded here' is slightly cryptic for a first-time reader but wastes no 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?
For a one-optional-parameter read tool with no output schema, the description adequately conveys what comes back and that nothing is committed. The main omission is the natural next step (confirming a suggestion via rec_match), which an agent would have to infer.
Complex tools with many parameters or behaviors need more documentation. 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 'account' parameter is documented in the schema as 'One account; all bank accounts when left out.' The description adds nothing about scoping, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely — statement rows that might already be recorded money — and states the return shape (each candidate row with the payments that fit it and the reasoning). It is distinguishable from action siblings like rec_match or rec_unmatch, though it never explicitly contrasts itself with rec_matches or rec_get_match.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Suggestions only' implies this is the advisory step before a committing action, but it never names rec_match as the follow-up or states when to prefer this over rec_matches. Usage is inferable rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_get_matchMatchCRead-onlyIdempotentInspect
One match: the row, the payments, the reason.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | e.g. BM-0001. |
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 fully covered without the description. The description does add return-scope context — that a match includes its row, associated payments, and an explanatory reason — which is genuinely beyond the structured fields, but it stops short of noting whether the match must be open or signed off.
Agents need to know what a tool does to the 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 fragment with zero filler. It is efficient, though the clipped phrasing borders on cryptic rather than precise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 trivial read tool with full annotation coverage and a documented parameter this is a small ask, but the agent still cannot tell how a match_id is discovered (rec_matches, rec_candidates) or what a "row" or "reason" actually mean in this reconciliation domain. No output schema exists, so the description is the only clue about the return shape and it only gestures at 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 parameter with 100% schema coverage and an inline format example ("BM-0001"), so the schema carries the load. The description adds no meaning beyond it and never says where match_id values come from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"One match" signals a single-record fetch and the trailing list ("the row, the payments, the reason") sketches the payload, but the action verb is only implied by the tool name. It does not distinguish itself from rec_matches, rec_match, or rec_candidates, so the agent must infer that this is the detail-view counterpart to the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus rec_matches (list) or rec_candidates. No prerequisites or exclusions are given, leaving the agent to guess the call sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_matchMatch to a paymentAInspect
Tie a statement row to the payments or refunds recorded here that it is. They must add up to the row exactly. The row then posts nothing itself: the payment already did. A deposit on the statement is often a payment already recorded against an invoice. Read rec_candidates: per row, what fits by amount, date and name. Show the person, then match with a reason ("the Northwind ACH is their payment NW-ACH-2210"). One row can be several payments (a deposit of three checks); the items must add up to the row exactly, never "close enough". A row already booked as income or spending cannot be matched: that would count the money twice; say what it is booked as and let the person decide. Never record a payment just to have something to match. Effects: statement row matched; it posts nothing itself; the payments it is are now on the statement.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | The payments or refunds it is; they add up to the row exactly. | |
| reason | Yes | Why they are the same money. | |
| transaction_id | Yes | The statement row. An existing purch_transaction id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, non-idempotent mutation; the description goes further by disclosing the precise write semantics — the statement row is marked matched but posts nothing because the payment already posted — and by naming a dangerous precondition (double-counting on already-booked rows) with the recommended human-handoff behavior. That is real context beyond the hint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and constraint ('must add up to the row exactly') before the workflow guidance, then closes with an explicit Effects block. Some restatement of the exact-sum rule and the 'posts nothing' point, but both are load-bearing warnings for a financial mutation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema, the description covers preconditions (candidate lookup), the matching rule, the disallowed cases, the human-escalation path, and the resulting state. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, but the description adds genuine business semantics: items must sum to the row exactly, 'never close enough', and may be multiple per row; reason must articulate why they are the same money. It stops short of restating the item key format the schema already gives.
Input schemas describe structure but not intent. Descriptions should explain 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 (tie/match) and both resources involved (a statement row and recorded payments/refunds), and explicitly frames what the tool is not: it does not post anything itself. Sibling routing is implied through the named rec_candidates tool, so an agent can separate it from rec_unmatch or purch_match_receipt without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow (read rec_candidates first, show the person, then match with a reason), an explicit exclusion ('a row already booked as income or spending cannot be matched: that would count the money twice'), and an explicit anti-pattern ('Never record a payment just to have something to match'). The rule for one-to-many matching (a deposit of three checks) is stated with the exact-sum constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_matchesMatchesBRead-onlyIdempotentInspect
Every match between a statement row and payments recorded here, newest first, undone ones included.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds two genuine behavioral facts beyond the schema: results are ordered newest-first and unmatched/undone matches are included rather than filtered out. It says nothing about volume, pagination, or the fact that the result set is unfiltered across all statements and payments.
Agents need to know what a tool does to the 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 sentence with no filler, and the most decision-relevant qualifier (undone ones included) lands at the end while scope is front-loaded. The elliptical, verb-less phrasing is compact but costs a little immediate clarity about what action is being performed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of telling the agent what it gets back and what to do with it. It correctly states ordering and inclusion of undone matches, but does not say whether match identifiers suitable for rec_get_match or rec_unmatch are returned, leaving a real gap for a zero-parameter listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema provides no parameter semantics to supplement and the baseline of 4 applies. The description's scoping language ('every match', 'newest first', 'undone included') correctly implies there is no filtering capability the agent might look for.
Input schemas describe structure but not intent. Descriptions should explain 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 sentence names the resource (matches between statement rows and recorded payments) and quantifies scope with 'every', which implicitly distinguishes it from the single-record sibling rec_get_match. However, the verb is elided in the noun-phrase construction, so the agent must infer that this is a list/read operation rather than a creation or lookup of one item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no sibling is named as an alternative, despite close neighbors like rec_get_match, rec_candidates, rec_unmatch and rec_reconciliation. 'Undone ones included' faintly hints at auditing unmatched/reversed states, but the agent gets no rule for choosing this tool over rec_candidates or rec_reconciliation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_reconciliationReconciliationBRead-onlyIdempotentInspect
An account through a statement's last day: the statement's balance, the books' balance, and every item between them, named. Says what blocks a sign-off.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | The bank or card account, as the statement prints it. | |
| through | No | The last day of one of its statements. Defaults to the latest. ISO date, YYYY-MM-DD. | |
| currency | No | Only when one account name holds two currencies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=false-free safety profile (readOnlyHint true, idempotent, closed-world), so the description's job is to add substance — and it does, disclosing that the result enumerates both balances plus every reconciling item, and that it surfaces blocking conditions. That is real content beyond the annotations, though it stops short of saying what happens for an unknown account or a statement-free period.
Agents need to know what a tool does to the 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 no filler, and the output content is front-loaded. The elliptical first clause costs a little comprehension, but nothing is padded or restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does partially by naming the balances, the itemized reconciling entries, and blocker reporting. It still omits what a blocker looks like, empty/unreconciled outcomes, and how the result relates to rec_signoffs, leaving gaps for a no-output-schema 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 account, through, and currency are fully documented in the schema, and the description only loosely echoes two of them ('an account through a statement's last day'). Baseline 3 is correct — the description adds no syntax, default, or edge-case nuance 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 conveys what the tool produces — a statement balance, a book balance, the reconciling items between them, and what blocks sign-off — but it does so as a subject-less noun fragment ('An account through a statement's last day'), with no verb stating the operation. It also fails to distinguish itself from close siblings like rec_signoffs, rec_matches, and rec_candidates, which a reader could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 instruction and no named alternative. The trailing phrase 'Says what blocks a sign-off' only weakly implies it is a pre-sign-off diagnostic, leaving the agent to infer its place relative to rec_sign_off and rec_matches. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_sign_offSign off the reconciliationAInspect
Sign off an account's reconciliation through a statement's last day, with a reason. It is kept as it stands: the figures, the items and a hash. HUMAN-ONLY: this act is refused to you whatever your role — A reconciliation is a person's word that the bank and the books were looked at and agree. Ask your human to do it. A person signs this, in the app, once the reconciliation is explained to the cent. An agent prepares it (matches, reviews) and shows rec_reconciliation; it is refused the sign-off whatever its role. Effects: reconciliation signed off and kept as it stood.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | What was checked: "September statement, checked with Dana". | |
| account | Yes | The bank or card account, as the statement prints it. | |
| through | Yes | The last day of the statement. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a critical behavioral trait absent from the annotations: the tool is hard-refused to agents regardless of role, so calling it is guaranteed to fail. It also describes the effect ('reconciliation signed off and kept as it stood: the figures, the items and a hash') and the required precondition (the reconciliation must be explained to the cent). Annotations only say it is a non-read, non-destructive, non-idempotent mutation; the description adds the refusal semantics that actually govern invocation.
Agents need to know what a tool does to the 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 human-only warning are front-loaded, which is the right priority ordering. However, the agent-refusal point is made twice ('refused to you whatever your role' and 'it is refused the sign-off whatever its role'), which is redundant in an otherwise tight passage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool an agent cannot invoke, the description supplies everything needed: what it does, why it is off-limits, who should perform it, and what the agent should do instead (prepare and show rec_reconciliation). No output schema is required because the call path is closed to agents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (account, through, reason) are already fully documented with examples. The description restates 'with a reason' and 'through a statement's last day' but adds no syntax or format 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 ('Sign off an account's reconciliation') plus the scope ('through a statement's last day, with a reason'), which an agent can immediately distinguish from the sibling read tools rec_reconciliation, rec_signoffs and rec_match. The purpose is unambiguous and no sibling overlap 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?
Explicitly states when NOT to use it ('this act is refused to you whatever your role'), names the correct alternative path ('Ask your human to do it', 'An agent prepares it ... and shows rec_reconciliation'), and describes the division of labour between agent and human. This is the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_signoffsSign-offsARead-onlyIdempotentInspect
Every signed reconciliation: account, through, figures, by whom, and whether the record has changed since.
| 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, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds one genuinely useful behavioral detail — that each record reports whether it has changed since signing, i.e. a tamper/staleness signal — but says nothing about ordering, volume, or whether unsigned or superseded reconciliations appear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the scope front-loaded ('Every signed reconciliation') and the returned fields following as a colon list. No filler, no repetition of the title, and every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input params and no output schema, the description carries the burden of conveying the return shape, which it does by naming the five reported fields. It is slightly short on scope boundaries — whether the list is complete history or current-state only, and whether results are ordered or bounded — but is otherwise adequate for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The field enumeration in the description is the only semantic surface, and it is appropriately covered.
Input schemas describe structure but not intent. Descriptions should explain 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 and scope: it lists every signed reconciliation and enumerates the fields carried (account, through date, figures, signer, changed-since flag). This clearly separates it from the mutation sibling rec_sign_off and from rec_matches. It does not explicitly name or contrast with the nearest read siblings (rec_reconciliation, rec_matches), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it is a list of signed reconciliations, so an agent can infer 'call this to audit sign-offs'. There is no explicit when-to-use, when-not-to-use, or pointer to rec_reconciliation / rec_get_match for detail on a single reconciliation, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rec_unmatchUnmatchAInspect
Undo a match, with a reason. The row goes back to how it was reviewed before; the payments are unmatched again. For a match that was wrong. The row returns to its earlier review (often not reviewed); say so to the person. Effects: match undone; the row back to its earlier review.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was wrong. | |
| match_id | Yes | The match, e.g. BM-0001. An existing bankrec_match id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the annotations: the match is undone, payments become unmatched again, and the row returns to its earlier review state. This helps an agent understand the state change, though idempotency and rematch behavior are left to the annotations or unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but it repeats the same effect multiple times. The first paragraph, the second paragraph, and the "Effects" line all restate that the row returns to its earlier review state.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 mutation tool with annotations covering read-only and destructive flags, the description gives an adequate account of the state transition. No output schema exists, so there is no return-value gap, though permission requirements are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both match_id and reason. The description reinforces that a reason is required, but it does not add format details or other 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 uses a specific verb and resource: "Undo a match". It makes the effect clear and is readily distinguishable from the sibling rec_match tool, which creates matches rather than reversing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage condition: "For a match that was wrong." It does not explicitly name rec_match as the alternative or say when unmatching should not be used, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_apply_paymentApply to invoiceAInspect
Settle an invoice (or part of it) with a recorded payment. Bounded on both sides — never more than the payment has left, never more than the invoice still owes; refusals name the numbers. Effects: application recorded; invoice -> paid when fully settled.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | How much to apply. Omit for the smaller of what is left on each side. In cents (integer minor units) — 1250 means $12.50. | |
| invoice_id | Yes | The invoice it settles. | |
| payment_id | Yes | The payment, e.g. P-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the two-sided amount bound ('never more than the payment has left, never more than the invoice still owes'), the refusal behavior ('refusals name the numbers'), and the resulting state change ('invoice -> paid when fully settled'). The one gap is the declared idempotentHint=false: nothing warns about re-applying the same payment, which matters for a money-moving mutation.
Agents need to know what a tool does to the 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 lines, front-loaded with the action, then constraints, then effects. No filler sentences and no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with no output schema, the description covers what changes and how validation failures behave, which is the essential missing piece. What remains unstated is the response shape and the double-application hazard, but these are modest gaps given full schema coverage and existing annotations.
Complex tools with many parameters or behaviors need more documentation. 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 already explains the amount default ('omit for the smaller of what is left on each side') and the cents convention. 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?
States a specific verb and resource: 'Settle an invoice (or part of it) with a recorded payment.' The phrase 'with a recorded payment' implicitly separates it from solo_record_payment (which creates the payment), but no sibling is named, so the differentiation must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: an agent can infer this runs after a payment exists and before the invoice is considered closed. There is no explicit 'use this instead of X' routing, no stated prerequisite (payment must exist and be unapplied), and no mention of solo_record_payment or o2c_apply_payment as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_draft_invoiceDraft invoiceAInspect
Start an invoice as an editable draft. Nothing is final until you issue it. Gather the lines as the person describes the work — description, quantity or hours, rate — and SHOW them the numbers before issuing. Timing is their agreement with the client: ahead of the work, partial, or after — never question it (S-5). Never invent an amount or a rate (S-6). If there is no client yet, ask for the client's name, billing address, email, and the agreed terms — one question at a time — and create the customer first. The draft comes back with doc_url: a preview link that renders the real document marked DRAFT. Call solo_get_document to see that render yourself and hand the person the link BEFORE asking whether to issue; never hand-roll the document yourself. Effects: draft created with computed totals; preview link minted.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The work being billed. | |
| notes | No | Printed on the document (project reference, thanks, PO number they gave you). | |
| subject | No | One line above the table — project, period. Printed on the document. | |
| currency | No | Currency of this invoice, ISO 4217. Defaults to the company default; must be one of the company's currencies. | |
| customer_id | Yes | The client. An existing customer id. | |
| due_in_days | No | Days until due. Defaults to the customer's payment terms (net7 = 7, net30 = 30, immediate = 0); pass it only to depart from them for this invoice. Freezes into the due date at issue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) by disclosing the effects block: draft created with computed totals, a preview link minted, and doc_url returned as a DRAFT render. It also clarifies non-destructiveness substantively ('nothing is final until you issue it') and warns against hand-rolling the document.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the workflow guidance is ordered sensibly. It runs long with some internal repetition (the 'call solo_get_document' and 'never hand-roll the document' instructions overlap) and parenthetical rule codes (S-5, S-6) that add little for a reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no output schema, the description covers the prerequisites, the sequencing, the safety profile, and the return value (doc_url preview link). 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 description coverage is 100%, so the description holds to the baseline; the line fields mentioned (description, quantity/hours, rate) and the due-date/timing point only restate what the schema already documents. It adds no format, unit, or edge-case detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Start an invoice as an editable draft') and immediately distinguishes it from the issuing step ('Nothing is final until you issue it'), which maps to the solo_issue_invoice sibling. An agent can tell draft vs. issue apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing rules: gather lines as the person describes the work, SHOW the numbers before issuing, create the customer first if none exists, call solo_get_document before asking whether to issue. It also names constraints ('never question timing', 'never invent an amount or a rate'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_draft_reminderDraft a reminderAInspect
Write a payment reminder for an overdue invoice. It is a draft the person sends from their own mailbox; Saybooks never sends it. For an invoice past its due date with money still open (solo_outstanding lists days_overdue, reminders_sent and next_stage). Write it in the person's voice, short and specific: the invoice number, the amount open, the due date, and pdf_url from solo_get_document so the client can pay without hunting. A first reminder assumes it slipped; a second asks when to expect payment; a final one says plainly what happens next, but only what the person has told you. Never mention a late fee, interest or a collections step that was not agreed: the figures are checked, and an amount the invoice does not have is refused. Show the person the draft. They send it themselves; when they say it went, record it with solo_reminder_outcome and the date it went. Effects: reminder drafted against the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The email body, in the person's voice, with the invoice number and the amount open. | |
| subject | Yes | The email subject line. | |
| invoice_id | Yes | The overdue invoice, e.g. INV-0003. | |
| soon_because | No | Only when the last reminder went less than seven days ago: why another one now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the generic safety profile (readOnlyHint=false, destructiveHint=false); the description adds the crucial behavioral facts: nothing is actually sent, the draft must be shown to the person, amounts are validated and refused if they don't match the invoice, and unagreed fees/collections language is forbidden. These are exactly the non-obvious traits an agent could otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the 'never sends it' caveat are front-loaded, and the content rules and follow-up are ordered logically. It is dense and long for a single tool, but nearly every clause carries operational information rather than restating structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers prerequisites, content rules, prohibited content, the human-in-the-loop step, the follow-up recording call, and the effect. An agent has everything needed to invoke it correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds content requirements beyond the schema: the body must carry the invoice number, amount open, due date, and pdf_url, and must be written in the person's voice. It does not elaborate on soon_because beyond the schema, keeping it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — write a payment reminder for an overdue invoice — and immediately scopes it as a draft that Saybooks never sends. This cleanly separates it from solo_reminders (listing) and solo_reminder_outcome (recording that it went).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 precise qualifying condition (invoice past its due date with money still open, with solo_outstanding fields to check), names the prerequisite and follow-up tools (solo_get_document, solo_reminder_outcome), and explains the escalation logic across first/second/final reminders. Alternatives and when-to-use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_get_documentDocumentARead-onlyIdempotentInspect
The rendered document: a picture of one page to look at, and — once issued — the direct download link for the PDF. Use this to SEE the invoice before asking whether to issue: a draft comes back as an image stamped DRAFT, so you check the real render, not the JSON. After issue, call it again and hand the person pdf_url — a direct, unauthenticated, one-click download of the finished PDF; they send it themselves (S-7). Do not fetch or relay the bytes yourself: the link IS the deliverable. with_pdf=true exists only as a fallback for a client that cannot open links at all. Pages count from 1.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page to render, from 1. Default 1. | |
| with_pdf | No | Fallback only, for a client that cannot open links: include the PDF bytes as pdf_base64 (issued invoices only; thousands of characters). Prefer pdf_url. | |
| invoice_id | Yes | e.g. INV-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds state-dependent behavior: drafts come back stamped DRAFT, issued invoices additionally carry pdf_url, and pdf_base64 is large and issued-only. The unauthenticated, one-click nature of pdf_url is disclosed, which is important operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output shape is front-loaded and every sentence is actionable, though the prose is conversational and the with_pdf fallback is explained twice across description and schema. Slightly tighter phrasing would eliminate the only 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 fully carries the return contract — page image, pdf_url after issue, optional pdf_base64 — plus the pre/post-issue distinction an agent needs to call it correctly. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so page, with_pdf, and invoice_id are already documented. The description restates the with_pdf fallback rationale and the 1-based page convention, adding only mild emphasis rather than new meaning. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the concrete outputs — a rendered page image and, once issued, a direct PDF download link — which immediately separates it from the JSON-returning solo_get_invoice. Verb (render/fetch document) and resource (invoice document) are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit lifecycle guidance: call before issuing to inspect the DRAFT-stamped render, call again after issue to hand back pdf_url. It also states when NOT to use a mode ("with_pdf=true exists only as a fallback") and warns against relaying bytes, which routes the agent away from wrong behaviors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_get_invoiceInvoiceBRead-onlyIdempotentInspect
The whole document: lines, totals, frozen seller block, what is applied and open, and the shareable doc link.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | e.g. INV-0001. |
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 genuine value beyond that by enumerating the returned payload — lines, totals, frozen seller block, applied vs. open amounts, and a shareable doc link — which matters since there is no output schema. It stops short of noting failure behavior for an unknown invoice_id.
Agents need to know what a tool does to the 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 compact sentence with no filler; the substantive content (document contents) is front-loaded. It is a fragment rather than a sentence, which costs a little clarity but wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full annotation coverage, the description covers what is returned well enough to replace a missing output schema. What it omits — that it is a lookup by ID and what happens on a missing or voided invoice — are small but real 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 single invoice_id parameter carries an example format ("INV-0001"). The description adds nothing about the parameter, so the baseline 3 applies — 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?
"The whole document" implies a full-detail retrieval of an invoice, and the listed contents (lines, totals, seller block) make the resource recognizable. But there is no explicit verb (fetch/get/return) and no differentiation from close siblings like solo_get_document or o2c_get_invoice, so an agent must infer 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?
The description gives no guidance on when to call this versus solo_get_document, solo_outstanding, or o2c_get_invoice. It also never states the prerequisite that a valid invoice_id must exist, so selection depends entirely 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.
solo_get_reminderReminderCRead-onlyIdempotentInspect
One reminder with its invoice's open amount now.
| Name | Required | Description | Default |
|---|---|---|---|
| reminder_id | Yes | e.g. REM-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior, and closed-world scope, so the safety profile is covered. The description adds that the returned reminder includes its invoice's open amount, which is useful return context, but it does not describe other return fields or any access constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and front-loads the resource, but the phrasing 'with its invoice's open amount now' is awkward and slightly ambiguous. It is concise but under-specified rather than efficiently complete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only getter with full schema coverage and rich annotations, the description gives minimal but adequate context. It mentions one returned field, the invoice open amount, but does not describe the rest of the reminder payload, which matters because there is 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?
Schema coverage is 100% and the single required parameter, reminder_id, is documented with an example. The description adds no parameter-level detail beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description indicates retrieval of a single reminder and adds that its invoice's open amount is included, which is useful. However, it lacks an explicit verb and does not clearly distinguish itself from sibling tools like solo_reminders, relying on the name and singular phrasing to imply the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus solo_reminders, solo_reminder_outcome, or solo_get_invoice. The word 'now' hints at current open amount but does not establish usage conditions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_issue_invoiceIssueAInspect
Make it real: freeze the seller and bill-to blocks, set the due date; the preview link becomes the document. Issuing is the point of no return (S-2): the seller block freezes from your company profile and the bill-to block from the customer (S-3), the due date is computed from the draft's terms, and the preview link becomes the document. Show the person the preview (doc_path) and the full numbers and get their confirmation BEFORE calling this. Refused without a company profile or a customer billing address — the refusal says what to gather. After: call solo_get_document and hand the person pdf_url — a direct download of the finished PDF; they send it themselves (S-7). Do not relay the bytes. Effects: invoice issued and immutable; seller and bill-to blocks frozen; document link final; PDF available.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The draft to issue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses irreversibility ('point of no return'), what gets frozen, the precondition failures, and the post-call hand-off. Annotations already cover non-readonly, non-idempotent behavior, so the description adds real value; it could state more about what a failed/partial issue leaves behind.
Agents need to know what a tool does to the 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 effects, and the ordering guidance is useful. Mild redundancy: 'the preview link becomes the document' appears twice and the freeze/due-date behavior is restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a one-parameter mutation tool with no output schema, the description covers preconditions, confirmation protocol, effects, failure behavior, and the required follow-up call — everything an agent needs to invoke it responsibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (invoice_id) with 100% schema coverage, so the schema already documents it. The description adds the context that it must be a draft, but no format/source details 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 (issue the draft invoice) and describes the concrete effects: seller and bill-to blocks frozen, due date computed, preview link becomes the document. It is clearly distinguishable from siblings like solo_draft_invoice and solo_update_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 to show the preview (doc_path) and numbers and get confirmation BEFORE calling, and to call solo_get_document afterward and hand over pdf_url. It also names preconditions (company profile, customer billing address) and says the refusal message tells you what to gather.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_outstandingOutstandingARead-onlyIdempotentInspect
Who owes what: issued, unpaid invoices oldest first, with days overdue and the total open. This is the morning read. Chasing is the freelancer’s act — the system never sends anything.
| 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, destructiveHint=false and closed-world, so safety is covered. The description adds value beyond them: sort order (oldest first), the derived fields returned (days overdue, total open), and an explicit negative capability — 'the system never sends anything' — which prevents the agent from assuming it triggers dunning.
Agents need to know what a tool does to the 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 content of the result before the behavioral caveat. The color phrases ('the morning read', 'Chasing is the freelancer's act') are mildly decorative but do convey intent and scope of responsibility, so they largely earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so at a high level: sort order, per-item overdue age, and an aggregate open total. It stops short of naming exact fields, currency handling, or whether partially paid invoices are included, which would be needed for a full 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?
The tool takes no parameters and the schema is an empty closed object, so there is nothing to disambiguate. Baseline 4 applies; the description correctly avoids inventing filtering arguments that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb-and-resource: 'issued, unpaid invoices oldest first, with days overdue and the total open.' An agent knows exactly what data comes back and in what order. It does not name a sibling it is distinct from (e.g. o2c_ar_aging or solo_reminders), 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?
'This is the morning read' implies a routine day-start check, which is real usage context. But there is no explicit when-not and no routing to alternatives like solo_reminders (for chasing actions) or o2c_ar_aging (for bucketed aging), leaving the agent to infer boundaries among many overlapping receivables tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_record_paymentRecord paymentAInspect
Money arrived. Recording it and deciding what it settles are two acts. Never guess which invoice a payment is for — unapplied is a valid, visible state. Ask, or leave it unapplied. Effects: payment recorded as unapplied.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount received. In cents (integer minor units) — 1250 means $12.50. | |
| method | No | How it arrived. | |
| currency | No | Currency the money arrived in, ISO 4217. Defaults to the company default; a payment only ever settles invoices in its own currency. | |
| reference | No | Transfer reference, check number — exactly as shown. | |
| customer_id | Yes | Who paid. An existing customer id. | |
| received_at | No | Value date. Defaults to today. ISO date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation. The description adds real value beyond that by naming the resulting state ("payment recorded as unapplied") and warning against inferring settlement. It does not warn about duplicate submissions despite idempotentHint=false, which is a meaningful gap for a payment-recording 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?
Short, front-loaded and the critical constraint (don't guess the invoice) sits before the effects line. The opening fragment "Money arrived." is atmospheric rather than informational, but it costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation with no output schema, the description covers the key postcondition and the main misuse risk. It could go further on duplicate handling and on how the unapplied balance is later settled, but the essential call-time knowledge 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 description coverage is 100% and the property descriptions are unusually rich (cents units, ISO currency, currency-matching rule, value date). The description adds nothing parameter-specific beyond the applied/unapplied outcome, 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 states a specific action on a specific resource (record an incoming payment) and draws a conceptual boundary against the settlement step, which maps onto the sibling solo_apply_payment. It never names that sibling outright, so an agent must infer the pairing rather than read it, which keeps it 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?
"Never guess which invoice a payment is for — unapplied is a valid, visible state. Ask, or leave it unapplied" is explicit when-to-use guidance with a stated fallback behavior. What's missing is a direct pointer to the alternative tool (solo_apply_payment) for the case where the invoice IS known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_reminder_outcomeWhat happened to a reminderAInspect
Record that the person sent a reminder, and when, or that they discarded it, and why. SENT: the person sent it from their own mailbox and is telling you so. sent_at is the day it actually went, not today by default. Never record a send nobody told you about: a reminder that did not go is the one fact here that can embarrass a person in front of a client. DISCARDED: they decided against it; the reason is for whoever drafts the next one. Effects: reminder closed as sent or discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | For discarded: why. | |
| outcome | Yes | What the person did with it. | |
| sent_at | No | When it actually went. Required when sent. ISO date, YYYY-MM-DD. | |
| reminder_id | Yes | The reminder, e.g. REM-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as a non-read-only, non-destructive, non-idempotent write; the description adds real context: the record closes the reminder, sent_at must be the actual send day rather than today's default, and the reason feeds the next draft. It does not address what happens on a repeat call or on an already-closed reminder, leaving the non-idempotent hint unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then branch semantics, then effects. The client-embarrassment line is colorful but earns its place as a guardrail against fabricated sends; the whole thing is slightly prose-heavy for a four-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return behavior, which it does with 'Effects: reminder closed as sent or discarded.' Remaining gaps are edge cases: behavior on an already-closed reminder and whether the reminder_id must 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 coverage is 100%, so 3 is the baseline, but the description goes beyond it: it clarifies that sent_at is the day it actually went rather than defaulting to today, and that reason exists for whoever drafts the next reminder. That is meaningful added semantics for two of the four parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: record a reminder's outcome as sent (with when) or discarded (with why), and closes with 'Effects: reminder closed as sent or discarded.' That distinguishes it from drafting/getting siblings, though no sibling is named explicitly to route the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use per outcome branch (SENT = they told you they sent it; DISCARDED = they decided against it) plus an explicit when-not: 'Never record a send nobody told you about.' It lacks a pointer to the alternative tool (e.g. solo_draft_reminder) for the drafting case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_remindersRemindersARead-onlyIdempotentInspect
Payment reminders: drafts waiting to be sent first, then what went and when, with a mailto link that opens each draft addressed and filled in.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only this status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent operation. The description adds useful behavioral context beyond those annotations by explaining the return ordering and noting that each draft includes a mailto link addressed and filled in.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted text. It efficiently communicates the resource, result ordering, and the mailto behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one optional filter, the description covers the main return shape and ordering without needing to explain safety, since annotations handle that. It could be slightly more complete by mentioning the status filter or the discarded state, but the core behavior is adequately described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional status parameter is fully documented in the schema as an enum with 'Only this status.' The description itself does not explain the status filter, so it adds no semantic value beyond the schema, which merits 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?
The description clearly identifies the resource as payment reminders and describes what the listing contains: drafts first, then sent reminders with timing and mailto links. It does not explicitly state a verb like 'list' or name sibling tools such as solo_get_reminder or solo_draft_reminder, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit guidance on when to use this tool versus alternatives such as solo_get_reminder, solo_draft_reminder, solo_outstanding, or solo_statement. Usage is only implied by the noun phrase 'Payment reminders' and the described ordering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_statementStatementBRead-onlyIdempotentInspect
One client, chronological: every invoice and payment with a running balance.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | The client. An existing customer id. |
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 bar is lower. The description adds genuine behavioral value with 'chronological' ordering and a 'running balance', which is the only signal about the shape of the output given no output schema. It does not state how far back the statement reaches or how missing/unissued documents are handled.
Agents need to know what a tool does to the 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 zero waste; the scoping and ordering arrive first. It is telegraphic to the point of being slightly cryptic ('One client' as an opener), but 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?
For a one-parameter read tool with full annotations this is close to sufficient, but it leaves open the reporting period question (since there is no date parameter, the caller must assume all history) and says nothing about behavior for an unknown customer id. Minimal but workable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully described ('The client. An existing customer id.'). The description's 'One client' merely confirms that customer_id selects a single client rather than filtering a list, adding little beyond the schema — the baseline 3 for high coverage 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 fragment 'One client, chronological: every invoice and payment with a running balance' clearly identifies the resource (a per-client statement), its scope (single client) and its content (invoices + payments with running balance). There is no explicit verb and no differentiation from the equally plausible sibling o2c_customer_statement, 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?
No when-to-use guidance at all, and no mention of when a caller would pick this over solo_outstanding, solo_get_invoice, or the near-identical o2c_customer_statement. The only hint is the 'one client' scoping, which the caller must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_update_draftUpdate draftAInspect
Change a draft: lines, due days, notes. Drafts are the only editable state. Once issued, an invoice is immutable (S-2) — corrections after that are void-and-reissue, on the record. Effects: draft updated, totals recomputed.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | The new full set of lines (replaces all). | |
| notes | No | ||
| subject | No | One line above the table — project, period. | |
| currency | No | Change the currency of the draft (one of the company's currencies). | |
| invoice_id | Yes | The draft, e.g. INV-0001. | |
| due_in_days | No | Days until due. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description's value is the added context: it discloses the side effect that 'totals recomputed' and the hard lifecycle constraint that issued invoices are immutable, which is exactly the kind of behaviour an agent cannot get from annotations. The '(S-2)' reference is opaque and no failure/error behaviour (wrong state, foreign currency) is described.
Agents need to know what a tool does to the 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, zero filler: it front-loads what can be changed, then the lifecycle constraint that gates use, then the observable effects. Every clause carries information an agent acts on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers the essentials: allowed mutations, the state guard, and the recompute effect. Remaining gaps are minor edge behaviour — what happens when the invoice is not a draft, or how changing currency interacts with existing lines.
Complex tools with many parameters or behaviors need more documentation. 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 83%, so the schema already carries most parameter meaning, and the description's field list ('lines, due days, notes') merely echoes a subset of the six properties while omitting subject and currency. The one genuinely thin spot, the empty `notes` description, is not compensated for in the description text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a draft') and enumerates the mutable dimensions ('lines, due days, notes'), which map directly onto the schema properties. The clause 'Drafts are the only editable state' cleanly separates it from the create (solo_draft_invoice), issue (solo_issue_invoice) and void (solo_void_invoice) siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('drafts are the only editable state') and an explicit exclusion with the correct alternative behaviour ('once issued, an invoice is immutable — corrections after that are void-and-reissue'). It stops short of naming the concrete alternative tool (solo_void_invoice) or stating what to do if the id is not a draft, so the routing is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solo_void_invoiceVoidADestructiveInspect
Kill an invoice, on the record. The number stays burned (S-4). Void is for mistakes and cancellations; the reason is part of the record. The document stays readable and printable, stamped VOID, at the same link — a record you cannot read is not a record. Nothing on it is collectible: open drops to 0. An invoice with payments applied cannot be voided at 0.1 — unwinding applied cash needs its own design (see the spec's deferred list). Reissue corrected work as a fresh draft. Effects: invoice void; number burned; open = 0; document stays readable, stamped VOID.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why — part of the record, forever. | |
| invoice_id | Yes | The invoice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only, and the description adds substantial behavior: the invoice number is burned, open balance drops to 0, the document remains readable and stamped VOID, and payments-applied invoices are blocked. This is richer than what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key action and scope are front-loaded. It is informative but somewhat repetitive, restating effects such as the burned number and readable VOID document in both prose and the final effects line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the essential effects and constraints an agent needs. It explains what happens to the invoice, the number, the balance, the document, and when voiding is blocked.
Complex tools with many parameters or behaviors need more documentation. 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. The description reinforces that the reason is permanent and part of the record, but adds little syntax or format meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Kill an invoice, on the record." The scope is clear, and the description distinguishes this action from reissuing corrected work as a fresh draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: mistakes and cancellations. It also states a key exclusion - invoices with payments applied cannot be voided at 0.1 - and gives the alternative action of reissuing corrected work as a fresh draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_filingsFilingsARead-onlyIdempotentInspect
Every filed return: the period, what was filed and paid, and whether the record has changed since.
| 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, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds real content beyond that by naming what the payload holds, including a staleness/change indicator — the one behavioral trait (records can mutate after filing) that annotations would not reveal.
Agents need to know what a tool does to the 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 the scope first and the field inventory 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?
With no output schema, the description must convey the return shape and does so at a summary level. It leaves open how records are ordered, whether the listing is paginated or bounded, and what "changed since" is measured against — minor but real gaps for a zero-parameter tool that returns everything.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly implies an unfiltered full listing rather than suggesting filters that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Every filed return" states the resource and the all-records scope, and the clause after the colon enumerates what each record carries (period, filed/paid amounts, change flag). The word "Every" implicitly contrasts with the single-record sibling tax_get_filing, though that sibling is never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: this is the bulk/list view of filings, so an agent can infer it should call tax_get_filing for one record or tax_liability/tax_return for computed figures. No explicit when-to-use, when-not, or alternative is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_get_filingFilingBRead-onlyIdempotentInspect
One filed return with its kept figures and payments.
| Name | Required | Description | Default |
|---|---|---|---|
| filing_id | Yes | e.g. TF-0001. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds that the result includes kept figures and payments, but it does not mention missing-record behavior or error handling.
Agents need to know what a tool does to the 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 redundant or filler content. For a simple single-record retrieval tool, this is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, has one fully documented required parameter, and rich read-only annotations. The description states the returned entity and its key contents, though it could say more about lookup failure behavior or exact return structure since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and filing_id is documented with an example ('e.g. TF-0001'). The description does not add any filtering, formatting, or lookup semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a single filed return and mentions the figures and payments it carries, which is more specific than the title 'Filing'. It implies retrieval of one record, but it does not explicitly contrast with siblings like tax_filings or tax_return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit instruction on when to use this tool versus tax_filings, tax_return, or tax_record_filing. The single-record scope is only implied by 'One filed return' and the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_liabilitySales tax owedARead-onlyIdempotentInspect
Sales tax owed as of a day, beside Sales Tax Payable in the books, and each month: due, filed, paid, or not filed.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | The day. Defaults to today. ISO date, YYYY-MM-DD. |
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 genuine value beyond that by disclosing the return content: the figure is reconciled against the Sales Tax Payable book balance and broken out per month by filing state. It stops short of describing format or units.
Agents need to know what a tool does to the 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 compact sentence with the resource front-loaded and no filler. The phrasing 'beside Sales Tax Payable in the books' is slightly oblique and could be tightened, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns, and it does sketch the shape — a liability figure plus a per-month status classification. For a one-optional-parameter read tool with full annotation coverage, that is close to sufficient; only the precise numeric output shape is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single optional 'as_of' parameter is fully documented in the schema, including the ISO format and today-default. The description's phrase 'as of a day' merely echoes the parameter without adding new semantics, which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: sales tax owed as of a given day, plus per-month status (due/filed/paid/not filed). An agent can tell this is a computed liability view rather than a filing-record tool like tax_filings or tax_return, though the description never names those siblings to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 — an agent infers it should call this when it wants to know how much sales tax is owed. There is no explicit when-to-use, no exclusion against tax_return/tax_filings, and no mention of prerequisites such as whether filings must exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_record_filingRecord a filed returnAInspect
Record that a sales tax return was filed for a period: what was filed, when, with whom, and the confirmation. The return is kept as it stood. HUMAN-ONLY: this act is refused to you whatever your role — Filing a sales tax return is the person's signature to the tax agency. Ask your human to do it. The person files on the agency's site, then records it here: the period, the amount filed, the day and the confirmation. An agent prepares the return (tax_return) and shows it, and is refused this record whatever its role. An amount that differs from the return needs a reason; a later change to a filed period shows as changed since. Effects: return recorded as filed, kept as it stood with a hash.
| Name | Required | Description | Default |
|---|---|---|---|
| agency | No | Who it was filed with: "California CDTFA". | |
| period | Yes | The period filed: a month (2026-09) or a quarter (2026-Q3). | |
| reason | Yes | For the record: "September return, filed online". | |
| filed_on | Yes | The day it was filed. ISO date, YYYY-MM-DD. | |
| reference | No | The confirmation number the agency gave. | |
| filed_amount | Yes | The amount the return filed says is due. In cents (integer minor units) — 1250 means $12.50. | |
| difference_reason | No | Only when the amount filed differs from the return here: why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the authorization model (human-only, refused to any agent role), immutability semantics (kept as it stood, hashed), and downstream consequences (a later change to a filed period shows as 'changed since'; a differing amount requires a reason). Minor gap: it doesn't state whether re-recording the same period is rejected or overwritten, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and then the human-only restriction, with effects last — good ordering. The refusal is stated twice ('refused to you whatever your role' and 'is refused this record whatever its role'), which is redundant in a definition this size.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation with no output schema, the description covers purpose, authorization, the prepare-then-record workflow split, immutability, and the differing-amount rule. An agent has everything needed to know it should hand this off and what the record will contain.
Complex tools with many parameters or behaviors need more documentation. 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 adds some value by naming the substantive fields (period, amount filed, day, confirmation) and by flagging the conditional rule for a differing amount. It doesn't clarify the distinction between the required `reason` and the conditional `difference_reason`, which are easy to confuse.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Record that a sales tax return was filed for a period') and enumerates exactly what the record captures: what was filed, when, with whom, and the confirmation. It also separates itself from the sibling tax_return, which prepares the return rather than recording it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 sets the boundary: agents are refused regardless of role, the human files on the agency's site and then records it here. It names the alternative workflow (tax_return for preparing/showing) so there is no ambiguity about who calls this and when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_record_paymentRecord the tax paymentAInspect
Record that a filed return was paid: the day, the amount and the reference. It clears the liability, and the bank reconciliation waits for the statement row that shows it. Record a payment after it happened, against the filing it pays, with the day it went and the agency's reference. Never more than the filing still owes. Nothing here pays anything. The payment then waits in the bank reconciliation like any recorded payment until the statement shows it. Effects: payment recorded against the filing; the liability goes down by it.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | How much was paid. In cents (integer minor units) — 1250 means $12.50. | |
| method | No | How it went. | |
| reason | No | For the record. | |
| paid_on | Yes | The day it was paid. ISO date, YYYY-MM-DD. | |
| filing_id | Yes | The filing it pays, e.g. TF-0001. An existing tax_filing id. | |
| reference | No | The agency's confirmation for the payment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important effects: the payment is recorded against the filing, the liability decreases, nothing is actually paid, and the payment waits in bank reconciliation until the statement appears. It does not cover permissions or duplicate-handling details, but adds substantial behavioral context beyond the annotation hints.
Agents need to know what a tool does to the 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 essential information is front-loaded, but the description repeats the bank reconciliation waiting concept in both the first and later sentences, and partly restates the recording action. It is reasonably sized but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations and no output schema, the description is largely complete: it explains the effect on liability, the constraint on amount, the downstream reconciliation state, and what the tool does not do. It could be fuller on error or duplicate-payment behavior, but covers the core needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantic constraint not present in the schema, especially that the amount must never exceed what the filing still owes, and reinforces that filing_id refers to the filing being paid and reference is the agency confirmation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: recording that a filed tax return was paid, including the day, amount, and reference. It clearly situates the action against a filing, but does not explicitly name or contrast with sibling tools such as tax_record_filing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: record only after payment happened, against the filing being paid, with the paid date and agency reference, and never for more than the filing still owes. It also clarifies that the tool does not initiate payment. It does not explicitly name alternative tools for related actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_returnSales tax returnCRead-onlyIdempotentInspect
The return for a period: taxable and non-taxable sales, the tax charged by rate, the tax given back on credits, what is due, and changes to periods already filed.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | And the last day. ISO date, YYYY-MM-DD. | |
| from | No | Or the first day. ISO date, YYYY-MM-DD. | |
| period | No | A month (2026-09), a quarter (2026-Q3) or a year. | |
| currency | No | Only when the books hold more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds the return's composition and notes changes to previously filed periods, but omits auth/permission needs, calculation timing, return format, and how period and date-range parameters interact.
Agents need to know what a tool does to the 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 compact sentence with a colon-delimited list; no filler. However, the noun-phrase opening omits the action, making it slightly less front-loaded than an explicit verb would 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?
The tool is read-only and all four parameters are optional, and the schema documents them fully. Without an output schema, the description lists the return's components, but it doesn't explain defaults, parameter interactions, or the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with descriptions for to, from, period, and currency. The description only hints at 'period' and does not add syntax or precedence rules, so it relies on 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 names the resource and enumerates its contents, but it never states the operation (retrieve, calculate, preview) and does not differentiate it from tax_filings, tax_get_filing, or tax_liability. An agent must infer that it returns a sales tax return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are provided. It does not explain when to choose this over tax_liability or tax_get_filing, nor how period/from/to should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Publisher details
- Operator
- Crankk Inc
- Operator website
- https://saybooks.io/
- Vendor relationship
- Not applicable
- Documentation
- https://saybooks.io/docs#connect
- Trust center
- Not applicable
- Restrictions
- Not applicable
Related MCP Connectors
Your longbook of bills, subscriptions and expenses, for your AI to read and to suggest changes to.
Double entry accounting run by your own AI: books, VAT figures, invoices, month close (UK, DE, AT).
- FinStatOAuthai.finstat
Documents in, reconciled double-entry books out. Statements, invoices, receipts, matched and posted.
- OrlaOAuthfinance.orla
Personal, family and business books over fiat and crypto. Reads and records; it cannot pay.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables an AI assistant to read Portuguese invoices and receipts, file them by tax year, and book them into an Excel or Google Sheets workbook. It works out the boxes of the quarterly IVA return, tracks IRS and Segurança Social totals, and reports what documents are still missing.16MIT

Ekwo OS — open sourceofficial
AlicenseNot gradedqualityAmaintenanceDouble-entry books an agent keeps as the user, on your own Postgres or Supabase: invoices, VAT returns, bank reconciliation, financial statements and 130 country packs.41AGPL 3.0- AlicenseNot gradedqualityBmaintenanceEnables an AI agent to propose and book bank transactions, split card collections, link receipts, and learn from approved bookings through an accounting web app's API.MIT
- AlicenseNot gradedqualityCmaintenanceEnables natural-language access to personal finance data, including consolidated balances, monthly overviews, transaction search, credit card invoices, recurring bills, budgets, category/tag reports, cash flow forecasts, and Open Finance status, with optional read/write tools.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.