Skip to main content
Glama

Server Details

AI bookkeeper for Swiss small companies: books invoices, reconciles the bank, keeps VAT current.

Ownership verified
Status
Healthy
Uptime
100.0% over 20 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

C2.7/5.0

Scored across 51 tools

Disambiguation3/5

Many tools are clearly distinct, but several clusters overlap: get_financial_statements vs. gl_balance_sheet/gl_trial_balance/gl_profit_and_loss, get_bank_status vs. reconciliation_summary, upload_document vs. upload_intake, and request_api_key vs. start_signup. Detailed descriptions mitigate most confusion, but bare names like entry_candidates and get_item/get_intake remain ambiguous.

Naming Consistency3/5

Most names use snake_case and many follow a verb_noun pattern, but the set mixes action tools with noun-only report/meta tools such as gl_balance_sheet, customer_statement, zeno_info, and whoami. The convention is readable but not consistent across the whole surface.

Tool Count2/5

51 tools is far above the typical well-scoped range and creates a large selection surface. Since find_operations/describe_operations/call_operation already expose hundreds of unlisted operations, many specialized listed tools add bloat rather than necessary discoverability.

Completeness3/5

The surface covers broad accounting domains: auth, onboarding, uploads, AR invoices, GL journals, reports, bank data, payroll reads, VAT periods, and search. However listed tools have notable gaps, such as no draft invoice update/cancel/credit-note path, no counterparty or company creation, and limited payroll/VAT mutation operations, though call_operation provides a workaround.

Available Tools

51 tools
accept_autopost_decisionAInspect

One-click accept of a held decision (accountant) — posts the AI's proposal.

A person's accept overrides the soft guardrails. An agent's is refused (403) unless the row is agent_acceptable or an expense receipt. Closed period, sealed year, unknown account: 409/422. The row flips held → posted (again: 409); accepted_by_kind records the channel (mcp over MCP).

Optional body: expense:receipt:item: needs employee_id + category_id; autopost:capitalize: needs fixed_asset_category_id when the hold has none, and needs_split_source a reclassify_from_account_code.

NameRequiredDescriptionDefault
bodyNo
company_idYes
decision_idYes

TDQS

A4.5/5.0
Behavior5/5

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

With zero annotations the description carries the full burden and does so richly: the held → posted state flip, 409 on repeat accept, 409/422 for closed period, sealed year and unknown account, the 403 authorization split between human and agent, and the accepted_by_kind audit field (mcp over MCP). Nothing about safety or side effects is left to guess.

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

Conciseness4/5

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

Front-loaded with the core action, then error codes, then body variants — a sensible order where every sentence carries information. RST-style double-backtick markup and telegraphic fragments ('and ``needs_split_source`` a ``reclassify_from_account_code``') make it denser to parse than necessary.

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

Completeness4/5

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

A conditional-body mutation tool with no annotations and no output schema, and the description covers the correctness-critical pieces: authorization, failure modes, state transition and per-kind body requirements. What it omits is the success response shape and the meaning of the remaining body flags, 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.

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does for the hardest part: body requirements are spelled out per hold kind — expense:receipt:item: needs employee_id + category_id, autopost:capitalize: needs fixed_asset_category_id when absent and needs_split_source needs reclassify_from_account_code. It leaves separate_document, useful_life_months and confirm_not_card_statement undocumented, so the conditional `body` object is only partially covered.

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

Purpose5/5

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

States a specific verb and resource ('accept of a held decision') plus the concrete effect — 'posts the AI's proposal' — so an agent knows exactly what changes. The 'held' qualifier and the sibling list_autopost_decisions make the boundary obvious without opening a schema.

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

Usage Guidelines4/5

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

Gives strong when-it-works / when-it-fails guidance: a person's accept overrides guardrails, an agent's is refused (403) unless the row is agent_acceptable or an expense receipt. It does not name an alternative tool to use when the row is not agent-acceptable, so the fallback path is left implicit.

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

call_operationAInspect

Run any operation by name — the ones in your tool list and the unlisted ones alike.

name is an operation name from find_operations; arguments is the object described by describe_operations (omit it for an operation that takes none). The result, and any error, are exactly what calling the operation directly would give you.

NameRequiredDescriptionDefault
nameYes
argumentsNo

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses one important trait — the result and any error are identical to a direct call — but says nothing about whether the invoked operation may be destructive, whether it needs specific permissions, or whether it is idempotent, all of which matter for a generic 'run anything' tool.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core action and each subsequent sentence adding distinct value: parameter sourcing, then return/error equivalence. No filler.

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

Completeness4/5

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

With no output schema or annotations and a low-coverage schema, the description supplies the missing sourcing guidance and return behavior, and defers detail to describe_operations. The notable gap is the absence of any warning that dispatched operations may mutate data.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: it explains that `name` is an operation name sourced from find_operations and that `arguments` is the object described by describe_operations, including the null/omitted case. It does not give a concrete format example, but the origin and structure of both parameters are covered.

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

Purpose4/5

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

States a specific verb and resource: 'Run any operation by name', and clarifies scope by noting it covers both listed and unlisted operations. It distinguishes itself from siblings by tying directly into the find_operations/describe_operations workflow, though the dispatcher framing could be sharper.

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

Usage Guidelines4/5

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

Gives clear context for use: name comes from find_operations, arguments from describe_operations, and there is an explicit rule to omit arguments for zero-arg operations. It stops short of an exclusion rule (e.g. when to call a listed sibling tool directly instead of routing through this dispatcher).

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

collect_api_keyAInspect

Collect the key once the user has approved.

status is one of:

  • pending — nobody has approved yet, or (with throttled: true) we were rate-limited and learned nothing. Wait poll_interval_seconds, then call again — every answer carries it. Do not ask the user to tell you when they are done: you cannot detect it any other way, and handing the wait back to the user is how these sessions die.

  • ready — api_key is the credential. Follow the note that comes with it before anything else: the key does nothing until the client's configuration holds it, and calling again issues nothing. scope says what it can reach (onboarding, company or full) and company_id which company, if any. When scope is onboarding the user has no company yet and this key exists to make one: call onboarding_guide next — it needs no key, so read it while the user installs this one. It is the only place that says which documents to ask them for, and asking for them all at once is the difference between one conversation and seven.

  • collected — this request already issued its key and nothing new was issued. Follow the note.

  • denied — stop. Do not start another request; a human refused it ("that was not me"). Raising a second one is how a refusal turns into a prompt the user has to refuse repeatedly.

  • expired — the request timed out. Do not simply open another one, and what to do depends on which door you opened, which only you know. request_api_key: ask whether they saw the approval page, and call it again if they want to retry. start_signup: they may have finished registering in the browser meanwhile, in which case they now HAVE an account and request_api_key is the path — ask. If they did not, tell them plainly that it timed out; starting another signup without asking is how a refusal turns into a prompt they have to refuse repeatedly.

A pending answer is a success, not an error; it is deliberately not an error status, because an error would be read as "do not retry" and retrying is the entire protocol. A rate limit mid-wait is reported the same way, with throttled: true and a longer poll_interval_seconds — slow down, do not stop.

NameRequiredDescriptionDefault
claim_tokenYes

TDQS

A4.1/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses that pending is deliberately not an error because errors read as 'do not retry', that collected means idempotently nothing new was issued, that api_key must be installed via the accompanying note before it works, and that scope governs reach. It also surfaces the rate-limit-becomes-throttled behavior and the longer poll interval.

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

Conciseness4/5

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

Front-loaded with purpose and organized as a scannable status list, which is the right shape for a state machine. It is dense but mostly earns its length, with only mild repetition in the denied/expired branches about refusals turning into repeated prompts.

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

Completeness4/5

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

No output schema exists, so the description must define the return contract, and it does thoroughly: the full status enum, the presence of api_key, note, scope, company_id, throttled, and poll_interval_seconds. What is missing is the provenance of claim_token and any stated default for poll_interval_seconds.

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

Parameters2/5

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

The single input parameter, claim_token, has 0% schema description coverage and is never mentioned in the description — its origin and format are unexplained. The description details output fields (status, api_key, note, scope, company_id, throttled, poll_interval_seconds) but that does not compensate for the undocumented required input.

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

Purpose4/5

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

States a specific verb and resource ('Collect the key') plus the precondition ('once the user has approved'), so an agent knows this is the polling/retrieval half of the key flow. It references request_api_key, start_signup, and onboarding_guide in the status branches, giving implicit sibling differentiation, but the opening sentence alone does not explicitly distinguish this tool from the two ways a claim is created.

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

Usage Guidelines5/5

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

It gives explicit when-to-call guidance (only after approval), a per-status action map, named alternatives, and explicit prohibitions ('denied — stop', 'do not simply open another one'). The retry protocol, including the throttle backoff, is spelled out rather than left to inference.

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

create_ar_invoiceAInspect

Create an outgoing (sales) invoice as a draft — nothing is booked yet (accountant role).

A draft changes no ledger balance, gets no invoice number and appears in no VAT return; it exists so it can be edited. Posting happens later, at POST …/ar/invoices/{invoice_id}/issue.

Body: issue_date (required), counterparty_id (the customer — required before it can be issued), currency/language, due_date (filled from the customer's payment terms when omitted), doc_type (invoice, the default — a credit_note draft can never be issued: credit an issued invoice with POST …/ar/invoices/{invoice_id}/credit-note instead), and lines: each line carries quantity, unit_price, a revenue account_code and a vat_code_id (the id from GET …/gl/vat-codes; a line without one declares no VAT). Totals, per-line net/VAT/gross and discounts are computed server-side — do not send them.

Returns the created invoice with its lines and computed totals. Check GET …/ar/invoices/{invoice_id}/readiness for what still blocks issuing.

NameRequiredDescriptionDefault
linesNo
notesNo
currencyNoCHF
doc_typeNoinvoice
due_dateNo
languageNo
company_idYes
issue_dateYes
legal_textNo
footer_textNo
counterparty_idNo
payment_terms_idNo
issuer_profile_idNo
service_period_endNo
credited_invoice_idNo
service_period_startNo
invoice_discount_kindNonone
invoice_discount_valueNo0

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden and does so richly: a draft changes no ledger balance, gets no invoice number, appears in no VAT return; the accountant role is required; totals/VAT/discounts are computed server-side and must not be sent; issuing is a separate call. This is the behavioral context an agent needs for a mutation tool.

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

Conciseness5/5

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

Front-loads the single most important fact (this creates a DRAFT, nothing is booked), then organizes the body parameters, then the return value and the readiness check. Every sentence carries new information; nothing is redundant.

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

Completeness4/5

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

For an 18-parameter mutation tool with no annotations and no output schema, the definition covers the draft semantics, required fields, key body fields, server-side computation, and the return shape ('created invoice with its lines and computed totals'). It falls short only on the secondary draft fields, which an agent may still have to infer from schema alone.

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

Parameters4/5

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

With 18 parameters and 0% schema description coverage, the description compensates well for the tricky ones: issue_date and counterparty_id requirements, currency/language, due_date defaulting from payment terms, doc_type semantics, line quantity/unit_price/account_code/vat_code_id, and the 'do not send totals' rule. However, roughly half the schema is unexplained (payment_terms_id, issuer_profile_id, credited_invoice_id, service periods, invoice/line discount kinds and values, legal/footer/notes text).

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

Purpose5/5

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

States a specific verb+resource+lifecycle state: 'Create an outgoing (sales) invoice as a draft.' It clearly distinguishes itself from the sibling issue_ar_invoice by naming the later posting step, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it (draft exists so it can be edited; posting happens later at POST …/ar/invoices/{invoice_id}/issue) and when NOT to use it for credit notes (a credit_note draft can never be issued — use POST …/credit-note instead). Names alternatives and the conditions that select them.

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

create_gl_journal_entryAInspect

Create a draft journal entry by hand — accountant. It carries NO source document unless you name one.

Only the pipeline paths stamp source_ref_type/source_ref_id (an ingested document is 'item'), so by default a booking made here cannot be traced back to what justified it. document_id is the retrofit: name an existing gl_document (create one with POST …/gl/documents) and it is attached as the entry's source document, so the entry is not evidence-less. The same attach is available afterwards at POST …/gl/journal-entries/{id}/documents — including on a posted entry.

Use it for bookings with genuinely no document behind them — reclassifications, provisions, accruals, year-end adjustments. Do not transcribe a document into it and then attach the file — that files the evidence beside a booking nobody derived from it. Each of these has a door that keeps the evidence attached:

  • an invoice, receipt or statement → ingest the file (POST …/uploads/ or …/intake), then accept what the coder proposes (…/autopost-decisions);

  • an already-ingested item → POST …/gl/items/{item_id}/coding;

  • a bank movement with no document → POST /bank-entries/{entry_id}/manual-coding;

  • opening balances → POST …/opening-entries and post the proposal.

auto_reverse_date arms the entry as a one-shot accrual (ZCT-527): once posted, the auto-reversal executor reverses it in full on/after that date. It must be after posting_date (422 otherwise), and it can only be set while the entry is a draft — on the create here or on the PUT replace.

Drafts do not touch the books until …/post. See doc/pipeline.md §"Accounting".

NameRequiredDescriptionDefault
linesYes
currencyNo
period_idYes
company_idYes
entry_typeNomanual
descriptionNo
document_idNo
posting_dateYes
auto_reverse_dateNo

TDQS

A4.5/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden and does so: it states the entry is a draft, that it does not touch the books until …/post, that source_ref_type/source_ref_id are defaulted by pipeline paths only, that document_id is the retrofit attach (also available post-creation on a posted entry), and that auto_reverse_date must be after posting_date (422 otherwise) and can only be set while draft. That is exactly the mutation/permission/reversibility 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.

Conciseness4/5

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

Long but front-loaded with the crucial 'draft / no source document' fact, then the routing alternatives, then the auto_reverse constraint. The bulleted sibling routing is dense and earns its space, though the prose around the document attach paths is slightly repetitive.

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

Completeness4/5

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

For a complex 9-param mutation tool with no annotations and no output schema, the description covers creation semantics, draft/post lifecycle, evidence attachment, and auto-reversal well. It stops short of explaining the line structure (line_role semantics, amount_base vs amount_currency, open_item behavior beyond the schema snippet), leaving a gap for the core booking payload.

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

Parameters3/5

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

Schema description coverage is 0% at the top level, so the description must compensate; it thoroughly explains document_id and auto_reverse_date (constraints, timing, 422), but leaves entry_type (13-value enum), line_role (16-value enum), the lines array shape, currency, period_id, company_id, and description field unexplained. Partial compensation for a 9-parameter tool.

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

Purpose5/5

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

States a specific verb + resource (create a *draft* journal entry by hand) and immediately nails the distinguishing trait: no source document unless one is named. This lets an agent separate it from post_gl_journal_entry and the ingestion/coding siblings without opening a schema.

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

Usage Guidelines5/5

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

Explicit when-to-use (reclassifications, provisions, accruals, year-end adjustments) and when-not ('Do not transcribe a document into it and then attach the file'), then routes each document-backed case to the correct sibling endpoint (uploads/intake → autopost-decisions, items/{id}/coding, bank-entries/manual-coding, opening-entries). 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.

customer_statementBInspect

One customer's open items + totals (the aging row's drill-down).

as_of mirrors GET …/ar/aging — set, it reconstructs the items open at that date so the statement agrees with a historical aging report.

NameRequiredDescriptionDefault
as_ofNo
company_idYes
counterparty_idYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the key behavioral trait that `as_of` reconstructs historically-open items so results agree with a historical aging report, and it implies a read operation. But it omits auth/permission requirements, pagination, and confirmation that the operation is non-mutating.

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

Conciseness4/5

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

Two short passages with the core identity front-loaded and the `as_of` nuance following. Efficient, though the heavy backtick/typographic formatting adds noise without adding meaning.

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

Completeness3/5

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

For a read tool with no output schema and no annotations, the description conveys what comes back ('open items + totals') and the `as_of` semantics. It stops short of describing the totals' composition, result shape, or limits, leaving modest gaps for a financial drill-down tool.

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

Parameters3/5

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

Schema description coverage is 0%, so compensation is required. The description explains the one non-obvious parameter, `as_of`, in real depth (historical reconstruction semantics, parity with the aging endpoint), but leaves `company_id` and `counterparty_id` purely reliant on self-explanatory names.

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

Purpose4/5

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

The description states a specific resource and scope: 'One customer's open items + totals', and frames it as 'the aging row's drill-down', which lets an agent distinguish it from broader statement/report siblings. It is a noun phrase rather than a verb+resource, but the returned content is unambiguous.

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

Usage Guidelines3/5

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

The parenthetical 'the aging row's drill-down' implies when to reach for it (drilling into a customer's aging row), which is useful contextual usage guidance. However, it names no alternative sibling and no explicit when-not condition, so the routing signal remains implicit.

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

describe_operationsAInspect

Get the full argument schema for operations found via find_operations.

Returns each operation's description and JSON-Schema arguments — everything a listed tool would have shown you.

include_output_schema is the ONLY way to obtain an operation's result shape: tools/list publishes no output schema for any operation, listed or not (they are 67 % of the payload, and a schema describing a result is not what you need to choose a tool). Ask for it when you must know the shape in advance; the result itself comes back as JSON either way, so usually you do not.

Up to 10 operations per call; anything beyond that is reported in omitted rather than dropped.

NameRequiredDescriptionDefault
namesYes
include_output_schemaNo

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses the return contents (description + JSON-Schema arguments), the effect of include_output_schema, the 10-operations-per-call cap, and that overflow is surfaced in 'omitted' rather than dropped. It does not state auth requirements or explicitly that the call is read-only, but the retrieval framing makes the safety profile self-evident.

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

Conciseness4/5

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

The core action is front-loaded in the first sentence, and the limit/omitted behavior closes cleanly. The middle paragraph on include_output_schema is somewhat verbose, with an opinionated parenthetical about payload composition, but it remains informative rather than padding.

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

Completeness4/5

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

There is no output schema, yet the description explains what comes back (description, arguments, or result shape when requested, plus 'omitted'). Combined with the disclosed batch limit, this is nearly complete for a discovery meta-tool; only auth and error behavior are unaddressed.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It gives meaningful semantics for include_output_schema (the only route to a result shape, and when to request it) but leaves 'names' to inference — the reader must deduce these are operation identifiers from find_operations. Half the parameters are covered, half are not.

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

Purpose5/5

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

The first sentence states a specific verb and resource ('Get the full argument schema for operations') and scopes it to operations 'found via find_operations'. It clearly differentiates itself from the sibling find_operations (which lists) and from call_operation (which invokes), so an agent can route correctly without opening any schema.

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

Usage Guidelines4/5

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

It gives explicit guidance for the optional parameter ('Ask for it when you must know the shape in advance... usually you do not') and ties its use to find_operations as the discovery prerequisite. It stops short of stating when NOT to use this tool (e.g., when the operation is already a listed tool) and doesn't address error/auth preconditions.

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

entry_candidatesDInspect

Entry Candidates

NameRequiredDescriptionDefault
entry_idYes

TDQS

D1/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing: no read/write nature, no data source, no rate limits, no return shape. It is a bare label rather than a behavioral statement.

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

Conciseness1/5

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

Two words with no front-loaded information at all; this is under-specification rather than conciseness. There is nothing for an agent to act on.

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

Completeness1/5

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

With no annotations, no output schema, an undocumented required parameter, and 47 similarly named siblings, the description is nowhere near complete enough to invoke the tool correctly.

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

Parameters1/5

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

Schema description coverage is 0% and the single required parameter entry_id has no description in either the schema or the tool description. The description does not even acknowledge that a parameter exists or what identifier it expects.

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

Purpose1/5

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

"Entry Candidates" merely restates the tool name and supplies no verb, object, or outcome. An agent cannot tell whether this lists, computes, ranks, or filters candidates, nor what an "entry" is in this domain.

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

Usage Guidelines1/5

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

No when-to-use guidance, no prerequisites, and no mention of any of the 47 sibling tools such as settle_entry, get_bank_entry, or list_gl_journal_entries that an agent would need to disambiguate against.

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

find_operationsAInspect

Search EVERY operation this server offers, including the ones not in your tool list.

The tool list you can see holds only the common operations. Several hundred more — payroll, VAT returns, year-end close, fixed assets, expenses, cash book, settings, integrations, onboarding — are available but unlisted, and this is how you find them. Search here before concluding that Zeno cannot do something.

Call with no arguments to browse the catalogue of areas (tags) with their operation counts; with tag to list one area; with query to search by keyword. Every word contributes and matching all of them doubles the score, so extra words widen the search rather than narrowing it — the AND-then-fall-back- to-OR behaviour this said before was removed in ef47aa9ab. A word matching an operation's name counts for far more than one found in its description, so prefer the noun you are looking for over a sentence.

limit is capped at 100 per call; when more matched, next_offset gives the offset that returns the following page, so an area of any size can be read in full. Paging is stable — the ranking is deterministic and the registry is fixed at startup, so no operation is dropped or repeated between pages.

Pass a promising name to describe_operations for its arguments, then run it with call_operation.

NameRequiredDescriptionDefault
tagNo
limitNo
queryNo
offsetNo

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so generously: it discloses the scoring model (all words must match, matching all doubles the score, extra words widen rather than narrow, name matches outweigh description matches), the 100-item cap, deterministic/stable paging, and a startup-fixed registry so no operation is dropped or duplicated across pages. These are exactly the non-obvious behaviors an agent needs to query well.

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

Conciseness4/5

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

Front-loaded with the single most important fact (unlisted operations exist) and organized by invocation mode. It loses a point for the changelog aside ('the AND-then-fall-back-to-OR behaviour this said before was removed in ef47aa9ab'), a commit hash that costs attention and gives an agent nothing actionable.

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

Completeness4/5

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

No annotations and no output schema exist, so the description must stand alone, and it mostly does: it explains what browsing/tag/query return (areas with operation counts, ranked matches) and how to page through large result sets. It could say a bit more about the shape of a returned match (name, description, tag) before handing off to describe_operations, but the workflow is complete enough to call correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it defines all four parameters semantically: tag lists one area, query searches by keyword, limit is capped at 100, and offset is driven by next_offset for paging. It stops short of stating the defaults (25/0/empty string) and whether tag and query can be combined, but the gap is minor.

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

Purpose5/5

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

Opens with a specific verb and resource ('Search EVERY operation this server offers') and immediately carves out the scope that makes it unique: operations not present in the visible tool list. It names concrete examples (payroll, VAT returns, year-end close) and distinguishes itself from describe_operations/call_operation by pointing to them as the follow-on steps.

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

Usage Guidelines5/5

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

Prescribes exactly when to use it ('Search here before concluding that Zeno cannot do something') and enumerates the three invocation modes: no arguments to browse tags, tag to list one area, query for keyword search. It also routes the agent onward via describe_operations then call_operation, giving a complete decision path with no inference required.

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

get_ar_invoiceAInspect

One authored outgoing invoice with its lines (CompanyMember read).

Carries the header (customer, dates, currency, discounts), every line with its computed net_amount/vat_amount/gross_amount, the document totals, and the lifecycle: status (draft → issued → cancelled), document_no (assigned at issue — null on a draft), commercial_document_id / snapshot_document_id (the booked document and the frozen PDF), plus the derived payment_status and open_amount read from the linked open item.

This is the authored arm only. A receivable that arrived as an ingested document is an item, not an ar_invoice; the two arms are listed together by GET …/ar/receivables. Use GET …/ar/invoices/{invoice_id}/related for the journal entry, the settling bank transactions and the credit-note chain.

NameRequiredDescriptionDefault
company_idYes
invoice_idYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does much of that work: it declares the read nature ('CompanyMember read'), the status lifecycle draft→issued→cancelled, that document_no is null on a draft, and that payment_status/open_amount are derived from the linked open item. It omits what happens on a nonexistent or cross-company invoice_id (error vs empty), which a mutation-free read tool could still usefully state.

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

Conciseness4/5

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

Front-loaded with the resource and its arm, then the payload, then the routing caveat. It is longer than typical, but with no output schema the field enumeration (net/vat/gross, document numbers, snapshot ids) is load-bearing rather than padding; only the parenthetical field lists feel slightly over-stuffed.

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

Completeness5/5

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

With no annotations and no output schema, the description is the only place an agent can learn the return shape, and it covers header, line amounts, totals, lifecycle states, document linkage and derived payment fields, plus scope exclusions. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Two required parameters with 0% schema description coverage, so the schema adds nothing. company_id and invoice_id are largely self-evident from their names and the 'CompanyMember read' hint, but the description never explains the tenancy/scoping relationship between them or the accepted id format. Adequate, not additive.

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

Purpose5/5

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

States a specific resource and scope: a single authored outgoing AR invoice with its lines, plus the exact payload it carries (header, lines with computed amounts, totals, lifecycle). It explicitly distinguishes itself from the ingested 'item' arm and from list_ar_invoices / get_item siblings, 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.

Usage Guidelines4/5

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

Gives a clear when-not rule ('a receivable that arrived as an ingested document is an item, not an ar_invoice') and routes follow-up needs (journal entry, settling bank transactions, credit-note chain) to the related endpoint. It does not mention how to obtain the invoice_id (e.g. via list_ar_invoices), so the routing story is strong but not fully closed.

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

get_bank_entryDInspect

Get Bank Entry

NameRequiredDescriptionDefault
entry_idYes

TDQS

D1.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing. "Get" weakly implies a read, but there is no statement about permissions, error behavior for an unknown entry_id, or idempotency — all of which matter for a financial-record lookup.

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

Conciseness2/5

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

The description is short, but this is under-specification rather than conciseness; four words convey no information beyond the tool name. Brevity here costs the agent everything it needs to call the tool correctly.

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

Completeness1/5

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

For a financial-record retrieval tool in a 49-tool family with no annotations, no output schema, and no parameter documentation, the description is completely inadequate. Nothing tells the agent what it gets back or how the returned entry should be interpreted.

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

Parameters2/5

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

Schema description coverage is 0% and the single required parameter entry_id has no variability expectation. The description adds no meaning beyond the parameter's self-evident name, and it does not clarify whether entry_id is an internal ID, a bank reference, or a composite key.

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

Purpose2/5

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

"Get Bank Entry" is a near-tautology that restates the tool name without adding scope, and it does not distinguish itself from siblings like get_bank_status, list_bank_entries, entry_candidates, or get_gl_journal_entry. An agent learns only that some bank-entry object is fetched, not what form or by what key.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no exclusions, and no pointer to an alternative tool. In a family containing list_bank_entries, entry_candidates, and settle_entry, the agent has no basis for choosing this tool over those.

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

get_bank_statusAInspect

Composed bank snapshot — "is my banking up to date?" (CompanyMember). "Reconciled" means entries matched, NOT ledger = statement balance (the close check BANK_BALANCE_DOES_NOT_TIE_OUT compares that).

One call for what otherwise takes GET …/bank-accounts + one GET /bank-accounts/{id}/coverage per account + GET …/reconciliation/summary — and which those three still do not answer: per-account entry-status counts, the in_suspense counts, each account's latest closing balance, and the company-level cumulative GL Suspense balance (elsewhere reachable only through a VAT period's close-checks). Non-zero suspense blocks a clean VAT close.

Read-only. Gaps come from the account's full history: coverage windows are merged and every internal hole reported (ZCT-509), so a run of missing statements is ONE gap. Not period-scoped; use …/reconciliation/completeness per month. period_gaps caps at 10/account, period_gap_count stays exact — HOLES, not missing months. Explicit non-member company_id → 403.

NameRequiredDescriptionDefault
company_idYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it declares "Read-only", documents the 403 on non-member company_id, explains gap semantics (merged coverage windows, internal holes reported, ZCT-509), and discloses the 10/account cap on period_gaps with an exact period_gap_count. It also clarifies that "Reconciled" means matched entries, not ledger=balance, and that non-zero suspense blocks a clean VAT close.

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

Conciseness4/5

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

The purpose and the primary clarification (what "Reconciled" means) are front-loaded before the endpoint comparisons and gap mechanics. It is dense and cross-reference heavy, but most sentences earn their place given the composed behavior; slightly long for a status tool.

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

Completeness5/5

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

With no output schema and no annotations, the description still conveys the return surface (per-account entry-status counts, in_suspense counts, latest closing balance, company-level GL Suspense balance) plus the caveats that matter for correct interpretation. Nothing essential for calling or interpreting it is missing.

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

Parameters4/5

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

Schema description coverage is 0% for the single company_id parameter, so the description must compensate. It adds meaningful semantics: the parameter is a CompanyMember identifier, and an explicit non-member company_id yields 403. This is real added meaning, though format details remain implicit.

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

Purpose5/5

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

The description opens with a specific composed resource ("Composed bank snapshot") and frames it with a concrete question ("is my banking up to date?"). It explicitly distinguishes itself from siblings by naming the three endpoints it replaces (bank-accounts, coverage, reconciliation/summary) and calls out what those still cannot answer.

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

Usage Guidelines5/5

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

It states when to use this tool (one call for bank snapshotting) versus alternatives ("use …/reconciliation/completeness per month"), and notes it is not period-scoped. It even enumerates the gaps the three substitute endpoints would leave, leaving nothing to inference.

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

get_companyBInspect

Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent.

NameRequiredDescriptionDefault
company_idYes

TDQS

B3.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the auth mode ('jwt, scoped') and two concrete failure modes (403 for non-member non-admin, 404 if absent), which is real behavioral value, but it leaves 'scoped' undefined and says nothing about what data comes back or rate-limit behavior.

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

Conciseness5/5

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

Two short, front-loaded sentences with zero filler; the core action comes first and the failure modes follow compactly.

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

Completeness3/5

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

For a simple single-param read this covers the essentials (identity, auth, error semantics), but with no output schema the description should at least hint at the returned company shape or the meaning of 'scoped'.

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

Parameters2/5

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

Schema description coverage is 0% for the single required company_id, and the description adds no format, source, or lookup hint for it. An agent gets no help beyond the parameter name.

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

Purpose4/5

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

States a specific verb and resource ('Get one company'), and the phrase 'one company' implicitly contrasts with the sibling list_companies. It does not name the alternative explicitly, but the singular scope is unambiguous.

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

Usage Guidelines2/5

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

The description gives error conditions (403/404) but no guidance on when to call this versus list_companies or global_search, nor any prerequisite about already knowing a company_id. Usage is only inferable from the name.

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

get_financial_statementsAInspect

Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).

Aggregates every posted GL journal line whose posting date falls in the fiscal year's window, classifies each account against the chart of accounts, and reports problems (unbalanced trial balance, unclassified accounts, year-not-opened, mixed currency). Read-only and distinct from the uploaded balance-sheet snapshots (GET .../balance-sheets): nothing here reads a snapshot. fiscal_year optional → the latest FY with journal data. month (YYYY-MM, inside the FY — 422 otherwise) narrows the statement to one month: the balance sheet stays cumulative (as of month end, YTD equity fold) while the P&L + cash flow cover that month's flows. Explicit non-member company_id → 403.

The cut — a line is included because its posting_date falls inside the fiscal year's own window, read off the gl_fiscal_year row; the response's fiscal_year_cut says so (method="posting_date_window", dates = that window; the aggregated window is period_start..period_end, narrower when month-scoped, ZET-166). The /gl/reports/* family cuts by the line's stamped fiscal_year_id FK instead. Both read the same window, so they agree on where the year starts and ends; they can still differ on a line dated outside the year it is stamped to.

NameRequiredDescriptionDefault
monthNo
company_idYes
fiscal_yearNo

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does substantial work: read-only, 422 on out-of-FY month, 403 on non-member company_id, problem reporting (unbalanced trial balance, unclassified accounts, year-not-opened, mixed currency), balance sheet cumulative vs P&L cash-flow monthly, and the exact inclusion rule ('posting_date' inside the gl_fiscal_year window, surfaced via fiscal_year_cut). It stops short of describing pagination or response size, but behavioral disclosure is far above the norm for an un-annotated tool.

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

Conciseness3/5

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

The content is valuable but the layout is heavy: bolded mid-sentence fragments, a paragraph on 'The cut' and a cross-reference to ZET-166 read like internal release notes rather than agent-facing guidance. The critical routing and parameter facts are front-loaded, but the section is longer than its task requires.

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

Completeness5/5

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

For a computed multi-statement report with no output schema, the description covers selection rules, defaults, error conditions (403/422), scoping semantics, and the aggregation cut rule. Nothing an agent needs to call it correctly or interpret the result boundaries is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does: fiscal_year optional-by-default semantics, month's YYYY-MM format and inside-the-FY constraint with the 422 consequence, and the balance-sheet-cumulative vs P&L-monthly behavior month triggers. This is meaning the schema cannot express.

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

Purpose5/5

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

Opens with a specific verb+resource+scope ('Computed balance sheet + P&L for a fiscal year, from the journal') and explicitly distinguishes itself from snapshots and from the /gl/reports/* family that cuts by a stamped fiscal_year_id. An agent can separate it from gl_balance_sheet, gl_profit_and_loss, and gl_trial_balance without opening schemas.

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

Usage Guidelines4/5

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

Gives clear context: fiscal_year optional defaults to latest FY with journal data, month narrows to one month with a 422 otherwise, non-member company_id returns 403, and it explicitly says it is distinct from the balance-sheet snapshot endpoint. It lacks a direct 'use this instead of X when Y' routing sentence against the computed siblings (gl_balance_sheet, gl_profit_and_loss), but the snapshot/report contrast covers the main ambiguity.

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

get_gl_account_ledgerAInspect

One account's ledger (Kontoauszug) — every booking that touched it, in date order, with Soll/Haben and the running balance after each line (CompanyMember).

No fiscal-year parameter: the chart is FY-owned, so account_id already fixes the year. Posted and reversed entries are included (a reversal is a second posted entry, so both legs must show or the balance is wrong); drafts are not. The running balance is carried across pages by the server — page_opening_balance enters this page's first row, while closing_balance/total_debit/total_credit describe the whole window. 404 when the account is not this company's; 422 when date_from is later than date_to.

NameRequiredDescriptionDefault
limitNo
offsetNo
date_toNo
date_fromNo
account_idYes
company_idYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so substantively: it discloses that reversed entries are included (both legs), drafts excluded, that the server carries running balance across pages, and the distinct semantics of page_opening_balance vs closing_balance/total_debit/total_credit. It omits any permission/auth or rate-limit note, so not a full 5.

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

Conciseness4/5

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

Front-loaded with the core purpose, then the important exclusions and balance semantics. Dense but nearly every clause earns its place; the field-naming detail is slightly heavy but justified by the absent output schema.

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

Completeness4/5

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

With no annotations and no output schema, the description steps up by explaining return-field semantics, paging continuity, and 404/422 error conditions. Only the undocumented limit/offset behavior and any auth prerequisites keep it from being fully complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It adds real meaning for account_id (FY-scoping) and date_from/date_to (422 when from > to), but says nothing about limit, offset, or company_id, leaving half the parameters undocumented in both schema and prose.

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

Purpose5/5

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

Names a specific resource ('One account's ledger (Kontoauszug)') and the exact content it returns ('every booking that touched it, in date order, with Soll/Haben and the running balance'). This is clearly distinguishable from siblings like list_gl_journal_entries or gl_trial_balance.

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

Usage Guidelines4/5

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

Explains the selecting context well: account_id already fixes the fiscal year so no FY parameter is needed, posted AND reversed entries are included while drafts are not. It does not, however, explicitly name an alternative sibling tool or state when to prefer this over list_gl_journal_entries, leaving that to inference.

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

get_gl_journal_entryCInspect

One entry + lines, plus the subledger rows it produced/touched (Gap B detail surfacing): its gl_vat_posting rows, its gl_vat_zero_posting turnover-only declarations (zero-rated/exempt output — R2-13b: these have no VAT line to pair, so without them a correctly coded 0 % line is indistinguishable from an untagged one) and referenced gl_open_item rows. A declared base line also carries the resolved code on lines[].vat_code. Drafts carry empty lists. documents carries the accounting documents explicitly attached to the entry (POST …/documents) — the evidence for a hand-booked entry; a pipeline-created entry carries its document through source_ref_* instead and lists nothing here. Member read, like the rest of the detail.

NameRequiredDescriptionDefault
entry_idYes
company_idYes

TDQS

C2.8/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does disclose genuinely non-obvious traits: drafts return empty lists, hand-booked entries populate 'documents' while pipeline-created entries carry their document via source_ref_* instead, and the access level is 'Member read'. It omits not-found/error behavior and pagination, but the return-semantics disclosure is substantive.

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

Conciseness2/5

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

The description is a dense, jargon-laden paragraph riddled with internal references ('Gap B', 'R2-13b') and backtick-quoted field names, with no front-loaded purpose statement. Much of it reads as implementation notes about return payload structure rather than guidance an agent needs to select and invoke the tool.

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

Completeness3/5

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

Because there is no output schema, the description legitimately needs to explain the return payload, and it does so thoroughly (VAT postings, zero-posting declarations, open items, documents). However, it is incomplete on the invocation side: no parameter guidance, no usage routing, and no error behavior for a two-required-param tool.

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

Parameters2/5

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

Schema description coverage is 0% and the description never mentions entry_id or company_id, so it adds no meaning to either required parameter. It references 'lines[].vat_code' and 'source_ref_*' fields of the payload but not the inputs, leaving the caller to infer how to identify the entry being fetched.

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

Purpose3/5

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

The description opens with 'One entry + lines' which implies a single-entry detail read, but frames the tool almost entirely around return payload content rather than stating a clear verb+resource purpose (e.g. 'Retrieve a single GL journal entry by ID'). It never explicitly distinguishes itself from the sibling list_gl_journal_entries beyond the implied singularity of 'one entry'.

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

Usage Guidelines2/5

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

The only usage-relevant statement is 'Member read, like the rest of the detail,' which implies read-only access but gives no when-to-use context. It does not say when to prefer this over list_gl_journal_entries, get_gl_account_ledger, or entry_candidates, 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.

get_intakeBInspect

Get one intake row by id (scoped to its company: 404/403 split).

NameRequiredDescriptionDefault
intake_idYes

TDQS

B3.1/5.0
Behavior3/5

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

No annotations are provided, so the description must carry behavioral disclosure. It usefully adds company scoping and a 404/403 error split, which implies tenant isolation and access control, but omits whether it is read-only, what auth is required, and what the return shape looks like.

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

Conciseness5/5

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

A single front-loaded sentence with no wasted words. It delivers the core operation, scope, and error behavior efficiently.

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

Completeness3/5

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

For a one-parameter get-by-id tool with no output schema, the description covers purpose, company scope, and error semantics. However, it remains silent on ID format, authorization requirements, and what an intake row contains, leaving some gaps for an agent to infer.

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

Parameters2/5

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

Schema description coverage is 0% and the single parameter (intake_id) has no format details in the schema. The description only says 'by id,' which is essentially a restatement of the parameter name and does not compensate for the missing format or constraints.

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

Purpose4/5

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

States a specific verb ('Get') and resource ('intake row') with an ID-based scope, so the operation is clear. It does not explicitly differentiate itself from sibling tools such as upload_intake, but the retrieval-by-id framing is distinct enough.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives, nor any prerequisites for use. The 404/403 note is behavioral detail rather than usage guidance.

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

get_itemDInspect

Item metadata (any source).

NameRequiredDescriptionDefault
item_idYes

TDQS

D1.8/5.0
Behavior1/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure and provides none: no permission requirements, no statement of what is returned, no error behavior for unknown IDs. An agent learns nothing beyond the bare existence of the operation.

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

Conciseness2/5

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

The description is a single fragment with no waste, but it is under-specified rather than concise. Brevity here reflects missing information, not efficient communication.

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

Completeness2/5

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

For a one-parameter lookup with no output schema and no annotations, the description should at minimum explain what metadata is returned and how item_id is formed. Neither is present, and '(any source)' leaves the resolution rules opaque.

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

Parameters2/5

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

Schema description coverage is 0% for the single required item_id, and the description adds no format, type, or example for it. '(any source)' very slightly implies the ID is source-agnostic, but that is not enough to compensate for the coverage gap.

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

Purpose2/5

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

The description is a noun phrase with no verb, essentially restating the tool name 'get_item' as 'Item metadata'. The parenthetical '(any source)' hints at scope but does not clarify whether this returns a single item, its type, or which fields.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no prerequisite, and no named alternative such as list_items or a source-specific getter. '(any source)' only weakly implies this spans sources where other tools might not, 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.

get_kpi_reportAInspect

Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).

Cash/liability balances aggregate the FY window of posted/reversed journal lines; aging + forecast read gl_open_item, pending salary batches and unpaid VAT periods. Read-only. Explicit non-member company_id → 403.

fiscal_year optional → latest FY with journal data; FY figures as of that year's end once past. Aging and forecast anchor to today.

NameRequiredDescriptionDefault
company_idYes
fiscal_yearNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it declares 'Read-only', specifies that a non-member company_id yields 403, and explains default resolution for fiscal_year (latest FY with journal data; FY figures frozen at that year's end once past; aging/forecast anchored to today). Only rate-limit/performance behavior is absent, which is minor for a read-only report.

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

Conciseness4/5

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

Front-loads the headline purpose, then layers data sources, permissions, and the parameter default in dense but non-redundant sentences. Every clause carries information; slightly telegraphic phrasing but no filler.

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

Completeness4/5

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

With no output schema and no annotations, the description is the sole carrier of context and covers what is returned, where it comes from, who may call it, and how the fiscal_year default resolves. It stops short of listing the individual KPIs, but is otherwise sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It gives rich semantics for fiscal_year (optionality, default resolution, as-of-year-end behavior) but explains company_id only indirectly via the 403 membership note, leaving its format/identity unclear. Partial compensation only.

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

Purpose5/5

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

States a specific verb and resource (KPI report / snapshot) and enumerates exactly what it contains: snapshot KPIs plus a 13-week liquidity forecast drawn from the GL. It also names the underlying data sources (posted/reversed journal lines, gl_open_item, salary batches, VAT periods), which cleanly separates it from siblings like gl_balance_sheet or gl_profit_and_loss.

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

Usage Guidelines3/5

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

Usage is implied by the content scope (a KPI/liquidity snapshot), but the description never says when to pick this over the many sibling reporting tools (get_financial_statements, gl_trial_balance, reconciliation_summary) or any exclusion conditions. An agent gets the gist but no explicit routing.

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

get_work_listCInspect

Everything waiting for this user in this company, most severe first.

NameRequiredDescriptionDefault
company_idYes

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses scope and severity ordering, but not auth/company requirements, pagination, read-only safety, or response shape. This is minimal transparency for a list-retrieval tool.

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

Conciseness4/5

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

A single sentence, front-loaded and free of filler. It is concise, though it omits necessary specifics rather than being verbose.

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

Completeness2/5

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

For a one-parameter list tool with no annotations or output schema, the description is too thin. It does not cover parameter semantics, usage context, or return behavior beyond the general 'everything waiting' phrase.

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

Parameters2/5

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

Schema description coverage is 0%, and the only parameter company_id is undocumented in both schema and description. 'In this company' hints at the parameter's domain but adds no format, ID type, or requiredness details beyond the schema property name.

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

Purpose3/5

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

Conveys scope ('everything waiting for this user in this company') and ordering ('most severe first'), but does not explicitly name the resource as work items/tasks or distinguish from many sibling list/get tools. An agent can infer a prioritized work queue but cannot confidently tell it apart from other pending-item endpoints without schema inspection.

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

Usage Guidelines2/5

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

No when-to-use guidance, prerequisites, or alternatives are provided. The description gives no indication of when this tool should be selected over siblings such as entry_candidates or list_autopost_decisions.

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

gl_balance_sheetAInspect

Assets vs liabilities + equity for one fiscal year, signed by natural side.

Window rules as the trial balance (fiscal_year defaults to the latest posted year; no all-years mode, ZET-155). With period_id this is a movements aggregate over that period, not a position.

⚠️ Balances as assets == liabilities_and_equity, NOT liabilities + equity: the GL has no P&L→equity closing entry, so equity is the equity accounts alone and net_result is folded into liabilities_and_equity. It is a position only for a year whose book carries its opening batch; otherwise it is that year's movements and equity is empty.

Cut by the stamped fiscal_year_id, not posting date (fiscal_year_cut, ZET-166).

NameRequiredDescriptionDefault
period_idNo
company_idYes
fiscal_yearNo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it discloses the accounting quirk that assets == liabilities_and_equity, that net_result folds into liabilities_and_equity, and that equity is empty unless the opening batch is present. It also notes the fiscal_year_cut behavior (stamped fiscal_year_id, not posting date). Missing only permissions/cost/volume behavior, which is minor for a read report.

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

Conciseness4/5

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

The core purpose is front-loaded and each subsequent sentence adds a distinct caveat rather than restating. It is dense and slightly cluttered by ticket references (ZET-155, ZET-166) and parentheticals, but the length is justified by the accounting subtleties being disclosed.

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

Completeness4/5

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

For a report tool with no annotations and no output schema, the description supplies the semantic frame an agent needs (position vs movements, equity/net_result folding, year cut basis). It stops short of naming the returned fields or shape, which is the one gap given the absence of an output schema.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does for the two non-obvious parameters: fiscal_year defaults to the latest posted year with no all-years mode, and period_id turns the result into a movements aggregate. company_id is left undocumented, but its meaning is self-evident from the context.

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

Purpose4/5

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

The opening sentence states a concrete output (assets vs liabilities + equity) for a specific scope (one fiscal year) with a stated convention (signed by natural side). It does not explicitly distinguish itself from close siblings like gl_profit_and_loss or gl_trial_balance, only borrowing trial-balance window rules, so it stops short of a 5.

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

Usage Guidelines3/5

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

It gives meaningful context - default fiscal_year is the latest posted year, there is no all-years mode, and passing period_id switches to a movements aggregate rather than a position. However it never states when to choose this tool over gl_profit_and_loss or get_financial_statements, so guidance 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.

gl_profit_and_lossAInspect

Revenue − expense → net result, for one fiscal year.

Window — same rules as the trial balance: fiscal_year defaults to the latest posted year, period_id narrows to one period of it, unknown values are 404 and a contradictory pair 422. A P&L is a flow statement, so no reading makes the sum of every fiscal year a company's result — hence no all-years mode (ZET-155). Opening batches post only to balance-sheet accounts, so they never enter this figure.

The cut — by the line's stamped fiscal_year_id FK, not by posting date; the response's fiscal_year_cut says so (see the trial balance; null only for a company that has posted nothing, ZET-166). For the full statement — per-account sections, the year's own account names, the problems list and the cash flow — use GET /companies/{id}/financial-statements, which cuts by a posting-date window instead, so the two can disagree for a short/long or shifted fiscal year; this route returns the three totals.

NameRequiredDescriptionDefault
period_idNo
company_idYes
fiscal_yearNo

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it documents default fiscal-year behavior, period narrowing, 404/422 error semantics, flow-statement reasoning, opening-batch exclusion, and the fiscal_year_id FK cut. This is unusually thorough behavioral context beyond what any structured field provides.

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

Conciseness4/5

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

The description is front-loaded with purpose and uses bold section headers for the window and cut semantics, making it navigable despite its length. Some parenthetical internal ticket references (ZET-155, ZET-166) are noise for an agent, but the information density remains high.

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

Completeness5/5

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

Given no output schema, no annotations, and a complex cut/window model, the description is complete enough: it implies the three return totals from the opening formula, notes the fiscal_year_cut output field, and covers routing, errors, and edge cases. An agent has what it needs to call this correctly.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It explains fiscal_year defaults and period_id narrowing plus their error interactions, but leaves company_id implicit and does not elaborate on type/format details already visible in the schema.

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

Purpose5/5

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

The opening formula 'Revenue − expense → net result, for one fiscal year' states exactly what the tool computes and its scope. It explicitly distinguishes itself from the trial balance and the full financial-statements route, so an agent can identify the tool without inspecting siblings.

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

Usage Guidelines5/5

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

The description directly names the alternative: 'For the full statement ... use GET /companies/{id}/financial-statements' and explains that this route is for the three totals. It also states the window rules and the absence of an all-years mode, giving clear conditions for selection.

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

gl_trial_balanceAInspect

Per-account debit/credit columns for one fiscal year, with totals.

fiscal_year (year label) defaults to the latest year posted in; period_id narrows to one period of it. No all-years mode — account identity is (company, fiscal year, code), so aggregating double-counts silently (ZET-155). Unknown year/period → 404; period outside the year → 422.

Cut by the line's stamped fiscal_year_id, not its posting date; …/financial-statements cuts by posting date inside the same year's stored window, so the two differ only on a line dated outside the year it is stamped to. fiscal_year_cut names the cut (ZET-166).

NameRequiredDescriptionDefault
period_idNo
company_idYes
fiscal_yearNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and delivers: default resolution, 404 vs 422 error semantics, the double-counting hazard, and the fiscal_year_id vs posting-date cut distinction. It stops short of auth/permission needs or rate limits.

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

Conciseness3/5

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

The core scoping statement is front-loaded and dense with useful facts, but the final paragraph about cut semantics is convoluted, and internal ticket references (ZET-155, ZET-166) are noise that consume space without helping an agent invoke the tool.

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

Completeness4/5

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

With no output schema and no annotations, the description supplies the return shape at a high level (columns plus totals), error behavior, and cut semantics. It is nearly sufficient, missing only detail on the exact column set and whether totals are included per account or only overall.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate and largely does: fiscal_year is a year label defaulting to the latest posted year, period_id narrows within that year, and account identity is the (company, fiscal year, code) tuple. It never states the accepted type/format for company_id or period_id, leaving some gaps for a 0%-coverage schema.

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

Purpose4/5

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

The opening clause names a specific verb/resource pair: per-account debit/credit columns for one fiscal year with totals. It differentiates itself from the financial-statements path by cut semantics, but does not address how it differs from gl_balance_sheet or get_gl_account_ledger, which an agent could plausibly confuse with a trial balance.

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

Usage Guidelines4/5

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

It explains that fiscal_year defaults to the latest posted year, that period_id narrows to one period, and explicitly warns there is no all-years mode because aggregation double-counts. It also names a contrasting path (…/financial-statements) and when the two diverge. No explicit 'use this instead of X' routing to the other GL tools.

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

issue_ar_invoiceAInspect

Issue a draft — this is the booking step (accountant role).

In one transaction it assigns the next invoice number, posts the journal entry (debit the AR control account, credit revenue per line, credit output VAT per VAT code), opens the receivable open item the customer's payment will settle, freezes the invoice against further edits (status → issued) and renders the PDF+QR snapshot. The turnover reaches the VAT return from here — a draft never does.

Only a draft can be issued: re-issuing an issued invoice is a 409. It is also refused when the invoice is not ready (no customer, no lines, a line without a revenue account…) — call GET …/ar/invoices/{invoice_id}/readiness first, whose blocking list is exactly what this refuses on — when the issue_date is not inside an open accounting period, or when the fiscal year has no AR control account configured.

Returns the issued invoice (now with document_no and commercial_document_id). A renderer outage does not fail the issue: the booking stands and the snapshot stays pending, re-rendered on demand by GET …/ar/invoices/{invoice_id}/pdf. To undo one, reverse its journal entry; there is no un-issue.

NameRequiredDescriptionDefault
company_idYes
invoice_idYes

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it describes the transaction (number assignment, journal entry debits/credits, open item creation), the state transition to issued, the 409 on re-issue, the renderer-outage tolerance, and that there is no un-issue (reverse the journal entry instead). This is the kind of behavioral context annotations could never supply.

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

Conciseness4/5

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

Front-loaded with the essential purpose in bold, then structured by transaction behavior, preconditions, returns, and undo path. It is dense and markdown-heavy, but every sentence carries distinct information, so little is wasted for a tool with this much behavior to convey.

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

Completeness5/5

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

Given no output schema, the description still documents the return value (issued invoice with document_no and commercial_document_id), the failure modes, the readiness check, the renderer-outage edge case, and the reversal path. Nothing an agent needs in order to invoke and interpret this correctly is missing.

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

Parameters3/5

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

Schema coverage is 0%, so the description should compensate, but it only indirectly references invoice_id ('the draft') and never explains company_id or the identifier formats. The two parameters are self-evident strings, so this is adequate rather than deficient, but it adds little meaning beyond the schema.

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

Purpose5/5

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

States a specific verb+resource (issue a draft AR invoice) and frames it as 'the booking step (accountant role)', which immediately separates it from create_ar_invoice and get_ar_invoice. An agent can tell what this does without opening any schema.

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

Usage Guidelines4/5

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

Explicitly states the precondition (only a draft can be issued) and enumerates refusal conditions: not ready (no customer/lines/revenue account), issue_date outside an open period, no AR control account. It even points to the readiness endpoint whose 'blocking' list maps to the refusals. It does not name sibling tools to use instead (e.g. create_ar_invoice), so 5 is not warranted.

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

list_ar_invoicesAInspect

List authored AR invoices, newest first.

Optional status / doc_type filter by lifecycle + document kind. Optional period (YYYY-MM) filters by the invoice's issue date (its month); a malformed value returns 422 {"msg": "period must be YYYY-MM"}.

NameRequiredDescriptionDefault
limitNo
offsetNo
periodNo
statusNo
doc_typeNo
company_idYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses ordering (newest first), documented error behavior with 422 and exact message for malformed period, and explains status semantics (paid/overdue derived, not stored). Missing pagination default/max info that schema provides.

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

Conciseness5/5

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

Three tight sentences; primary action and ordering front-loaded, then filters, then error behavior. Zero filler.

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

Completeness4/5

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

Covers purpose, filters, ordering, error handling, and key semantics. For a read-only list tool with no output schema, doesn't describe return format or pagination beyond defaults, but annotations absence is mitigated by detailed filter semantics.

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

Parameters5/5

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

Schema coverage is 0%, so description must compensate. It adds meaning for status (editorial lifecycle, paid/overdue derived), doc_type (document kind), period (YYYY-MM format, filters by issue month, error on malformed), going well beyond bare parameter names.

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

Purpose5/5

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

Specific verb+resource (list AR invoices) with scope (authored) and ordering (newest first). This distinguishes it from sibling get_ar_invoice (single) and create_ar_invoice (write).

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

Usage Guidelines3/5

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

Implies usage through describing filters, but does not state when to use this vs list_gl_open_items or other list tools. No explicit when/when-not guidance.

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

list_autopost_decisionsAInspect

Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.

Shows what the autonomy policy posted (posted), would have posted in assist shadow mode (shadow), or held for human review (held). ai_no_match shadow rows (one per AI-consulted bank entry with no verdict) are feed noise and hidden by default; include_no_match=true surfaces them for audit. outcome / source_ref_id narrow server-side (ZET-75), so the held-review surfaces can see held rows beyond the newest-limit window.

Newest first, ordered (created_at DESC, id DESC). limit caps at 200 and offset walks the rest (R2-21): one fiscal year of a mid-size client makes more decisions than one page holds, so page with offset += limit until a call returns fewer than limit rows. The response is a bare list.

cause keeps the held rows of one hold cause. An agent may accept only rows with agent_acceptable true.

NameRequiredDescriptionDefault
causeNo
limitNo
offsetNo
outcomeNo
company_idYes
source_ref_idNo
include_no_matchNo

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the default suppression of ai_no_match noise rows, the newest-first ordering key (created_at DESC, id DESC), the 200-row cap, the pagination termination rule, and that the response is a bare list. It omits permission/auth requirements and any cost or rate characteristics, which keeps it out of the top band.

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

Conciseness4/5

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

Purpose and feed semantics are front-loaded, and each subsequent sentence adds operational value (filtering, pagination, hold causes). Some space is spent on internal ticket references (ZET-75, R2-21) and the '(CompanyMember)' parenthetical that mean little to an agent.

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

Completeness4/5

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

No output schema and no annotations exist, so the description has to define the return shape — it does ('the response is a bare list', plus ordering and the row states). Combined with the pagination and filter guidance, an agent can call this correctly; only auth/permission preconditions and the row field list are left implicit.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it largely does: include_no_match, outcome, source_ref_id, cause, limit and offset all get meaning (including the server-side narrowing behavior of outcome/source_ref_id). company_id — the one required parameter — is never explained, and the row-level agent_acceptable flag is mentioned without tying it to a parameter.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.' It then enumerates the three states the feed surfaces (posted/shadow/held), which cleanly separates it from write-side siblings like accept_autopost_decision and from aggregate siblings like get_work_list or reconciliation_summary.

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

Usage Guidelines4/5

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

It gives concrete usage rules: set include_no_match=true only for audit, use outcome/source_ref_id to reach held rows beyond the newest-limit window, use cause to isolate one hold cause, and page with offset += limit until a short page returns. It does not name a sibling alternative for the 'what should I review instead' case, so it stops short of full when/when-not routing.

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

list_bank_accountsAInspect

The company's bank accounts — the bank_account_id every statement import, bank-entry list and reconciliation call needs (CompanyMember read).

Oldest first, no filter and no paging. Each row carries the iban, currency, label/bank_name and ledger_account_number — the chart code this account posts through; without one a bank movement cannot be coded, and it is set with PUT /bank-accounts/{account_id}.

auto_created marks an account inferred from an imported statement rather than declared by a human; it starts ownership_status unconfirmed with needs_ownership_review: true — confirm it before trusting its balances, since an unconfirmed IBAN may not be the company's at all. statement_count / entry_count are null here (filled by the single-account GET /bank-accounts/{account_id}), which is not the same as zero.

NameRequiredDescriptionDefault
company_idYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: oldest-first ordering, no paging, CompanyMember read permission, the auto_created/ownership_status/needs_ownership_review lifecycle, and the explicit null-vs-zero distinction for statement_count/entry_count. The only gap is that read-only nature is implied by 'list' rather than stated.

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

Conciseness4/5

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

Front-loads purpose in the first sentence and every subsequent sentence carries operational value (ordering, return fields, null semantics, how to set the ledger code). Slightly dense, but nothing is padding.

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

Completeness5/5

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

For a list tool with no output schema and no annotations, the description documents return fields, ordering, paging behavior, permission level, and the meaning of special fields — everything an agent needs 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.

Parameters3/5

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

Schema description coverage is 0% and the sole parameter company_id is undocumented in the schema. The description implies company scoping ('the company's bank accounts') and the read permission, but never states the expected id format, so it only partially compensates for the coverage gap.

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

Purpose5/5

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

States a specific verb and resource (the company's bank accounts) and pins the exact key it returns (bank_account_id) plus who consumes it (statement import, bank-entry list, reconciliation). An agent can distinguish it from siblings like list_bank_entries or get_bank_status without opening a schema.

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

Usage Guidelines4/5

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

Explains the ordering and that there is no filter or paging, and routes to the single-account GET /bank-accounts/{account_id} for counts. It names the workflows that depend on the returned id, giving clear context, but stops short of explicit when-not-to-use exclusions against sibling list tools.

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

list_bank_entriesDInspect

List Bank Entries

NameRequiredDescriptionDefault
qNo
toNo
flagNo
fromNo
limitNo
offsetNo
company_idNo
credit_debitNo
match_qualityNo
bank_account_idNo
counterparty_idNo
bank_statement_idNo
settlement_statusNo
reconciliation_statusNo

TDQS

D1.5/5.0
Behavior1/5

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

No annotations are supplied, so the description carries the full burden of behavioral disclosure, and it discloses nothing: no mention of read-only nature, pagination behavior, default result window, or the interaction between the many filter dimensions. For a 14-parameter query tool with zero annotation coverage this is a severe gap.

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

Conciseness2/5

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

The text is certainly short, but this is under-specification rather than conciseness — the entire body is three words that merely echo the name. There is no front-loaded scope statement or structure to guide a call.

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

Completeness1/5

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

For a tool with 14 optional parameters, no required fields, no annotations, and no output schema, the description is completely inadequate. Nothing tells the agent when to combine filters, what the default limit/offset window means, or what a listing looks like, so the definition cannot support correct invocation.

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

Parameters1/5

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

Schema description coverage is reported at 0% across 14 parameters, and the description adds no parameter meaning whatsoever. Critical filters such as flag, q, reconciliation_status, credit_debit, company_id, and the from/to date range are left for the agent to guess from bare property names, and the mutual relationships between matching/settlement/reconciliation status are unaddressed.

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

Purpose2/5

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

"List Bank Entries" is a tautological restatement of the tool name and adds nothing: no scope, no filtering semantics, no differentiation from siblings like get_bank_entry, list_bank_accounts, or reconciliation_summary. An agent could not tell from this text alone what a "bank entry" is or how this differs from the single-entry getter.

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

Usage Guidelines2/5

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

The description provides no when-to-use guidance, no prerequisites, and does not name any alternative. At best, the verb "list" weakly implies a read of many records versus get_bank_entry for one, but that inference is left entirely to the agent.

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

list_companiesAInspect

List companies (jwt, scoped). Non-admins see only their member companies.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose real behavior: it requires a JWT and is scope-filtered so non-admins see only their member companies. However, it omits return format, ordering, and whether the result is paginated, which matters for a list tool.

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

Conciseness4/5

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

Two short fragments with the resource and the scoping constraint front-loaded; nothing is wasted. The parenthetical '(jwt, scoped)' is telegraphic but readable.

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

Completeness4/5

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

For a parameterless list tool with no output schema, the description covers what an agent needs to know: the auth requirement and the authorization-scoped visibility. Return shape is unspecified but the operation is simple enough that this is a minor gap.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to add or clarify. The '(jwt, scoped)' note is context rather than parameter documentation, which is acceptable given an empty schema.

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

Purpose4/5

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

States a specific verb ('List') and resource ('companies'), which cleanly separates it from the singular sibling get_company. It does not explicitly name or contrast with alternatives, but the verb+resource is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied by the name and the scoping note; there is no explicit when-to-use or when-to-prefer-get_company guidance. The 'Non-admins see only their member companies' clause hints at the intended audience without routing the agent between options.

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

list_counterpartiesBInspect

List a company's counterparties (filter by kind/q, paginated).

kind repeats to filter on a set (?kind=customer&kind=both) — a role-shaped picker asks for every kind that plays the role. A single ?kind=supplier keeps its original meaning.

NameRequiredDescriptionDefault
qNo
kindNo
limitNo
offsetNo
company_idYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the non-obvious repeated-parameter behavior (``?kind=customer&kind=both``) and that results are paginated, which is genuine interface context. However, it omits auth/permission needs, what is actually returned, and pagination defaults, so it only partially covers a read list endpoint.

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

Conciseness4/5

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

Two tight paragraphs with the purpose front-loaded and the `kind` clarification following. The backtick/rst formatting is a bit noisy but every sentence adds information, with little waste.

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

Completeness3/5

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

For a list tool with no output schema and no annotations, the description should say more about the return shape and the remaining filter/paging parameters. It covers the trickiest parameter well but leaves the agent guessing about output and defaults.

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

Parameters3/5

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

Schema coverage is reported at 0%, so the description must compensate, and it does add real meaning for `kind` — set semantics and query-string repetition — beyond the enum. But it says nothing about `q`, `limit`, `offset`, or the required `company_id`, leaving three of five parameters unelaborated.

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

Purpose4/5

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

States a clear verb+resource ("List a company's counterparties") with scope (filterable, paginated). An agent knows what the tool does, but it never names or distinguishes itself from lookalike siblings such as list_companies or list_payroll_employees, 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.

Usage Guidelines2/5

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

There is no explicit when-to-use, when-not-to-use, or alternative routing. Usage is only implied by "List a company's counterparties." The kind discussion explains a parameter, not when this tool beats a sibling.

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

list_gl_accountsCInspect

List the postable chart (CompanyMember). fiscal_year filters to one year's chart (the chart is FY-scoped, so codes repeat across years).

NameRequiredDescriptionDefault
limitNo
offsetNo
company_idYes
fiscal_yearNo

TDQS

C2.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses the non-obvious FY-scoping trait (codes repeat across years), but says nothing about read-only nature, permissions, pagination limits (max 200), or return shape.

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

Conciseness3/5

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

Roughly one sentence with the purpose front-loaded, but the double-backtick markup is sloppy and the '(CompanyMember)' parenthetical adds confusion rather than information.

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

Completeness2/5

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

For a 4-parameter list tool with no annotations and no output schema, the description omits pagination behavior, result ordering, and any indication of what a chart entry looks like. The FY-scope note is the only substantive addition.

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

Parameters2/5

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

Schema description coverage is 0% across 4 parameters. The description explains fiscal_year's semantics well, but limit, offset, and company_id are entirely undocumented anywhere, so the description fails to compensate for the coverage gap.

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

Purpose3/5

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

The description names the resource (chart of accounts) and the verb (list), but the parenthetical '(CompanyMember)' is opaque internal jargon and the phrase 'postable chart' is ambiguous. It does not distinguish this list tool from siblings like get_gl_account_ledger or list_gl_open_items.

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

Usage Guidelines3/5

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

It gives a concrete condition for using the fiscal_year parameter ('filters to one year's chart'), which implies when the filter matters, but offers no guidance on when to prefer this tool over allied tools such as get_gl_account_ledger or gl_trial_balance.

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

list_gl_journal_entriesBInspect

List journal entries.

period_ids narrows to specific fiscal periods, and is how a caller asks for one fiscal year — the year's period ids (ZET-285). Without it this route listed, and counted, every fiscal year the company has: the Journal page cut the year out of the fetched page client-side while total stayed company-wide, so a year whose entries sat past the first page rendered as "no entries match" with no way to reach them. The service applies the filter before the count, so total is the filtered total and the pager is the year's.

untagged_subledger_control=true narrows to the entries that posted to an AR/AP control account without touching the subledger, under allow_untagged_control (ZET-150) — the postings a subledger-vs-control divergence traces back to.

origin: one entry origin (ZEN-42).

NameRequiredDescriptionDefault
qNo
sortNoposting_date
limitNo
orderNodesc
offsetNo
originNo
statusNo
company_idYes
period_idsNo
untagged_subledger_controlNo

TDQS

B3.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose non-obvious behavior: the filter is applied before the count, so 'total' is the filtered total and the pager reflects the narrowed set — a real semantic fact an agent could not infer from the schema. It omits read-only confirmation, pagination defaults, and auth requirements, so it is not complete.

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

Conciseness2/5

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

A large share of the text is a historical bug narrative with internal ticket references (ZET-285, ZET-150, ZEN-42) that do not help an agent invoke the tool. Meanwhile, genuinely needed content (what 'q' and 'status' filter on) is absent, so the space is allocated poorly rather than efficiently.

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

Completeness2/5

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

For a 10-parameter, no-annotation, no-output-schema tool, the description leaves seven parameters undefined and says nothing about the shape of a returned journal entry or pagination behavior. What it does cover is deep but too narrow to make the definition callable with confidence.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, and it only documents 3 of 10 parameters (period_ids, untagged_subledger_control, origin). The ambiguous ones — 'q', 'status' (untyped string), sort/order/limit/offset — get no explanation at all, leaving most call semantics to guesswork.

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

Purpose4/5

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

Opens with a specific verb+resource ('List journal entries'), which is enough to separate it from get_gl_journal_entry and the create/post/reverse siblings by name alone. It never explicitly names an alternative, and the bulk of the text is about filters rather than the tool's scope, 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.

Usage Guidelines3/5

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

Gives strong conditional guidance for individual filters ('period_ids narrows to specific fiscal periods, and is how a caller asks for one fiscal year', 'untagged_subledger_control=true narrows to...'), which borders on usage guidance. But it never says when to reach for this tool rather than global_search, list_gl_open_items, or get_gl_journal_entry, and gives no exclusions.

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

list_gl_open_itemsAInspect

One page of the AR/AP subledger (member read).

direction filters server-side (ZCT-577) — omit it for both. The screen used to filter the fetched page in the browser, which made the AR chip drop rows and the total count both directions.

as_of (ZCT-577) reconstructs each item's open amount from posted journal lines dated on or before that date, instead of reading today's cached amount. Items are considered regardless of their current status — one settled since that date was open on it — so status is refused alongside it rather than silently ignored: a filter that appears to apply and does not is worse than an error. original_amount and status on each row remain the item's own, which are current facts, not as-of ones; the screen says so.

NameRequiredDescriptionDefault
as_ofNo
limitNo
offsetNo
statusNo
directionNo
company_idYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and largely meets it: it explains that `as_of` reconstructs open amounts from posted journal lines rather than the cached amount, that items are included regardless of current status, that `status` is actively refused rather than silently ignored, and that `original_amount`/`status` on rows remain current facts. It stops short of stating the read-only/no-mutation guarantee explicitly, 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.

Conciseness3/5

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

The purpose is front-loaded, but the body is padded with internal ticket references (ZCT-577 twice), a narrative about how the browser screen used to filter rows, and the throwaway "the screen says so." The core semantics are valuable; the provenance storytelling is not, and it dilutes an otherwise dense definition.

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

Completeness4/5

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

For a 6-parameter list tool with no output schema and no annotations, the description covers the tricky filtering semantics and even names two row fields (original_amount, status), which partially compensates for the missing return schema. What remains unstated — pagination behavior and the row shape beyond those two fields — is minor but not fully covered.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does so well for the non-obvious parameters: it defines `direction` as a server-side filter, explains exactly what `as_of` computes, and documents the `as_of`+`status` interaction. It says nothing about `limit`, `offset`, or `company_id`, but those are self-evident, leaving only a minor gap.

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

Purpose4/5

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

The opening states the resource precisely (AR/AP subledger open items) and implies the list/pagination verb ("one page"), plus a permission qualifier ("member read"). It is clear what the tool returns, but it never distinguishes itself from siblings such as list_ar_invoices or list_gl_journal_entries, 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.

Usage Guidelines3/5

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

It gives concrete usage rules for two parameters (omit `direction` for both directions; `status` is refused with `as_of`), which is real when-to-use guidance. However, it offers no routing guidance relative to the many sibling list/ledger tools, so an agent still has to guess whether this or list_ar_invoices is the right call.

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

list_gl_periodsAInspect

The company's accounting periods — the months a journal entry may post into (CompanyMember read).

A period belongs to one fiscal year and carries period_no (1..12 within the year), date_from/date_to and a status: open accepts postings, soft_closed still accepts them, and closed/year_closed refuse them — a posting date inside a closed period fails until an accountant explicitly reopens the period (POST …/gl/periods/{period_id}/reopen, reason required, recorded in the close-run ledger — ZET-161). fiscal_year_id narrows to one year; omitted, every year's periods come back.

This is not the VAT filing calendar — those are the gl_vat_period rows of GET …/gl/vat/periods, which have their own quarterly/monthly cadence and their own filed/paid sealing. Use this list to find the period_id a manual journal entry needs, and to check why a posting date was refused.

NameRequiredDescriptionDefault
company_idYes
fiscal_year_idNo

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it declares the read scope (CompanyMember read), defines the status lifecycle and which states accept vs refuse postings, states that a posting into a closed period fails, and points to the reopen flow including 'reason required'. This is unusually complete behavioral disclosure for a list tool.

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

Conciseness4/5

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

Purpose is front-loaded in the first line, and each subsequent paragraph adds real value (status semantics, filter behavior, sibling exclusion). It is dense and slightly long, with incidental parentheticals (ZET-161), but almost nothing is padding.

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

Completeness4/5

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

For a two-parameter list tool with no output schema and no annotations, the description is nearly self-sufficient — it even names the fields each row carries. The remaining gap is the absence of explicit company_id semantics and any note on result size/ordering.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It fully explains fiscal_year_id ('narrows to one year; omitted, every year's periods come back') but gives no explicit semantics for the required company_id beyond the permission note. One of two parameters is meaningfully covered.

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

Purpose5/5

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

States a specific verb and resource ('The company's accounting periods — the months a journal entry may post into') and explicitly distinguishes itself from the sibling list_gl_vat_periods. An agent can tell instantly what it returns and what it does not.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('find the period_id a manual journal entry needs, and to check why a posting date was refused') and a concrete when-not/alternative ('This is not the VAT filing calendar — those are the gl_vat_period rows of GET …/gl/vat/periods'). Routing is fully determined.

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

list_gl_vat_periodsDInspect

List Gl Vat Periods

NameRequiredDescriptionDefault
company_idYes

TDQS

D1.5/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure, and it discloses nothing — no read-only confirmation, no scoping, no pagination or auth notes.

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

Conciseness2/5

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

The text is short, but this is under-specification rather than conciseness — there is no information to be front-loaded or trimmed.

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

Completeness1/5

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

For a parameterized listing tool with no annotations and no output schema, the description is entirely inadequate; an agent cannot determine scope, return shape, or how it differs from list_gl_periods.

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

Parameters1/5

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

The single parameter company_id has 0% schema description coverage, and the description supplies no meaning, format, or source for it. With only one param and no compensating text, this is a clear gap.

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

Purpose2/5

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

The description 'List Gl Vat Periods' merely restates the tool name in title case. There is no elaboration on what a VAT period is, what is returned, or how it differs from the near-identical sibling list_gl_periods.

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

Usage Guidelines2/5

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

No when-to-use guidance, prerequisites, or alternatives are given. The presence of a sibling named list_gl_periods makes the distinction especially important, yet nothing in the description helps an agent choose between them.

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

list_itemsAInspect

List/filter items, scoped to the caller's member companies (A1).

Optional period (YYYY-MM) filters by the item's effective date (invoice date, falling back to the Europe/Zurich-local ingestion date); a malformed value returns 422 {"msg": "period must be YYYY-MM"}. exclude_triage_status drops items carrying that triage verdict (NULL-safe; for unrelated not a booked one, ZCT-954). Payables/Receivables pass unrelated, so parked items show only in the Inbox.

Optional q is free text: a case-insensitive partial (substring) match over the filename and the counterparty name from both of its sources (the linked counterparty and the extracted data.company). %/_ are matched literally, blank is ignored, and total counts the filtered set.

duplicate filters on the row's is_duplicate flag (ZET-413); credit_note on its is_credit_note flag (ZET-429) — both server-side, so total stays exact. posted filters on the posting badge (ZCT-811): true = posted, false = held, reversed or not booked; a copy filed with the booking of the same invoice ("Already booked", posting.filed_with) is in neither (ZEN-1).

NameRequiredDescriptionDefault
qNo
paidNo
limitNo
offsetNo
periodNo
postedNo
sourceNo
directionNo
duplicateNo
company_idNo
credit_noteNo
triage_statusNo
archive_statusNo
counterparty_idNo
exclude_triage_statusNo

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the 422 error and message for a malformed period, NULL-safe exclusion semantics, that server-side filters keep `total` exact, and the three-valued `posted` logic including the "Already booked" exclusion. Missing only pagination/ordering behavior and what the response body contains.

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

Conciseness4/5

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

Front-loaded with the core purpose, then organized one filter per paragraph. Dense but nearly every sentence carries semantics; internal ticket references (ZCT-954, ZET-413, ZEN-1) are noise that could be dropped.

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

Completeness3/5

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

For a 15-parameter, unannotated, output-schema-less list tool, the description explains the trickiest filters but leaves many parameters and the returned item shape undefined. An agent can call it, but not confidently for the undocumented filters.

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

Parameters3/5

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

Schema coverage is 0% across 15 parameters, but the description adds real meaning for roughly six of them (`period`, `exclude_triage_status`, `q`, `duplicate`, `credit_note`, `posted`), including substring/wildcard handling. `paid`, `source`, `direction`, `archive_status`, `company_id`, `counterparty_id`, `triage_status`, `limit` and `offset` remain undocumented in both places, which is a large uncompensated gap.

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

Purpose4/5

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

Opens with a specific verb+resource ("List/filter items") and states the access scope (caller's member companies). It never distinguishes itself from nearby siblings such as get_item, list_ar_invoices or global_search, so an agent must infer which listing tool applies.

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

Usage Guidelines3/5

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

Usage is implied through filter narratives ("Payables/Receivables pass unrelated, so parked items show only in the Inbox"), which hints at how the tool is used in practice. There is no explicit when-to-use / when-not-to-use statement or named alternative for retrieving a single item vs a filtered list.

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

list_payroll_employeesAInspect

Every employee on the payroll master data, with today's contract (accountant role — this payload is personal data, so it is not a plain member read).

One row per employee, active and left alike (filter on status / employment_end yourself — no server-side filter, no paging): master data (employee_no, display_name, address, ahv_number, birthdate), the Quellensteuer election (qst_liable + canton/tariff), the salary iban, and current_contract — the contract valid today, which is where the wage and workload live (null when none is in force).

readiness lists what is still missing before this employee can be included in a payroll run — read it before creating one; empty means ready. Note ahv_pensioner_allowance_waived is genuinely three-state: null means no election is on record, which blocks the AHV/FAK declaration, and is NOT "not waived". Use GET …/employees/{employee_id} for children and the full contract history.

NameRequiredDescriptionDefault
company_idYes

TDQS

A4.1/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and discharges it: it declares the accountant role and that the payload is personal data (auth implication), states there is no server-side filtering and no paging, notes one row per employee including left employees, explains current_contract is null when none is in force, and flags the three-state ahv_pensioner_allowance_waived pitfall that blocks the AHV/FAK declaration.

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

Conciseness4/5

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

Front-loaded with purpose and scope, then return shape, then caveats. Sentences are information-dense and each earns its place, though the multi-paragraph layout is longer than strictly necessary and the field enumeration could be tightened.

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

Completeness4/5

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

With no output schema and no annotations, the description does the work by enumerating the returned fields (employee_no, display_name, address, ahv_number, birthdate, qst_liable, iban, current_contract, readiness) and their null semantics. Only the missing parameter explanation keeps it from being fully complete.

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

Parameters2/5

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

The schema has 0% description coverage on the single required company_id, and the description never mentions or explains that parameter — it only implies company scoping via 'the payroll master data'. With low coverage the description is expected to compensate, and it provides no added meaning for the parameter.

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

Purpose5/5

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

States a specific verb and resource ('every employee on the payroll master data, with today's contract') and immediately distinguishes scope (accountant role, personal data, not a plain member read). It also names a differentiating sibling, the single-employee GET for children/contract history, so an agent can route without opening a schema.

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

Usage Guidelines4/5

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

Gives clear context and prerequisites: 'filter on status/employment_end yourself — no server-side filter, no paging' and 'read readiness before creating a payroll run', plus a pointer to GET …/employees/{employee_id} for children and contract history. It stops short of naming sibling list tools to use instead, but the when-to-use conditions are explicit.

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

list_payroll_runsAInspect

The company's payroll runs — one per wage period — newest period first (CompanyMember read; the money is aggregate, no per-employee PII).

A run walks draft → calculated → approved → posted → paid → locked (plus reversed); run_kind separates a regular run from a correction/reversal, which are always separate runs, never in-place edits, and are linked by original_run_id / reversed_by_run_id. journal_entry_id is the wage entry it posted (null before posted), and the lifecycle stamps (calculated_at, approved_at, posted_at, paid_at, locked_at) say when each step happened.

Each row also carries employee_count, gross_total/net_total and the validation error_count/warning_count — a run with errors must not be approved. staleness is computed at read time: non-null means master data changed after the run was calculated (a retroactive correction), so the frozen figures no longer match; it is advisory, and its action says what to do.

Filters: status_filter narrows to one lifecycle state, year to runs whose period starts in that calendar year. No paging. Use GET …/payroll/runs/due for wage months that have no run yet.

NameRequiredDescriptionDefault
yearNo
company_idYes
status_filterNo

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: read-only ('CompanyMember read'), no per-employee PII, no paging, lifecycle semantics (draft→...→locked, plus reversed), corrections/reversals as separate runs linked by original_run_id/reversed_by_run_id, journal_entry_id null before posted, per-row metrics, error_count blocking approval, and staleness computed at read time. This is rich, accurate 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.

Conciseness4/5

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

Long but tightly structured, front-loading the resource and scope before lifecycle and field detail. Every sentence contributes domain information, though the density is higher than strictly necessary for a list tool.

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

Completeness5/5

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

No output schema or annotations exist, so the description must supply return semantics and behavioral traits — and it does, covering row contents, lifecycle stamps, metrics, staleness, filters, and lack of paging. An agent has everything needed to call and interpret this tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate; it explains year (runs whose period starts that calendar year) and status_filter (narrows to one lifecycle state, with states enumerated in the prose) while company_id is self-evident. It adds real meaning beyond the bare schema types, though it doesn't document allowed value formatting exhaustively.

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

Purpose4/5

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

States a specific resource and scope clearly: 'The company's payroll runs — one per wage period — newest period first', including the read-only nature and that amounts are aggregate. Distinguishes itself from the due-endpoint variant, but does not explicitly differentiate from sibling tools such as list_payroll_employees.

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

Usage Guidelines4/5

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

Explains filter usage (status_filter narrows to one lifecycle state, year to period-start year) and names an alternative endpoint for wage months that have no run yet. However, it gives no explicit when-not-to-use guidance or direct comparison to the other payroll/list tools.

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

onboarding_guideAInspect

How to onboard and create a NEW company: what to ask the user for, which documents to request, and the order to run the setup in.

Discovery does not depend on search: this tool is in the tier, so it is listed for every caller, and BASE_INSTRUCTIONS names it. find_operations does reach it ("new company setup" ranks it first), but a query made only of common words is still decided by whichever tool happens to contain them.

Read this before you start a company setup, and before you tell a user that something cannot be done here. It answers the questions the create's own schema cannot: which of fifteen sections actually matter, which documents produce them, and what it costs to skip one.

If your API key's purpose is onboarding, this is the only job it has.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose real behavior: it sits in the tier listed for every caller, find_operations reaches it but ranking is unreliable, and an onboarding-scoped API key exists solely for this job. It never explicitly states the tool is side-effect-free (implied by 'guide'), but the auth/discovery context is unusually rich.

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

Conciseness3/5

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

The purpose is front-loaded in the first sentence, but two of the four paragraphs are meta-commentary about discovery mechanics and tier listing that, while marginally useful in discouraging redundant search calls, is verbose for a zero-parameter guide. It could be tightened without losing the routing signal.

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

Completeness4/5

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

For a parameterless informational tool with no annotations and no output schema, the description covers what it is, when to read it, what it contains, and its discovery/auth context. It stops short of sketching the return shape, though the 'fifteen sections' framing implies it.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description's detail about 'fifteen sections' and which documents produce them describes the tool's content rather than adding parameter meaning, but there are no parameters whose semantics are left unexplained.

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

Purpose4/5

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

States a specific verb and resource: 'How to onboard and create a NEW company,' and enumerates the scope ('what to ask the user for, which documents to request, and the order to run the setup in'). It partially differentiates from siblings by contrasting with find_operations and the create tool's schema, but never clarifies its relationship to plausible near-siblings like start_signup or collect_api_key.

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

Usage Guidelines4/5

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

Gives explicit when-to-use guidance: 'Read this before you start a company setup, and before you tell a user that something cannot be done here.' It also explains the discovery condition that selects it over search. However, it offers no exclusion rules against the other onboarding-flavored siblings.

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

post_gl_journal_entryAInspect

Post a draft entry into the books — accountant. One-way.

A posted entry can no longer be replaced or discarded (both refuse with 409); the only general correction is …/reverse, which leaves both the original and the reversal visible. The one exception is PUT …/guessed-account, which re-points a coding_guessed entry's expense account in place — and it works only on a posted entry. Check the draft before posting rather than after.

NameRequiredDescriptionDefault
bodyNo
entry_idYes
company_idYes

TDQS

A4.1/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses irreversibility, the 409 refusal on replace/discard, the reverse-and-leave-both-visible recovery path, and the single in-place exception (guessed-account on a coding_guessed entry). This is exactly the failure mode an agent would otherwise trigger.

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

Conciseness4/5

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

Front-loaded with the action and its 'One-way' warning, then three tight sentences on consequences. Slightly heavy use of code-path fragments ('…/reverse', 'PUT …/guessed-account') and 'ZET-159'-style references outside the description, but no wasted prose.

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

Completeness4/5

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

For a mutation tool with no annotations and no output schema, the description covers the important danger zone (irreversibility, error codes, recovery). It stops short of stating auth/role requirements beyond the word 'accountant' and never describes what posting returns.

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

Parameters2/5

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

Top-level schema description coverage is 0% and the description mentions none of entry_id, company_id, or the body flags. The nested body properties (not_vat, allow_untagged_control, confirm_bank_duplicate) are documented in the schema only, and the description never connects them to the error paths it warns about — so it fails to compensate for the coverage gap.

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

Purpose5/5

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

States a specific verb+resource ('Post a draft entry into the books') and immediately pins it to a role ('accountant') and a one-way nature. That plus the reference to '…/reverse' cleanly separates it from create_gl_journal_entry (draft creation), get_gl_journal_entry (read) and reverse_gl_journal_entry (correction).

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

Usage Guidelines4/5

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

Gives clear operational context: verify the draft first because posting is irreversible, and reserve the guessed-account PUT for one specific case. It does not explicitly name create_gl_journal_entry as the precondition tool, so the routing to the correct sibling for drafting 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.

reconciliation_summaryAInspect

Reconciliation summary banner.

Optional from/to scope the per-entry bank-entry counts (total / matched / missing-invoice / …) to a booking_date window — mirroring the /bank-entries grid filter — so the banner agrees with a month-filtered table. The cross-month coverage (bank_accounts gaps / missing_periods) stays global: gap detection spans statements regardless of the selected month.

NameRequiredDescriptionDefault
toNo
fromNo
company_idYes

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden, and it discloses a genuinely non-obvious trait: the from/to window scopes only the per-entry counts, while cross-month gap detection remains global. That asymmetry is the kind of thing an agent could not guess. It still omits auth/permission requirements and the return shape.

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

Conciseness4/5

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

Front-loaded with the purpose, then the scoping rule and its limit in two tight sentences. The stray 'Reconciliation summary banner.' lead is close to redundant with the title-like name, but the rest earns its place with no padding.

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

Completeness3/5

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

There is no output schema, so the description must convey return content; it does name the key fields (counts, gaps, missing_periods) but does not enumerate the fields fully or explain company_id. Adequate but with clear gaps for a 3-parameter report tool.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains from/to semantics well (booking_date window, mirroring the grid filter) and reveals their partial effect on the result, but says nothing about the required company_id parameter or the expected date format.

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

Purpose4/5

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

The body states a concrete verb+resource: it returns a reconciliation summary containing per-entry bank-entry counts (total/matched/missing-invoice) plus cross-month coverage (bank_accounts gaps, missing_periods). The opening line 'Reconciliation summary banner' is thin on its own, but the following sentences make the output content unambiguous. It does not, however, distinguish itself from near-neighbours like get_bank_status or list_bank_entries.

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

Usage Guidelines3/5

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

It explains what the optional from/to do and that they mirror the /bank-entries grid filter, which implies usage for month-filtered views. But it never states when to call this rather than list_bank_entries, get_bank_status, or list_bank_accounts, nor any prerequisites beyond the required company_id.

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

request_api_keyAInspect

Ask the user to hand this session a Zeno API key. Use this first — every current Zeno user already has an account.

email is the address on their Zeno account. Ask them for it; you cannot guess it, and the request is aimed by it — Zeno will only show it to somebody signed in as the owner of that address. Pass client_name too: it is the only thing identifying you on the approval page, and without it the person is asked to trust "an unnamed client".

Returns a plain verification_uri. Tell the user to open it, sign in, and approve the request waiting there; we also email them a notice. There is no code, in either direction: nothing to read out, nothing to type, and nothing for you to put in a link.

Then call collect_api_key with the claim_token returned here, waiting poll_interval_seconds between calls, until its status stops being pending. The user chooses on the page what the key may reach — usually a single company — so expect the key to be scoped, and read a 403 elsewhere as that scope rather than as a failure.

The answer is the same whether or not that address has a Zeno account. If nothing ever arrives, the likeliest cause is a mistyped address — ask, do not assume.

NameRequiredDescriptionDefault
emailYes
client_nameNo

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: returns a plain `verification_uri`, an email notice is also sent, no code exists in either direction, the user chooses the key's scope on the page, and a 403 outside that scope should be read as scope, not failure. It also discloses the enumeration-resistant behavior (same answer whether or not the address has an account), which an agent could not infer from the schema.

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

Conciseness4/5

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

Front-loaded with the imperative 'Use this first' and organized in short paragraphs that each carry a distinct instruction. Some emphasis is repeated for effect ('There is no code... nothing to read out, nothing to type, nothing for you to put in a link'), which is defensible anti-error reinforcement but slightly verbose.

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

Completeness5/5

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

No output schema or annotations exist, so the description must cover returns and lifecycle, and it does: the return value, the asynchronous polling contract with the sibling tool, the status field to watch, and the scoping/403 edge case. Nothing an agent needs to initiate and complete this flow is missing.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does for both parameters: `email` is the address on the user's Zeno account, must be asked for rather than guessed, and 'aims' the request so only that owner sees it; `client_name` is the only identifier shown on the approval page and its absence makes the client look unnamed. This is meaning well beyond the untyped string properties.

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

Purpose5/5

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

States a specific verb and resource: obtain a Zeno API key for the current session via a user-approved flow. It immediately distinguishes itself from siblings by naming `collect_api_key` as the follow-up and `email`/`client_name` as its inputs, so an agent can tell it apart from the many read/write Zeno tools without opening the schema.

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

Usage Guidelines5/5

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

Explicit sequencing: 'Use this first', then call `collect_api_key` with the returned `claim_token`, waiting `poll_interval_seconds` until status stops being `pending`. It also names the non-obvious alternative context (every current Zeno user already has an account) and warns not to assume a mistyped address is a missing account.

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

reverse_gl_journal_entryAInspect

Storno a posted journal entry: post its mirror image (accountant role).

Nothing is deleted; the original stays, linked, and the reversal entry is returned. The only VAT-correct storno door — VAT postings, open items and what the document spawned are all unwound.

body.posting_date dates the reversal and decides its period; omitted, it reuses the original's. A closed-period entry needs one in an open period and a person: the reversal is booked there; the entry stays unchanged.

409 when: the entry is a reversal or already corrected; the date falls in a filed VAT period; an open item still carries a live settlement; the target period is closed or sealed; or a closed-period entry cannot be corrected (the reason is named).

NameRequiredDescriptionDefault
bodyNo
entry_idYes
company_idYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses that nothing is deleted, the original is retained and linked, the reversal entry is returned, and VAT postings/open items/document side effects are unwound. It also lists the specific 409 triggers and the closed-period correction procedure, which is exactly the behavioral context an agent needs before invoking a mutation.

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

Conciseness4/5

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

Front-loaded with the outcome in the first line, then parameter behavior, then failure modes — a logical progression. Markdown bolding and backticks add slight visual noise, but every sentence carries information.

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

Completeness5/5

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

No output schema exists, yet the description states the reversal entry is returned; it covers side effects, defaulting behavior, closed-period handling, and the full set of 409 reasons. Nothing an agent needs to call this mutation safely is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It does for the one non-obvious parameter: body.posting_date determines the reversal's date and period, and defaults to the original's date when omitted. entry_id and company_id are left implicit, which is reasonable since their meaning is self-evident, but it keeps this from a 5.

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

Purpose5/5

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

States a specific verb and resource ('Storno a posted journal entry: post its mirror image') and scopes it to an accountant role. The word 'Storno' plus 'mirror image' makes clear it is not the same as create_gl_journal_entry or post_gl_journal_entry, even 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.

Usage Guidelines4/5

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

'The only VAT-correct storno door' explicitly routes the agent here rather than to a manual reversal, and the 409 paragraph enumerates concrete conditions where the call will fail. It stops short of naming alternative siblings or a fallback path when a 409 occurs, so not quite a 5.

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

settle_entryAInspect

Post this reconciled bank entry into the GL (clean-bank settlement).

Matched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed entry now fully matched → Dr Suspense / Cr AR. Idempotent, and a no-op (skipped) when the GL chart is not configured for native settlement. The matcher still owns reconciliation_status. See doc/architecture.md §"Posting general ledger".

NameRequiredDescriptionDefault
entry_idYes

TDQS

A4/5.0
Behavior4/5

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

No annotations, so the description carries the full burden and does well: it discloses idempotency, the no-op/skipped behavior when the GL chart isn't configured for native settlement, the exact double-entry posting rules per match state, and that the matcher still owns reconciliation_status. The only gap is it doesn't state auth/permission requirements or what the response payload looks like.

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

Conciseness4/5

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

Front-loads the core action, then enumerates the branch-specific postings compactly. The doc reference is a useful pointer but slightly lengthens it; overall still tight.

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

Completeness4/5

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

For a single-param mutation tool with no annotations and no output schema, the description covers behavior, side effects, and idempotency well. It leaves parameter identity underspecified and doesn't mention permissions, but the core semantics are complete.

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

Parameters2/5

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

Schema description coverage is 0% and parameter count is 1, but the description says nothing about what entry_id refers to (a bank entry ID from which system) or its format. Baseline for 1 param with no description is weak; the description does not compensate.

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

Purpose5/5

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

States a specific verb+resource (Post ... bank entry into the GL) plus a parenthetical scope qualifier (clean-bank settlement). This clearly distinguishes it from siblings like post_gl_journal_entry or reverse_gl_journal_entry.

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

Usage Guidelines4/5

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

The description explains the conditions that select each posting variant (matched vs unmatched vs previously-suspensed) and notes the no-op case, which effectively tells the agent when the tool will vs won't do anything. It doesn't name an alternative tool explicitly, but the conditions are clear.

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

start_signupAInspect

Create a Zeno account for somebody who does not have one yet.

Use request_api_key first if they might already have an account — this tool cannot tell you, and deliberately never will.

We email email a verification link. The user opens it, sees that you asked (by the name in client_name, shown as an unverified claim), chooses their own password, and decides separately whether to connect you. You never see the link, and you must not ask for it: it is what proves they own the mailbox, and a link you could repeat is a link anyone could.

Then poll collect_api_key with the claim_token returned here. denied is terminal and means the person chose to create the account without connecting you, or refused outright — tell them plainly and stop; do not start another.

NameRequiredDescriptionDefault
emailYes
client_nameNo

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and delivers: it explains the email-verification handshake, that the agent never sees the link and must not ask for it, that client_name appears as an unverified claim, and the terminal 'denied' outcome. This is unusually rich behavioral disclosure for a write/identity tool.

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

Conciseness4/5

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

Front-loaded with the core action, then sequencing, then guardrails, with no filler sentences. It runs longer than most definitions, but each paragraph carries distinct operational content rather than restating the name.

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

Completeness5/5

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

No annotations and no output schema, yet the description covers actor, side effects, the returned claim_token, the follow-up tool, and terminal states. Nothing an agent needs to invoke start_signup correctly is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it largely does: email is explained as the mailbox that receives the verification link, and client_name as the name shown to the user as an unverified claim. It never states that email is required or gives formatting constraints, leaving a small gap.

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

Purpose5/5

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

States a specific verb and resource: 'Create a Zeno account for somebody who does not have one yet.' It immediately distinguishes itself from request_api_key and collect_api_key by name, so an agent can route between the signup-flow siblings without opening schemas.

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

Usage Guidelines5/5

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

Explicit prerequisites and sequencing: use request_api_key first if the person might already have an account, then poll collect_api_key with the returned claim_token. It also states a hard stop condition ('denied is terminal ... do not start another'), which is exactly the when-not guidance an agent needs.

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

upload_documentAInspect

Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis. file_base64 is the file's raw bytes, base64-encoded. direction is payable (incoming supplier invoice) or receivable (outgoing). Creates Item(s) and queues extraction.

This door is invoices-only: it never routes a file onward by type, so a bank statement, a journal export or a balance sheet sent here is analysed and then just sits as a document. For anything that is not an invoice — or when you are not sure what the file is — use upload_intake.

NameRequiredDescriptionDefault
filenameYes
directionNopayable
company_idYes
file_base64Yes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose key side effects: it 'Creates Item(s) and queues extraction', and it explains the misrouting behavior. It stops short of stating permission requirements, whether uploads are idempotent, or limits on file size/count.

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

Conciseness4/5

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

Front-loads the purpose and accepted types, then the routing warning in a clearly marked final paragraph. Slightly verbose around the backtick-quoted parameter names, but no sentence is wasted.

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

Completeness3/5

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

For a 0%-coverage, no-annotation, no-output-schema mutation tool, the purpose and routing story are complete, but gaps remain: two parameters are undefined and no auth/idempotency behavior is given. Adequate but not fully self-contained.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It usefully defines file_base64 (raw bytes, base64-encoded) and direction (payable vs receivable), covering two of four parameters, but leaves filename and company_id undocumented in both the schema and the description.

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

Purpose5/5

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

States a specific verb and resource ('Upload an INVOICE or RECEIPT ... for analysis') and immediately scopes the file types accepted (PDF, image, .zip). It also explicitly distinguishes itself from the sibling upload_intake, so an agent can route 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.

Usage Guidelines5/5

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

Gives an explicit when-not: 'For anything that is not an invoice — or when you are not sure what the file is — use upload_intake.' It also describes the consequence of misrouting (file is analysed and sits as a document), which is exactly the decision support an agent needs.

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

upload_intakeAInspect

Upload ANY file and let the system decide what it is (the unified intake queue — the same door as "Documents → Upload" in the web app). file_base64 is the file's raw bytes, base64-encoded.

Prefer this whenever the file is not plainly an invoice, and always for: bank statements (CAMT.053 XML, CSV, PDF or Excel exports) — these become BankStatement + BankEntry rows, matched to the registered bank account by IBAN; journal/accounting exports; and balance sheets, P&L statements and VAT filings. Mixed .zip archives are expanded and routed per file.

Returns 202 with the queue row: routing happens asynchronously, so poll get_intake for the outcome and its targets. An unroutable file becomes a failed queue row carrying the reason — it is never silently dropped.

NameRequiredDescriptionDefault
filenameYes
company_idYes
file_base64Yes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses the 202 async response, that routing happens asynchronously, that the agent must poll get_intake, that unroutable files become failed queue rows with a reason rather than being dropped, and the downstream effects (BankStatement + BankEntry rows matched by IBAN, zip expansion).

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

Conciseness4/5

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

Front-loaded with the core purpose, then the routing list, then return/poll behavior. Dense and largely free of filler, though the long enumerated file-type list plus zip note is slightly heavy for a single sentence run-on.

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

Completeness5/5

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

No output schema and no annotations, yet the description covers the response (202 + queue row id), the follow-up call (get_intake), failure semantics, and per-file-type routing outcomes — everything an agent needs to invoke and complete the flow.

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

Parameters3/5

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

Schema coverage is 0%, so description must compensate. It clarifies file_base64 as raw bytes base64-encoded, but filename and company_id are left undescribed — company_id in particular is non-obvious in a multi-company context and could need scoping rules. Partial compensation warrants the baseline 3.

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

Purpose5/5

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

States a concrete verb+resource ('Upload ANY file') and immediately pins the scope to the unified intake queue, equating it with the 'Documents → Upload' web-app door. This clearly separates it from the sibling 'upload_document' and from invoice-specific creation tools.

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

Usage Guidelines5/5

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

Explicit routing rule: prefer this 'whenever the file is not plainly an invoice', with an enumerated must-use list (bank statements in CAMT.053/CSV/PDF/Excel, journal exports, balance sheets, P&L, VAT filings, mixed zips). It tells the agent both when to use it and, by saying 'not plainly an invoice', when to prefer the invoice path.

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

whoamiAInspect

Which user this request acts as, and which company's books it is bound to (jwt or API key).

Zeno serves every tenant from one host, and an API key is opaque — nothing else tells a connected agent whose books it is about to write. Call this FIRST when working over MCP: company_scoped: true means this connection's data access is confined to company_id — company_name names it (null here means the bound company no longer exists), no other tenant is reachable, and the admin endpoints are refused however privileged the owner is. is_admin is that owner's bit: worth nothing outside this company, still full authority inside it, so a scoped key with is_admin: true may write these books even when company_role is null. company_scoped: false means the credentials carry the owner's full principal and memberships lists the companies it can act in. Read-only and cheap — at most one lookup. ZET-171, ZET-176.

credential_purpose says which kind of credential this is, and is what the withholding rule keys on (SP-08): anything that is neither full nor session is confined, and gets memberships withheld — null, not empty.

Working over MCP, what you book or accept is recorded as MCP — not as this user acting in person — and the app displays it that way.

capabilities says what this caller may do, each verdict computed from the predicate the gate itself evaluates (SP-12) — so an agent learns what it cannot do before it collides rather than after. A credential confined to a company gets the entries whose verdict is a fact about the credential; the one that would read the owner's estate (create_company) is omitted, because its verdict would disclose a sibling tenant. A credential confined to no company — an onboarding key — has no sibling to disclose and does get it, which is the one operation such a key exists to call. pending_admin_actions is present and empty until PRE-03/PRE-04 fill it.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and delivers: it discloses read-only/cheap behavior ("at most one lookup"), auth semantics (jwt or API key), the company-scoping enforcement including that admin endpoints are refused, the memberships withholding rule, and that MCP-recorded actions display as MCP. This is unusually rich behavioral disclosure.

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

Conciseness3/5

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

The first sentence is well front-loaded, but the body is a dense wall of text with internal ticket references (ZET-171, ZET-176, SP-08, SP-12, PRE-03/PRE-04) that mean nothing to an agent, plus convoluted phrasing like "worth nothing outside this company, still full authority inside it." Much of the content earns its place given no output schema, but the noise and length cost it.

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

Completeness5/5

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

There is no output schema, so the description must explain the return shape — and it does, defining every field's meaning and the null-vs-empty distinction for memberships. For a zero-parameter identity/scope probe, nothing an agent needs to interpret the result is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description instead invests heavily in output-field semantics (company_scoped, company_id, company_name, is_admin, memberships, credential_purpose, capabilities), which is valuable but belongs to return-value interpretation rather than parameter meaning.

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

Purpose5/5

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

The opening sentence states a specific verb and resource: which user the request acts as and which company's books it is bound to. It is clearly distinguished from siblings like get_company or list_companies, which fetch company data rather than resolving the caller's own identity/scope.

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

Usage Guidelines4/5

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

"Call this FIRST when working over MCP" is explicit, actionable timing guidance. It lacks an explicit when-not or named alternative, but the tool is effectively a singleton prerequisite so the missing exclusion is minor.

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

zeno_infoAInspect

What this server is, which MCP revision it speaks, and how to get a credential.

Needs no credential. Call it first if a tool has just refused you: the authentication block names the tools that can get this session connected.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does so reasonably: it declares that no credential is needed (an auth requirement) and describes what the response contains (an authentication block naming credential tools). It stops short of describing cost or side effects, though for a zero-param info tool there is little else to disclose.

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

Conciseness4/5

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

Two short sentences, the key fact (no credential) bolded and front-loaded before the diagnostic use case. Minor awkwardness in the fragment-style first sentence, but no waste.

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

Completeness4/5

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

For a parameterless read-only info tool with no output schema, the description is nearly complete: it covers auth needs and the shape of the useful return. Only the sibling disambiguation is missing.

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

Parameters4/5

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

Zero parameters, so the baseline is 4; the description correctly implies a no-argument call and adds nothing misleading about inputs.

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

Purpose4/5

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

States a specific content set: server identity, MCP revision, and credential acquisition, so the agent knows what it returns. It does not differentiate itself from close siblings like zeno_overview, onboarding_guide, or whoami, which is the main gap.

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

Usage Guidelines4/5

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

Gives a concrete trigger: call it first after a tool has refused you, and it will name the tools that can establish a connection. Clear context, but no explicit when-not or comparison against the overview/onboarding siblings.

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

zeno_overviewAInspect

What Zeno does, in one page — the platform's capabilities and its limits.

Needs no credential. Read this before telling a user that Zeno cannot do something; it covers VAT, payroll, reconciliation and the AI accountant.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations and no output schema, the description carries the full burden. It usefully discloses the auth profile ('Needs no credential') and scope ('one page'), which an agent cannot get from the empty schema. Beyond that it says nothing about the return format or structure, so it is only partially transparent.

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

Conciseness5/5

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

Front-loaded with the core statement, then two tight sentences covering auth requirements and the trigger for reading it. The bolded credential note is well placed and every sentence earns its place.

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

Completeness4/5

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

For a zero-parameter informational tool with no output schema, the description covers purpose, auth profile, and usage trigger adequately. It could say a bit more about what the page actually returns, but nothing critical for invoking the tool is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to add and the baseline of 4 applies. Schema coverage is nominally 100% (vacuous), and no meaningful param detail could be provided.

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

Purpose4/5

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

States a specific resource and scope: an overview of the platform's capabilities and limits, plus the topic areas it covers (VAT, payroll, reconciliation, AI accountant). The purpose is clear, but it does not distinguish itself from closely related meta-siblings such as zeno_info, describe_operations, or onboarding_guide, leaving the agent to guess which overview-named tool to pick.

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

Usage Guidelines4/5

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

Gives a concrete trigger condition — 'Read this before telling a user that Zeno cannot do something' — which is a genuinely useful when-to-use cue. It offers no exclusions or explicit comparison to the other informational siblings (zeno_info, describe_operations), so it stops short of full alternative routing.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedlist_autopost_decisions1 field changed
      • changedInput schema / properties / cause / anyOf
        Previous value: -[
        -  {
        -    "description": "Why a decision is sitting in the held tier.",
        -    "enum": [
        -      "not_a_decision",
        -      "expense_receipt",
        -      "autonomy_off",
        -      "post_failed",
        -      "period_closed",
        -      "amount_cap",
        -      "credit_note",
        -      "duplicate_suspicion",
        -      "self_counterparty",
        -      "card_statement",
        -      "payroll_liability_review",
        -      "vat_uncertainty",
        -      "fx_untranslated",
        -      "risk_flags",
        -      "open_questions",
        -      "proposal_rejected",
        -      "missing_original",
        -      "settlement_mismatch",
        -      "recognition_schedule",
        -      "pre_llm_guard",
        -      "low_confidence",
        -      "fy_predates_books",
        -      "fy_gap",
        -      "unknown_vat_code",
        -      "currency_mismatch",
        -      "bank_history",
        -      "bank_suspense",
        -      "awaiting_review",
        -      "unclassified"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Why a decision is sitting in the held tier.",
        +    "enum": [
        +      "not_a_decision",
        +      "expense_receipt",
        +      "autonomy_off",
        +      "post_failed",
        +      "period_closed",
        +      "amount_cap",
        +      "credit_note",
        +      "duplicate_suspicion",
        +      "self_counterparty",
        +      "card_statement",
        +      "payroll_liability_review",
        +      "vat_uncertainty",
        +      "fx_untranslated",
        +      "risk_flags",
        +      "open_questions",
        +      "proposal_rejected",
        +      "missing_original",
        +      "settlement_mismatch",
        +      "recognition_schedule",
        +      "pre_llm_guard",
        +      "low_confidence",
        +      "fy_predates_books",
        +      "fy_gap",
        +      "unknown_vat_code",
        +      "currency_mismatch",
        +      "bank_history",
        +      "bank_suspense",
        +      "awaiting_review",
        +      "unclassified",
        +      "reopened_after_reversal",
        +      "booked_differently"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  2. 2 tool updates
    • Changedlist_autopost_decisions1 field changed
      • changedInput schema / properties / outcome / anyOf
        Previous value: -[
        -  {
        -    "description": "Outcome recorded for one autonomy decision (``gl_autopost_decision``).\n\n``posted`` — ``auto`` mode, policy cleared, entry was posted (AI).\n``held`` — policy did not clear; nothing posted, falls back to human review.\n``shadow`` — ``assist`` mode, policy *would* have posted but did not (shadow).",
        -    "enum": [
        -      "posted",
        -      "held",
        -      "shadow"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Outcome recorded for one autonomy decision (``gl_autopost_decision``).\n\n``posted`` — ``auto`` mode, policy cleared, entry was posted (AI).\n``held`` — policy did not clear; nothing posted, falls back to human review.\n``shadow`` — ``assist`` mode, policy *would* have posted but did not (shadow).\n``dismissed`` — held, then closed unposted: the document was decided another way.",
        +    "enum": [
        +      "posted",
        +      "held",
        +      "shadow",
        +      "dismissed"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedlist_gl_journal_entries1 field changed
      • addedInput schema / properties / origin
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "human",
        +        "system",
        +        "ai",
        +        "api",
        +        "mcp",
        +        "chat"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  3. 2 tool updates
    • Changedaccept_autopost_decision1 field changed
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "description": "Optional ``POST /autopost-decisions/{id}/accept`` body.\n\nTwo paths read it. The ``expense:receipt:item:`` claim path needs an employee\nand a category (both NOT NULL on the claim plane). The ``autopost:capitalize:``\npath needs a ``fixed_asset_category_id`` when the hold could not resolve one —\na missing category is a 422, never a guess, because the wrong category posts\nthe cost to the wrong balance-sheet account and depreciates it into the wrong\nexpense. The capitalize path may need a third fact:\n``reclassify_from_account_code`` when the hold is a mixed-invoice split whose\nsource line did not resolve (``needs_split_source``) — again a 422 without it,\nnever a guess. Omit the body entirely for every other decision kind (backward\ncompatible).",
        -    "properties": {
        -      "category_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "confirm_not_card_statement": {
        -        "default": false,
        -        "type": "boolean"
        -      },
        -      "employee_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "fixed_asset_category_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "reclassify_from_account_code": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "separate_document": {
        -        "default": false,
        -        "type": "boolean"
        -      },
        -      "useful_life_months": {
        -        "anyOf": [
        -          {
        -            "minimum": 1,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Optional ``POST /autopost-decisions/{id}/accept`` body; omit it for other kinds.",
        +    "properties": {
        +      "category_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "confirm_not_card_statement": {
        +        "default": false,
        +        "type": "boolean"
        +      },
        +      "employee_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "fixed_asset_category_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "reclassify_from_account_code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "separate_document": {
        +        "default": false,
        +        "type": "boolean"
        +      },
        +      "useful_life_months": {
        +        "anyOf": [
        +          {
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedlist_autopost_decisions1 field changed
      • addedInput schema / properties / cause
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "Why a decision is sitting in the held tier.",
        +      "enum": [
        +        "not_a_decision",
        +        "expense_receipt",
        +        "autonomy_off",
        +        "post_failed",
        +        "period_closed",
        +        "amount_cap",
        +        "credit_note",
        +        "duplicate_suspicion",
        +        "self_counterparty",
        +        "card_statement",
        +        "payroll_liability_review",
        +        "vat_uncertainty",
        +        "fx_untranslated",
        +        "risk_flags",
        +        "open_questions",
        +        "proposal_rejected",
        +        "missing_original",
        +        "settlement_mismatch",
        +        "recognition_schedule",
        +        "pre_llm_guard",
        +        "low_confidence",
        +        "fy_predates_books",
        +        "fy_gap",
        +        "unknown_vat_code",
        +        "currency_mismatch",
        +        "bank_history",
        +        "bank_suspense",
        +        "awaiting_review",
        +        "unclassified"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  4. 1 tool update
    • Changedaccept_autopost_decision1 field changed
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "description": "Optional ``POST /autopost-decisions/{id}/accept`` body.\n\nTwo paths read it. The ``expense:receipt:item:`` claim path needs an employee\nand a category (both NOT NULL on the claim plane). The ``autopost:capitalize:``\npath needs a ``fixed_asset_category_id`` when the hold could not resolve one —\na missing category is a 422, never a guess, because the wrong category posts\nthe cost to the wrong balance-sheet account and depreciates it into the wrong\nexpense. The capitalize path may need a third fact:\n``reclassify_from_account_code`` when the hold is a mixed-invoice split whose\nsource line did not resolve (``needs_split_source``) — again a 422 without it,\nnever a guess. Omit the body entirely for every other decision kind (backward\ncompatible).",
        -    "properties": {
        -      "category_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "confirm_not_card_statement": {
        -        "default": false,
        -        "type": "boolean"
        -      },
        -      "employee_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "fixed_asset_category_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "reclassify_from_account_code": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "useful_life_months": {
        -        "anyOf": [
        -          {
        -            "minimum": 1,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Optional ``POST /autopost-decisions/{id}/accept`` body.\n\nTwo paths read it. The ``expense:receipt:item:`` claim path needs an employee\nand a category (both NOT NULL on the claim plane). The ``autopost:capitalize:``\npath needs a ``fixed_asset_category_id`` when the hold could not resolve one —\na missing category is a 422, never a guess, because the wrong category posts\nthe cost to the wrong balance-sheet account and depreciates it into the wrong\nexpense. The capitalize path may need a third fact:\n``reclassify_from_account_code`` when the hold is a mixed-invoice split whose\nsource line did not resolve (``needs_split_source``) — again a 422 without it,\nnever a guess. Omit the body entirely for every other decision kind (backward\ncompatible).",
        +    "properties": {
        +      "category_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "confirm_not_card_statement": {
        +        "default": false,
        +        "type": "boolean"
        +      },
        +      "employee_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "fixed_asset_category_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "reclassify_from_account_code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "separate_document": {
        +        "default": false,
        +        "type": "boolean"
        +      },
        +      "useful_life_months": {
        +        "anyOf": [
        +          {
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  5. 51 tool updates
    • First observedaccept_autopost_decision
    • First observedcall_operation
    • First observedcollect_api_key
    • First observedcreate_ar_invoice
    • First observedcreate_gl_journal_entry
    • First observedcustomer_statement
    • First observeddescribe_operations
    • First observedentry_candidates
    • First observedfind_operations
    • First observedget_ar_invoice
    • First observedget_bank_entry
    • First observedget_bank_status
    • First observedget_company
    • First observedget_financial_statements
    • First observedget_gl_account_ledger
    • First observedget_gl_journal_entry
    • First observedget_intake
    • First observedget_item
    • First observedget_kpi_report
    • First observedget_work_list
    • First observedgl_balance_sheet
    • First observedgl_profit_and_loss
    • First observedgl_trial_balance
    • First observedglobal_search
    • First observedissue_ar_invoice
    • First observedlist_ar_invoices
    • First observedlist_autopost_decisions
    • First observedlist_bank_accounts
    • First observedlist_bank_entries
    • First observedlist_companies
    • First observedlist_counterparties
    • First observedlist_gl_accounts
    • First observedlist_gl_journal_entries
    • First observedlist_gl_open_items
    • First observedlist_gl_periods
    • First observedlist_gl_vat_periods
    • First observedlist_items
    • First observedlist_payroll_employees
    • First observedlist_payroll_runs
    • First observedonboarding_guide
    • First observedpost_gl_journal_entry
    • First observedreconciliation_summary
    • First observedrequest_api_key
    • First observedreverse_gl_journal_entry
    • First observedsettle_entry
    • First observedstart_signup
    • First observedupload_document
    • First observedupload_intake
    • First observedwhoami
    • First observedzeno_info
    • First observedzeno_overview

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Free, open-source (MIT), local-first Swiss accounting MCP server: an AI agent posts double-entry journal entries, categorises and chases invoices, and prepares the MWST-Abrechnung (the Swiss VAT return), with a minimalist Studio for human oversight. Posted entries are append-only and immutable, corrections are reversing entries, and every query is tenant-scoped.
    500
    198 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    16
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    MCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.
    15
    25 npm
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources