Skip to main content
Glama

Server Details

Spanish Veri*factu invoicing: create invoices, expenses and VAT returns from your AI assistant.

Ownership verified
Status
Healthy
Uptime
16.2% over 77 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.6/5.0

Scored across 81 tools

Disambiguation4/5

Most tools target clear, distinct resources and actions, and the descriptions actively differentiate near-neighbors (calculate_modelo_303 vs get_modelo, send_invoice vs mark_invoice_sent vs send_reminder, finalize_invoice vs submit_invoice_to_face vs resubmit_invoice_aeat). However, the cluster of gestoria_*_mandante tools (facturas, gastos, resumen, revision) overlaps in the client-period data they surface, which could cause occasional misselection.

Naming Consistency3/5

The English-origin tools follow a fairly consistent verb_noun snake_case pattern (create_invoice, list_expenses, set_invoice_footer), but the gestoria_ prefix group breaks the pattern with a mix of Spanish verbs and nouns (gestoria_abrir_mandante, gestoria_certificado_mandante, gestoria_comisiones, gestoria_revision_mandante). Readable overall, but two conventions coexist and the gestoría naming is internally inconsistent.

Tool Count2/5

81 tools is far beyond a manageable surface for an agent, well past the 25+ threshold, even acknowledging the dual persona (own-account SaaS + gestoría multi-client) and the breadth of Spanish tax/Veri*factu/FACe functionality. Many capabilities are legitimate but the sheer volume raises selection cost and discoverability risk.

Completeness4/5

Coverage is remarkably thorough: full invoice lifecycle (create/update/finalize/rectify/cancel/delete), expenses with receipts, customers, quotes, recurring profiles, payments, PDF display/footer/series settings, AEAT/FACe submission, bank imports/trash, validators, and a full gestoría client-management surface. Minor gaps exist (no delete_customer, delete_quote, delete_recurring, or supplier creation), but these are workable.

Available Tools

81 tools
attach_expense_receiptAttach receipt to expenseAInspect

Attach the original receipt (photo or PDF) to an existing expense (gasto), so it is archived with it and goes into the gestoría export, exactly like the upload in the web app. Existing files stay; an expense holds at most 5 files (e.g. invoice plus delivery note, or a two-page ticket as two photos). contix only stores the file, it does not read it: enter the amounts with create_expense / update_expense first. Accepted: JPG, PNG, WEBP, HEIC, PDF, max 10 MB. Returns the expense id, the stored file name and how many files the expense now holds.

NameRequiredDescriptionDefault
filenameNooriginal file name, e.g. ticket-repsol.jpg
mime_typeNooptional; detected from the content if missing
expense_idYesexpense id from create_expense or list_expenses
file_base64Yesthe file content, base64-encoded (no data: prefix needed)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond by disclosing that existing files are preserved, that an expense holds at most 5 files, that contix stores but does not read the file, accepted formats and the 10 MB cap. It also pre-announces the return payload (expense id, stored file name, file count), which no 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.

Conciseness5/5

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

Front-loads the core action, then layers constraints, prerequisites and return values in a tight paragraph with zero filler. The parenthetical examples (two-page ticket as two photos) clarify the file-count rule rather than 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 mutation tool with no output schema, the description covers the prerequisite ordering, format/size limits, file-count ceiling, retention behavior and the return shape. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for file_base64/mime_type by enumerating accepted formats (JPG, PNG, WEBP, HEIC, PDF) and the 10 MB limit, which the schema does not express. It adds nothing further for expense_id or filename 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 and resource ('attach the original receipt ... to an existing expense') and immediately scopes it against siblings by telling the agent to set amounts with create_expense / update_expense first. An agent can distinguish this from create_expense, update_expense and list_expenses 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 sequences usage ('enter the amounts with create_expense / update_expense first') and frames the operation as equivalent to the web app upload. It gives clear context but does not state an explicit when-not-to-use case or name a competing alternative for file storage.

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

calculate_modelo_303Sum the Spanish VAT return (Modelo 303)A
Read-only
Inspect

Add up the boxes (casillas) of the Spanish quarterly VAT return Modelo 303 with the formulas printed on the official AEAT form: 27, 45, 46, 64, 66, 87, 69 and 71. Input are the tax amounts (cuotas) per box, e.g. {"09": 17430, "29": 9870}. It only sums what it is given: it does not decide which rate or deduction applies and it is not a tax return. To compute the 303 from an existing contix account's own invoices and gastos instead of typed-in boxes, use get_modelo with model 303.

NameRequiredDescriptionDefault
casillasYesBox number -> amount. Accepted: 152, 167, 03, 155, 06, 09, 11, 13, 15, 158, 170, 18, 21, 24, 26, 29, 31, 33, 35, 37, 39, 41, 42, 43, 44, 58, 76, 65, 77, 110, 78, 68, 108, 70, 109

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is known; the description reinforces this by framing the tool as a pure summation ('It only sums what it is given') that performs no interpretation. It does not describe the shape of the returned object beyond naming the computed boxes, which is a minor gap for a calculation tool with no output schema.

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

Conciseness5/5

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

Three front-loaded sentences: what it sums, what the input is with an example, what it does not do, then the sibling alternative. No filler, and the scope limitation is placed before the routing hint where it matters most.

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-parameter, read-only calculation tool with no output schema, the description covers purpose, input format, limitations, and the alternative path. The only missing piece is what the response envelope looks like, though the enumerated formula boxes substantially telegraph the output.

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 100%, so baseline is 3, but the description adds real meaning: the values are tax amounts ('cuotas') per box rather than rates, and it supplies a concrete example object ({"09": 17430, "29": 9870}) clarifying the key format. That goes beyond the schema's accepted-box enumeration.

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 states a specific verb and resource — 'Add up the boxes (casillas) of the Spanish quarterly VAT return Modelo 303' — and enumerates the exact formula boxes (27, 45, 46, 64, 66, 87, 69, 71). It also explicitly distinguishes itself from the sibling get_modelo, so an agent can route between the two without opening a schema.

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

Usage Guidelines5/5

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

It gives both sides of the routing decision: use this tool when you have tax amounts per box already, and use get_modelo with model 303 when computing from an account's own invoices and gastos. It also sets explicit exclusions — 'it does not decide which rate or deduction applies and it is not a tax return.'

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

calculate_vatCalculate VAT (IVA) and IRPF withholdingA
Read-only
Inspect

Compute the taxable base, VAT (IVA) amount, optional recargo de equivalencia and optional IRPF withholding from an amount. By default importe is the taxable base (sin IVA). With incluye_iva=true, importe is the TOTAL with VAT already included and the base is derived backwards (quitar IVA / reverse VAT). It only applies the rates it is given: it does NOT decide which VAT or IRPF rate applies to a case. Returns base_imponible, cuota_iva, recargo_importe, retencion_irpf, total_con_iva and total_factura (total after subtracting the IRPF withholding).

NameRequiredDescriptionDefault
irpfNoIRPF withholding rate in %, e.g. 15, 19. Default 0
importeYesAmount: taxable base, or total with VAT if incluye_iva=true
recargoNoRecargo de equivalencia rate in %, e.g. 5.2, 1.4, 0.5, 1.75. Default 0
tipo_ivaYesVAT rate in %, e.g. 21, 10, 4, 0
incluye_ivaNoTrue if `importe` already includes VAT (reverse calculation)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds useful behavioral context: reverse VAT calculation, rate-application boundary, and the returned total_factura after IRPF withholding. It does not discuss rounding or error behavior, so not a 5.

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

Conciseness5/5

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

Front-loaded with the purpose, then proceeds through default behavior, reverse calculation, rate boundary, and return values. Every sentence earns its place with no repetition or filler.

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?

Although there is no output schema, the description lists all returned fields and explains total_factura versus total_con_iva. Combined with the read-only annotations and complete parameter schema, it gives the agent everything needed to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so parameter meanings are already fully documented. The description restates the importe/incluye_iva relationship and adds return-field context, but adds little parameter semantics beyond the schema itself, making the baseline 3 appropriate.

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 (compute) and the exact resources it calculates: taxable base, VAT, recargo de equivalencia, and IRPF withholding. The boundary that it only applies supplied rates and does not decide which rate applies distinguishes it from rate-decision or tax-form tools.

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?

Clearly explains the default mode (importe as taxable base) and the reverse-VAT mode when incluye_iva=true. It also states a key exclusion (it does not decide applicable rates), though it does not explicitly name a sibling alternative such as calculate_modelo_303.

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

cancel_invoiceCancel/annul invoice (irreversible)A
Destructive
Inspect

Annul (anular) a finalized invoice, sends a RegistroAnulacion to the AEAT (if the invoice was never sent to the AEAT, the anulación is recorded only in the local hash chain). IRREVERSIBLE Veri*factu chain event: the invoice then counts as never issued. Ask the user for explicit confirmation, then call with confirm=true. For a later discount or correction use rectify_invoice instead (anulación is 'this was a mistake'). Returns a confirmation that the annulment was recorded.

NameRequiredDescriptionDefault
reasonYesinternal reason (duplicate, wrong recipient, input error…)
confirmYesMust be true. Only after the user explicitly confirmed the irreversible annulment.
invoice_idYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only flag destructiveHint/readOnlyHint; the description goes well beyond by explaining what actually happens downstream (RegistroAnulacion sent to AEAT, or recorded only in the local hash chain if never submitted) and the irreversible semantic effect that the invoice counts as never issued. It also discloses the return value and the mandatory confirmation gate.

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 front-loaded sentences plus a routing clause carry the irreversibility warning, the AEAT/local-chain branch, the confirmation protocol, the sibling alternative, and the return value with no filler.

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 destructive, irreversible tool with no output schema, the description covers consequences, the AEAT branch, the confirmation prerequisite, the alternative tool, and what is returned. Nothing an agent needs before invoking 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 coverage is 67%, with confirm and reason already documented; the description still adds the procedural meaning of confirm (only after explicit user confirmation) and frames reason as the 'this was a mistake' rationale. invoice_id remains undocumented in both places, which is the only real 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?

"Annul (anular) a finalized invoice" gives a precise verb plus resource and adds the governing model (Veri*factu chain, invoice counts as never issued). It is unmistakably distinct from siblings like delete_invoice and rectify_invoice, which the description names explicitly.

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

Usage Guidelines5/5

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

States the selection rule between this and rectify_invoice (anulación = 'this was a mistake'; rectify = later discount or correction), plus the prerequisite workflow of obtaining explicit user confirmation before calling with confirm=true. Both the when and the when-not are spelled out.

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

check_periodCheck a period before handing it overA
Read-only
Inspect

Check a quarter or year for MISSING documents and blockers before handing it to the gestoría: recurring supplier invoices that did not arrive this time (rent, phone, alarm...), expenses without a supplier or invoice number, drafts inside the period, counterparties above the 3.005,06 € Modelo 347 threshold without a NIF. This is a completeness check, NOT tax advice: contix never judges whether something is deductible or which rate applies. Each finding is a question for the user to answer.

NameRequiredDescriptionDefault
yearYese.g. 2026
quarterNo1-4; omit to check the whole year

TDQS

A4.4/5.0
Behavior5/5

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

The readOnlyHint already establishes safety, and the description adds substantial context beyond annotations: it lists the exact categories of findings, gives the Modelo 347 threshold, clarifies that findings are questions for the user, and explicitly excludes tax-advice judgment. This is rich behavioral disclosure for a read-only check.

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?

The purpose and handover context are front-loaded, followed by concrete examples of what is checked and a crisp scope exclusion. The description is dense but every clause helps an agent understand what the check covers and what it does not.

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 read-only check with no output schema, the description is nearly complete: it explains the checks and frames findings as user questions. It could say more about the shape or ordering of results, but the core behavior an agent needs to invoke it correctly is present.

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 100%, and the schema already documents year and quarter, including that omitting quarter checks the whole year. The description reinforces the quarter-or-year scope but adds no parameter syntax or format details beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource: check a quarter or year for missing documents and blockers before gestoría handover. It names concrete checks (recurring invoices, expenses without supplier/invoice number, drafts, Modelo 347 threshold cases) and explicitly distinguishes the tool from tax advice, making it clearly identifiable among the many invoice, expense, and gestoría siblings.

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 clearly states when to use the tool: before handing a period to the gestoría. It also states an important when-not: this is not tax advice and does not judge deductibility or rates. It does not explicitly name alternative sibling tools to use for tax calculations, so it falls short of full sibling routing.

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

check_vat_numberCheck an EU VAT number (VIES)A
Read-only
Inspect

Look up an EU VAT number in the European Commission's VIES registry. Returns what the registry says: whether the number exists and, where the member state publishes it, the name behind it. It draws NO tax conclusion: whether an invoice may be issued without IVA is the user's decision with their gestoría. VIES is often down; that is reported as disponible=false, which is NOT the same as an invalid number.

NameRequiredDescriptionDefault
paisNoISO country code, e.g. DE, omit when the number carries its prefix
numeroYesVAT number, with or without country prefix

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explains return semantics: whether the number exists and, where published, the name behind it. It also discloses a critical failure mode: VIES downtime is reported as disponible=false, which is not the same as an invalid number.

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?

The description is front-loaded with the primary lookup action, then adds only the high-value caveats about tax conclusions and VIES availability. Every sentence earns its place and there is no repetition.

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 read-only lookup with no output schema, the description supplies the missing return semantics and the important distinction between unavailable and invalid. Together with the annotations and fully documented schema, an agent has enough information 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both the country code and number parameters, including that the country can be omitted when the number carries its prefix. The description does not add parameter-level syntax or format guidance beyond what the schema provides.

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 states a specific verb and resource: looking up an EU VAT number in the European Commission's VIES registry. It distinguishes the scope from Spanish tax ID or VAT calculation tools by naming VIES and EU VAT explicitly.

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 clear context and an important limitation: the result does not determine whether an invoice may be issued without IVA, which is the user's decision with their gestoría. It does not explicitly name sibling alternatives such as validate_spanish_tax_id or calculate_vat, so it falls short of full alternative routing.

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

clone_invoiceClone invoice to draftAInspect

Clone any invoice (factura) into a new DRAFT (borrador) with today's dates. Good for 'invoice like last time'. Not finalized, no number yet. Returns the new draft's id.

NameRequiredDescriptionDefault
invoice_idYes

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare this is a non-read-only, non-destructive write; the description adds real context on top: the output is unfinalized, has no invoice number yet, is dated today, and the call returns the new draft's id. It stops short of stating source-invoice preconditions (e.g. whether finalized or paid invoices can be cloned).

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?

Four short, front-loaded fragments with no filler: the operation and result come first, then the usage cue, then the draft caveats, then the return value. Every sentence contributes new information.

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 one-parameter tool with no output schema, the description covers the essential outcome, the draft state, and the return value. Missing only edge-case behavior around which source invoices are eligible and how failures surface.

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?

There is one parameter (invoice_id) with 0% schema description coverage, so the description carries the burden. 'Clone any invoice' implies invoice_id identifies the source, but it adds nothing on validity constraints, such as whether the id must reference an existing, non-cancelled invoice.

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 (clone) and resource (invoice) plus the concrete outcome: a new DRAFT with today's dates. It implicitly separates cloning from create_invoice by saying it starts from an existing invoice, though it never names that sibling explicitly.

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

Usage Guidelines4/5

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

'Good for "invoice like last time"' gives a clear, concrete usage context that an agent can match against a user request. It offers no exclusions or named alternatives (e.g. create_invoice for a from-scratch invoice), which keeps it below the top score.

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

convert_quote_to_invoiceConvert quote to invoiceAInspect

Convert an ACCEPTED quote (presupuesto aceptado) into a new DRAFT invoice with the same customer, items and rates. The quote must already be in accepted status. Review the resulting draft, then finalize_invoice when ready. Returns the new draft invoice's id and total.

NameRequiredDescriptionDefault
quote_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish non-read-only and non-destructive. The description adds key behavior: output is a new draft (not finalized), source status precondition, and that id and total are returned. It does not cover duplicate conversion or whether the quote's status changes.

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 compact sentences ordered as action, precondition, follow-up, and return value. Every sentence adds operational information.

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 one-parameter conversion tool with no output schema, the description covers preconditions, resulting state, next step, and key return fields. Minor gaps around duplicate prevention and source-quote mutation 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?

With schema coverage at 0%, the description partially compensates by requiring the referenced quote to be in accepted status. However, it never names quote_id or clarifies the integer identifier format/behavior, leaving a 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 (convert), source (accepted quote), and target (new draft invoice) with retained customer/items/rates. It also names the follow-up sibling finalize_invoice, making the boundary clear.

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 requires the quote to be in accepted status and tells the agent to review the resulting draft before calling finalize_invoice. It does not state what to do for a non-accepted quote or when to use create_invoice instead, 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.

create_customerCreate customerBInspect

Create a new customer in the user's contix account. Only contact_name is required: NIF, email and address are optional (e.g. private individuals without NIF are fine). Returns the new customer's id, name, NIF and email.

NameRequiredDescriptionDefault
nifNo
cityNo
emailNo
notesNointernal notes about the customer
phoneNo
countryNoISO-2, e.g. ES, DE, FRES
email_ccNoAdditional recipients. Invoices, reminders, payment confirmations and quotes for this customer go to `email` AND to every address listed here, all visible in the To header. Max 5.
provinceNo
no_email_ccNoTrue for a collective customer whose contact addresses belong to DIFFERENT end customers (e.g. one account used for all PayPal payers). Keeps the additional-recipient list empty and stops the Zoho sync from refilling it, so no stranger's address ever shows up in the To header.
postal_codeNo
company_nameNo
contact_nameYes
address_line1No
address_line2No
recipient_typeNokind of recipient, as the user states it; drives the Veri*factu recipient block and Modelo 347/349 assignment
is_public_adminNoTrue if the customer is a Spanish public administration (school, ayuntamiento, university). Enables Facturae/B2G invoicing. Requires the three DIR3 codes below.
dir3_organo_gestorNoDIR3 code of the Órgano Gestor. Provided by the administration.
default_product_groupNoProduct group new invoices of this customer get when create_invoice is called without one. Must be a name from get_product_groups; empty string clears it.
dir3_oficina_contableNoDIR3 code of the Oficina Contable, e.g. L01410950. Provided by the administration.
dir3_unidad_tramitadoraNoDIR3 code of the Unidad Tramitadora. Provided by the administration.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare this is a non-destructive write, so the safety profile is covered. The description adds the return payload (id, name, NIF, email), which matters because there is no output schema, but it omits duplicate-handling behavior and any account/permission constraints for a 20-parameter 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?

Three compact sentences, front-loaded with the action and the required-field constraint, with no filler. The return-value sentence earns its place given the absent output schema.

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 20-parameter tool in a regulated Spanish invoicing domain, the description covers the basic call shape and return values but not the conditional clusters (DIR3 trio requires is_public_admin, email_cc vs no_email_cc interaction) that an agent could get wrong. Adequate, not 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 coverage is only 50% across 20 parameters, so the description should compensate more than it does. It usefully explains that nif/email/address are optional and why, but says nothing about recipient_type, dir3_*, no_email_cc, or default_product_group, which are the highest-consequence fields left to the 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 and resource ('Create a new customer') and scopes it to the user's contix account, which cleanly separates it from update_customer and get_customer. It does not explicitly name a sibling or state what it does not do, so it falls short of the top band.

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 clarifies the minimal viable call ('Only contact_name is required') and gives one concrete business rule (private individuals without NIF are fine), which is real usage guidance. However, it never says when to prefer this over update_customer, when to look up an existing customer first, or what happens on duplicates.

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

create_expenseCreate expenseAInspect

Register an expense (gasto) from data. Requires description, subtotal and total. Always pass the supplier (proveedor) as supplier_name/supplier_nif or supplier_id, an expense without a supplier cannot appear in Modelo 347/349. OCR ticket scanning stays in the web app. Returns the new expense's id, description and total. To attach the receipt image or PDF afterwards, use attach_expense_receipt.

NameRequiredDescriptionDefault
notesNo
totalYes
categoryNoexpense category slug (see web app)
subtotalYes
tax_rateNo
tax_linesNoOnly for a receipt carrying MORE THAN ONE VAT rate (e.g. a Correos ticket: 21% on postage, exempt on the stamp). One entry per rate. When given, subtotal/tax_amount/tax_rate/total are derived from it, do not compute them yourself. Leave it out for the normal single-rate receipt.
tax_amountNo
descriptionYes
supplier_idNoexisting supplier id from list_suppliers
invoice_dateNoYYYY-MM-DD, defaults to today
supplier_nifNosupplier NIF/CIF/VAT as printed on the document
is_deductibleNofalse keeps the expense out of the deductible totals entirely
supplier_nameNosupplier (proveedor) name, matched against existing suppliers by NIF or name, created if new
invoice_numberNo
supplier_countryNosupplier country, ISO-2 (ES, FR, DE...). Drives Modelo 349 intra-EU acquisitions
deductible_percentNoporcentaje imputable: share of this expense (0-100) the user allocates to the business, e.g. a shared car or a home office. Enter the FULL receipt amounts in subtotal/tax_amount/total and the percentage here, not pre-reduced amounts; the IVA and income-tax modelos count only that share. Default 100. Use only a percentage the user states, contix never proposes one.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, it discloses the critical behavioral rule that a supplier must be supplied or the expense cannot appear in Modelo 347/349. It also explains that OCR is out of scope, defines the return fields, and points to the follow-up tool for receipt attachment.

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?

The description is front-loaded with the core action and required fields, then adds supplier compliance, OCR scope, return values, and the follow-up tool. Every sentence contributes useful information without 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?

Given 16 parameters, minimal annotations, and no output schema, it covers the critical requirements, supplier compliance, return values, and receipt-attachment workflow well. Some optional parameter semantics remain reliant on the schema, but the description is largely complete 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?

The description adds important meaning for the supplier fields by making them effectively mandatory and explaining why. However, with only 56% schema description coverage, it leaves several parameters such as notes, category, tax_rate, tax_amount, and invoice_number without added semantic guidance.

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 states a specific verb and resource: register an expense (gasto) from data. It clearly distinguishes creation from OCR ticket scanning and from attaching a receipt afterward, so an agent can identify the correct operation.

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 explicitly says OCR ticket scanning stays in the web app and directs receipt attachment to attach_expense_receipt. It does not explicitly mention update_expense or list_expenses, but the create-vs-attach boundary is clear.

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

create_invoiceCreate draft invoiceAInspect

Create a new draft invoice. Review it with the user, then emit it with finalize_invoice (or from the dashboard). Tax rates supported: 21, 10, 4, 0, per invoice, or per line when one invoice mixes rates. IRPF retention: 0, 7, 15, 19. If you may retry this call, pass external_id: the same id twice is refused instead of billing the customer a second time. Returns the new draft's id and total; a repeated external_id instead returns the id and number of the invoice already created for it.

NameRequiredDescriptionDefault
itemsYes
notesNo
tax_rateNoVAT % for the whole invoice; a line may override it with its own tax_rate
referenciaNoShort human reference shown on the PDF and searchable in the invoice list: the customer's purchase order number, a project or a domain name. NOT an idempotency key.
customer_idYes
external_idNoYour own id for this invoice, unique per account. Send it again for the same job and the call is rejected with a 409 naming the invoice that already exists, so a retry cannot create a duplicate. Never reuse one id for two different invoices.
numero_pedidoNoPurchase order / commitment number the PUBLIC customer requires (nº de pedido, código de compromiso, disposición). Printed on the PDF and written as ReceiverTransactionReference in every Facturae line; without it administrations like universities cannot route the e-invoice.
product_groupNoOptional product group (grupo de producto), one of the names returned by get_product_groups. Unknown names are rejected. Leave it out to use the customer's saved default, if any.
retention_rateNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the real behavioral burden: it states that the result is a draft, that finalization is a separate call, that duplicate external_id values are refused with a 409 rather than double-billing, and what the return values are. That is substantial context beyond the annotations.

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

Conciseness5/5

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

The description is front-loaded with the purpose, then moves efficiently through workflow, tax rules, idempotency, and return values. Every sentence earns its place; there is no repetition or 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?

There is no output schema, but the description explains the return payload (new draft id and total, or the existing invoice id and number on a repeated external_id). It covers the critical workflow, tax, and idempotency behavior for a mutation tool. Minor gaps remain around permissions or draft editability, but they are not essential for correct invocation.

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 56%, and the description adds important semantics the schema does not fully supply: the supported VAT values (21, 10, 4, 0) and IRPF retention values (0, 7, 15, 19), plus line-level tax-rate override behavior. It does not explain customer_id, items, notes, referencia, numero_pedido, or product_group, though those are covered in the schema descriptions.

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 and resource: 'Create a new draft invoice'. It immediately distinguishes the draft-creation step from the follow-up emission step by naming finalize_invoice, so an agent can tell exactly where this tool sits in the workflow.

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 explicitly says to review the draft with the user and then emit it with finalize_invoice (or from the dashboard), naming the alternative and the condition that selects it. It also gives explicit retry guidance via external_id, covering the when-to-use case for that parameter.

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

create_quoteCreate quoteAInspect

Create a new quote (presupuesto) for a customer. Non-fiscal document, no Veri*factu chain involved. Once the customer accepts it (mark it accepted from the dashboard), use convert_quote_to_invoice to turn it into a real DRAFT invoice. Returns the new quote's id, number and total.

NameRequiredDescriptionDefault
itemsYes
notesNo
tax_rateNo
customer_idYes
valid_untilNoYYYY-MM-DD, optional expiry
retention_rateNo

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real value beyond that by clarifying the document is non-fiscal and outside the Veri*factu chain, that acceptance happens in the dashboard rather than via this tool, and that the call returns id, number and total. It stays silent on quote numbering/series, which matters given the get_quote_series and set_quote_series siblings.

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 short sentences, front-loaded with the purpose and then the lifecycle and return value. No filler, and each sentence carries distinct information (what it is, what it isn't, what comes next, what comes back).

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 mutation tool with no output schema, it does state the returned fields and the downstream path, which covers the most important unknowns. But with six parameters and near-zero schema documentation, the definition is not complete enough for an agent to populate items, tax_rate or retention_rate confidently.

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 only 17% (only valid_until is documented), so the description carries the burden of explaining five other parameters, yet it adds no parameter information at all. Nothing explains items structure, tax_rate/retention_rate defaults, notes, or customer_id expectations, leaving the agent to infer semantics from bare property 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?

States a specific verb and resource ('Create a new quote (presupuesto) for a customer') and immediately qualifies the document type as non-fiscal with no Veri*factu chain, which separates it from create_invoice and the rest of the invoicing siblings. An agent can tell what it produces and what it does not produce 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 Guidelines4/5

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

Gives a clear lifecycle context: create the quote here, mark it accepted in the dashboard, then call convert_quote_to_invoice to produce a DRAFT invoice, naming the sibling explicitly. What it does not state is the inverse routing rule (use create_invoice when the document must be fiscal), which is only implied by the 'non-fiscal' qualifier.

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

create_recurringCreate recurring profileAInspect

Create a recurring invoice profile (factura recurrente / suscripción): a saved template that generates invoices on a schedule for a customer. It is created as a DRAFT (borrador, is_active=false): nothing is issued or sent. To start the series, ask the user to confirm the first date and the frequency, then call update_recurring with is_active=true; from then on every invoice is finalized (Veri*factu) and emailed to the customer automatically. Returns the new profile's id, name, frequency and next invoice date.

NameRequiredDescriptionDefault
nameYes
itemsYes
notesNo
end_dateNoYYYY-MM-DD, optional
tax_rateNo
auto_sendNoEmail the customer automatically when generated (only once the series is active)
frequencyYes
is_activeNoLeave false (draft) unless the user has already confirmed the start; see update_recurring
start_dateYesYYYY-MM-DD, first/next invoice date
customer_idYes
descriptionNoReferencia printed on every generated invoice and in the customer email (order, contract, domain). Max 200.
payment_daysNo
auto_finalizeNoAuto-finalize (Veri*factu) on generation, vs. leaving a DRAFT to review
product_groupNoProduct group copied to every generated invoice; must be one of get_product_groups.
retention_rateNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare a non-read-only, non-destructive creation. The description goes well beyond that: it discloses that nothing is issued or sent at creation time, that activation triggers automatic Veri*factu finalization and emailing to the customer, and what the return payload contains. This is exactly the lifecycle context the annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the core action and draft state, then the activation path, then the return value. Three sentences with no filler, though the bilingual parentheticals (factura recurrente / suscripción, borrador) add slight density without much decision value.

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 15-parameter creation tool with no output schema, the description supplies the lifecycle and activation context an agent most needs, plus the return shape (id, name, frequency, next invoice date). It stops short of explaining default behaviors for tax_rate, payment_days, and items, which an agent might otherwise assume.

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 only 47% across 15 parameters, but the schema itself describes the highest-risk ones (is_active, auto_send, auto_finalize, start_date, end_date, description, product_group). The description reinforces the draft/activation semantics of is_active and the automatic emailing implied by auto_send, but it adds little on the remaining bare parameters such as items, tax_rate, payment_days, and retention_rate.

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 recurring invoice profile) and immediately disambiguates it from siblings by describing it as a saved template that generates invoices on a schedule, distinct from generate_recurring and update_recurring which are named. An agent can select this tool 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 Guidelines5/5

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

Explicitly says the profile is created as a draft and that to start the series the agent should confirm date/frequency with the user and then call update_recurring with is_active=true. The when-to-use and the alternative (update_recurring) are both named along with the precondition for switching.

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

delete_bank_transactionsDelete bank movementsA
Destructive
Inspect

Move imported bank movements to the trash (recoverable for 30 days with restore_bank_trash). Select by ids, by a date range of the movements (desde/hasta) or by import day (importado_el), combinable. Movements linked to an invoice, expense or payment are never deleted and are reported as protegidos. Call first WITHOUT confirm to get the count, tell the user, and only call again with confirm=true after the user agreed. Without confirm, returns how many movements would be deleted and how many are protected; with confirm=true, returns how many were actually moved to the trash and the lote id to restore them.

NameRequiredDescriptionDefault
idsNo
desdeNoYYYY-MM-DD, first movement date to include
hastaNoYYYY-MM-DD, last movement date to include
confirmNo
importado_elNoYYYY-MM-DD, the import day from list_bank_imports

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the destructiveHint=true annotation: it discloses that deletion is a recoverable soft delete with a 30-day window, that linked movements are never deleted and come back labeled 'protegidos', and exactly what each mode returns (preview counts vs. actual moved count plus lote id).

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?

Three dense sentences, front-loaded with the outcome and recoverability before the selection modes, then the confirmation workflow. Every clause carries operational information; only the final return-value sentence comfortably overlaps the earlier confirm explanation, costing a little tightness.

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 destructive 5-parameter tool with no output schema, the description supplies everything an agent needs: selection combinatorics, the mandatory user-confirmation loop, the protection rule, and the shape of both return variants including the lote id for restoration.

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 60% (desde/hasta/importado_el already documented), and the description adds real value on the two undocumented params: how ids works as a selection mode and the full dry-run/commit contract for confirm. The 5000-item cap on ids is left to the schema, which is acceptable.

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 precise verb+resource+outcome: 'Move imported bank movements to the trash'. It distinguishes itself from sibling deletion tools (delete_invoice, delete_expense) and from restore_bank_trash by naming the soft-delete/restore pairing.

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 enumerates the three combinable selection modes (ids, desde/hasta, importado_el), then prescribes the two-step workflow: call WITHOUT confirm first, report the count to the user, and only re-call with confirm=true after agreement. It also names the recovery path (restore_bank_trash) and the exclusion rule for invoice/expense/payment-linked movements.

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

delete_expenseDelete expenseA
Destructive
Inspect

Delete an expense (gasto) by id. Gastos are plain expense records, not part of the Verifactu invoice chain, so deletion is safe. Use list_expenses to find the id. Returns the deleted expense's id.

NameRequiredDescriptionDefault
expense_idYesexpense id from list_expenses

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description needn't restate that it's destructive. It adds genuine value beyond annotations: it reassures that deletion is safe because gastos are outside the invoice chain, and it discloses the return value (deleted expense's id). Missing only an explicit reversibility/no-undo note.

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 short sentences, front-loaded with the action, then the key safety distinction, then the id-lookup hint. No padding; each sentence carries distinct 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?

For a single-parameter destructive tool with full schema coverage and annotations covering the safety profile, the description supplies everything needed: how to find the id, why deletion is safe, and what is returned. Nothing an agent needs to call it correctly is absent.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's description already says 'expense id from list_expenses', so the description's 'by id' plus the list_expenses pointer largely echoes the schema. Adequate but no added syntactic or format detail beyond what's structured.

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 ('Delete an expense by id') and then distinguishes it from the invoice-related siblings by clarifying that gastos are plain expense records not in the Verifactu invoice chain. An agent can separate this from delete_invoice/delete_bank_transactions without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to list_expenses to obtain the id, and clarifies the domain context (gastos are not invoices) that governs when this deletion is appropriate. It stops short of spelling out exclusions such as irreversibility warnings, so it's clear but not fully exhaustive.

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

delete_invoiceDelete draft invoiceA
Destructive
Inspect

Delete a DRAFT invoice (factura en borrador) by id. Only drafts can be deleted: a finalized invoice is part of the Veri*factu chain and must be corrected with rectify_invoice instead. Use list_invoices to find the id. Returns the deleted draft's id.

NameRequiredDescriptionDefault
invoice_idYesinvoice id from list_invoices

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so the description's added value is the eligibility rule and the regulatory reason (the facturado chain) plus a return value. It doesn't cover error behavior (e.g. what happens if the id is a finalized invoice or does not exist), which is the remaining gap for a destructive operation.

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 sentences, front-loaded with the action and scope, then the constraint and alternative, then the return value. Every sentence carries distinct information with no repetition.

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 one-parameter destructive tool, the description covers eligibility, the safe alternative, id provenance, and the return value; with no output schema, stating the return is a plus. Only failure modes for an invalid or finalized id 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 coverage is 100% and the single parameter already documents 'invoice id from list_invoices'. The description's 'by id' and 'use list_invoices to find the id' restate the schema rather than adding format, type, or validation detail, so baseline 3 applies.

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 plus a hard scope qualifier: 'Delete a DRAFT invoice by id.' The DRAFT restriction immediately separates it from cancel_invoice and rectify_invoice in the sibling set.

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 (drafts only) and when-not-to-use (finalized invoices in the Veri*factu chain), naming the correct alternative rectify_invoice. It also routes the agent to list_invoices for id discovery, 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.

finalize_invoiceFinalize invoice (irreversible)A
Destructive
Inspect

Finalize a DRAFT invoice: assigns the sequential invoice number, computes the hash and adds it to the Verifactu chain (and, if the account has AEAT mode enabled, submits the record to the tax authority). THIS IS IRREVERSIBLE, se envía a la cadena Verifactu: a finalized invoice can never be edited or deleted; mistakes require a rectificative invoice. Ask the user for explicit confirmation first, then call with confirm=true. Returns the assigned invoice number and the Veri*factu hash, plus the AEAT submission status if the account has AEAT mode enabled. Still something to fix in the draft first, use update_invoice before finalizing.

NameRequiredDescriptionDefault
confirmYesMust be true. Only set after the user explicitly confirmed the irreversible finalization.
invoice_idYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, and the description goes well beyond that by explaining the consequence in human terms: the invoice can never be edited or deleted, and corrections require a rectificative document. It also discloses the conditional AEAT submission (account-mode dependent) and what the tool returns, which annotations cannot express.

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 critical warning is front-loaded and every clause carries information, but the sentence is overstuffed and contains a stray untranslated fragment ('se envía a la cadena Veri*factu') spliced mid-thought, and it partially repeats the title's 'irreversible' warning.

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 two-parameter, high-stakes mutation with no output schema, the description covers everything an agent needs: preconditions, irreversibility, confirmation protocol, return values (invoice number, Veri*factu hash, AEAT status), and the remediation path.

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 only 50%, with invoice_id carrying no schema description, but the description compensates by framing the target as a DRAFT invoice, making the id's meaning inferable. For confirm it reinforces the schema constraint ('only after explicit user confirmation'), though it does not restate that confirm must be true beyond 'call with confirm=true'.

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 (finalize a DRAFT invoice) and then spells out the concrete effects: assigns the sequential number, computes the hash, appends to the Veri*factu chain, and optionally submits to AEAT. It also names its siblings explicitly ('use update_invoice before finalizing', mistakes require a rectificative invoice), so an agent can place it precisely among update_invoice, rectify_invoice and cancel_invoice.

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 both a when-to-use and a when-NOT-to-use: if the draft still needs changes, call update_invoice first; if a mistake was already made, use a rectificative invoice. It additionally prescribes the interaction protocol ('ask the user for explicit confirmation first, then call with confirm=true'), removing ambiguity about sequencing.

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

generate_recurringGenerate invoice from recurring profileAInspect

Generate an invoice now from an existing recurring profile (factura recurrente). Create profiles with create_recurring. Returns the new invoice's id, status and total, plus the profile's next scheduled date.

NameRequiredDescriptionDefault
profile_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare a non-read-only, non-destructive write, and the description adds value beyond them by disclosing the return payload (id, status, total) and the side effect on the profile's next scheduled date. It does not clarify whether this advances/skips the schedule or creates a duplicate invoice, which is the main behavioral ambiguity left.

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 short sentences, front-loaded with the action, then the related sibling, then the return value. No filler or restatement of the title.

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, the description usefully documents the return shape and the scheduled-date side effect, and annotations cover the safety profile. The one gap is guidance on sourcing the profile_id, which matters for a single-required-param tool with 0% schema coverage.

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% and the single profile_id parameter has no description, so the description carries the burden; it implies the parameter identifies an existing recurring profile but never states the expected type, nor how to obtain a valid ID (e.g. via list_recurring). 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 precise verb+resource ('Generate an invoice now from an existing recurring profile') and explicitly distinguishes it from the sibling that creates profiles ('Create profiles with create_recurring'). An agent can tell this apart from create_recurring, update_recurring and list_recurring 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?

Explains the precondition (an existing recurring profile) and points to create_recurring as the alternative for profile creation, plus 'now' signals immediate generation rather than scheduled. It never says what to do if no profile exists or how this differs from calling create_invoice directly, so no explicit when-not guidance.

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

gestoria_abrir_mandanteOpen a gestoría clientAInspect

Record (for RGPD accountability) that this gestoría is opening one of its accepted clients, and return its tenant_id. Call this before reading a client's data with the X-Contix-Tenant header on subsequent calls.

NameRequiredDescriptionDefault
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is not read-only and not destructive; the description adds useful context that this is an RGPD accountability record and that it returns tenant_id. It does not cover edge cases such as idempotency or failure behavior, but it adds meaningful behavioral context beyond the annotations.

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

Conciseness5/5

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

Two concise sentences with no wasted text. The core action is front-loaded, followed by the sequencing instruction for subsequent calls.

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 one-parameter tool with full schema coverage and no output schema, the description supplies the key missing context: the RGPD purpose, returned tenant_id, and header usage on later calls. Nothing essential for correct invocation appears absent.

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 100%, and the schema already explains that link_id comes from gestoria_listar_mandantes and is not the tenant_id. The description reinforces the return of tenant_id but does not add further parameter syntax or constraints 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?

The description states a specific action and resource: recording that a gestoría opens an accepted client and returning its tenant_id. It distinguishes the operation from listing clients by pointing to gestoria_listar_mandantes as the source of link_id and clarifying that link_id is not tenant_id.

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 explicitly says when to call it: before reading a client's data, with X-Contix-Tenant used on subsequent calls. The prerequisite source for the required ID, gestoria_listar_mandantes, is also named in the schema.

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

gestoria_certificado_mandanteCompliance certificate for a gestoría clientA
Read-only
Inspect

Certificado de cumplimiento (RD 1007/2023) for one accepted client: producer and Declaración Responsable, the client's NumeroInstalacion, how many invoice records carry a chained SHA-256 hash and since when, the last hash, whether the whole chain re-verifies right now, and the AEAT (Veri*factu) submission status. Returns the facts as text plus the URL of the PDF (download it with the same credentials). Technical facts only, no tax assessment.

NameRequiredDescriptionDefault
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and destructiveHint=false, so the description focuses on what annotations cannot say: the response is text plus a PDF URL, the PDF must be fetched with the same credentials (an auth note), and output is deliberately limited to technical facts with no tax assessment. That last scope caveat is genuinely useful. It does not mention failure modes for an unaccepted client or a broken chain.

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 certificate name and regulatory reference lead, followed by the enumerated payload and the return shape in a single dense sentence plus one clarifying clause. Every element earns its place; it is only slightly run-on and could be broken into two sentences for scanability.

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, and the description compensates by describing the return: facts as text plus a PDF URL with a credential hint. For a single-parameter read tool with safety annotations already in place, this covers nearly everything an agent needs; only the behavior for a missing/unaccepted link_id is 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?

With 100% schema coverage, the schema already documents link_id as the id from gestoria_listar_mandantes rather than tenant_id. The description reinforces the 'one accepted client' scoping but adds no format, range, or lookup detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific artifact (Certificado de cumplimiento, RD 1007/2023) scoped to one accepted client, and enumerates exactly what it reports: producer/Declaración Responsable, NumeroInstalacion, hash chain counts, last hash, re-verification result, and AEAT submission status. That enumeration makes it distinguishable from generic siblings like gestoria_resumen_mandante, though no sibling is named explicitly.

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: the reader infers this is the certificate-generation call within the gestoría flow. There is no statement of when to prefer it over gestoria_resumen_mandante or gestoria_revision_mandante, nor any prerequisite such as requiring an accepted mandate.

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

gestoria_cierre_configQuarter-close reminders: current settingsA
Read-only
Inspect

For a gestoría account: whether contix sends quarter-close reminders to its clients IN THE GESTORÍA'S NAME (off by default), how many days before the quarter ends (default 15/7/3), and the subject/body template with its placeholders. Reminders only go out when something is missing in the client's account (expenses without receipt, draft invoices, suppliers without NIF, a recurring receipt that did not arrive). Read-only.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, and the description adds substantive behavior beyond that: reminders are off by default, lead-day defaults, and the specific missing-account conditions that trigger reminders. It does not cover auth requirements or response shape, but those are less critical here.

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?

Three sentences, front-loaded with the account scope and the settings returned. The content is dense but mostly earns its place; 'Read-only' overlaps the annotation slightly, keeping it just short of ideal.

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 zero-parameter, read-only getter with no output schema, the description is complete enough: it enumerates the settings, defaults, and the conditions under which reminders fire. An agent can call it without needing more structured output detail.

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?

There are zero input parameters and the schema is empty, so parameter semantics are not a burden; the baseline is 4. The description's mention of defaults and template placeholders describes returned settings, not 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?

The description names the exact resource: quarter-close reminder settings for a gestoría account, including who sends, lead days, and template. It is clearly a read of current settings, but it never explicitly contrasts with gestoria_cierre_configurar, so sibling differentiation is only implied by the title and 'Read-only'.

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 context ('For a gestoría account') and marks the tool read-only, implying it is for inspecting current settings. It does not state when to use this instead of gestoria_cierre_configurar or gestoria_cierre_vista_previa, nor any prerequisites.

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

gestoria_cierre_configurarQuarter-close reminders: change settingsA
Destructive
Inspect

For a gestoría account: switch the quarter-close reminders on/off, set the days before quarter end, or change subject/body (placeholders: {cliente}, {nombre}, {gestoria}, {trimestre}, {fecha_cierre}, {dias}, {faltantes}, {enlace}). Only the fields you pass change. Saving the text is the gestoría's approval of the wording. Returns the saved settings: on/off, the days and the subject/body.

NameRequiredDescriptionDefault
diasNoDays before quarter end, e.g. [15, 7, 3]
activoNo
asuntoNo
cuerpoNo

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the destructiveHint=true annotation, the description discloses three things annotations cannot: updates are partial (unchanged fields are preserved), saving the body constitutes the gestoría's approval of wording, and the call returns the saved settings. It does not explain why the tool is flagged destructive, which is the one open question an agent might have.

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 dense sentence with an inline placeholder list, front-loaded with the account scope and the three actions. The placeholder parenthetical is long but earns its place; nothing is redundant boilerplate.

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 4-param, non-required, partial-update mutation with no output schema, the description covers scope, per-field behavior, template syntax, approval semantics and the return payload. The main omission is any note on whether prior settings are recoverable after a change.

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 only 25% (only 'dias' is documented), so the description carries real weight. It enumerates the eight supported template placeholders for asunto/cuerpo and clarifies the semantics of passing a subset of fields, adding meaning well beyond the bare 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?

Names a specific verb set (switch on/off, set days, change subject/body) on a specific resource (quarter-close reminders for a gestoría account). It is reasonably distinct from gestoria_cierre_vista_previa and gestoria_cierre_config, though it never names those siblings to draw the line explicitly.

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?

"Only the fields you pass change" and "For a gestoría account" establish scope and partial-update semantics, which is real usage guidance. However, it never states when to use this instead of reading via gestoria_cierre_config or previewing via gestoria_cierre_vista_previa, so the routing decision is left implied.

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

gestoria_cierre_vista_previaQuarter-close reminder: preview for one clientA
Read-only
Inspect

For a gestoría account: the exact reminder that would go to one accepted client today (subject, text, what is missing, whether it would be sent at all). Sends nothing.

NameRequiredDescriptionDefault
link_idYesThe id from gestoria_listar_mandantes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful confirmation: 'Sends nothing.' It also discloses what the preview contains (subject, text, what is missing, whether it would be sent at all), which is substantive behavioral context beyond the annotations.

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

Conciseness5/5

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

Two compact sentences, front-loaded with the purpose and output content, then closing with the key non-sending guarantee. No wasted wording.

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, but the description explains the returned preview contents: subject, text, missing data, and send status. Combined with annotations covering safety, an agent has enough information to call it correctly for a one-client preview.

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 100%, so the link_id mapping to gestoria_listar_mandantes is already documented. The description adds the important qualifier that the target is 'one accepted client', giving extra meaning about which client is valid beyond the schema 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?

The description states a specific preview operation for one client: the exact reminder that would be sent today, including subject, text, missing items, and send eligibility. The phrase 'Sends nothing' clearly distinguishes it from send_reminder and other mutation tools.

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 establishes the context ('For a gestoría account', 'one accepted client today') and signals this is a dry-run preview. It does not explicitly name send_reminder as the alternative or state when not to use this tool, so it stops short of full routing guidance.

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

gestoria_comisionesGestoría earnings from contixA
Read-only
Inspect

For a gestoría account: what it earns from contix (30 % of each linked client's net monthly fee, for as long as the client pays): this month, this year, pending and already paid out, per client. Read-only.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description agrees with a terse 'Read-only.' Beyond that, it discloses the substance an agent actually needs: the 30% commission rule, that it accrues for as long as the client pays, and the four reporting lenses (month, year, pending, paid out) plus per-client granularity. It does not state whether it requires an authenticated gestoría role or what the currency/format of the figures is, so it falls short of full transparency.

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?

One sentence, front-loaded with the audience ('For a gestoría account') and the subject ('what it earns from contix'), with the commission model in a parenthetical. It is dense but every clause carries meaning; the trailing 'Read-only.' is small redundancy against annotations but harmless.

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 parameters, no output schema, and safety covered by annotations, the description carries the return-value burden well by enumerating the periods and per-client breakdown. It is nearly complete for a zero-argument read report; only the units/format of the amounts and any gestoría-role prerequisite are unstated.

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 schema imposes no semantic burden and the baseline is 4. The description correctly implies no input is needed, keeping the call shape unambiguous.

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 names a specific resource (a gestoría's earnings from contix) and specifies the exact commission model (30% of each linked client's net monthly fee) plus the breakdown windows. An agent can immediately tell this is a commission/earnings report. It stops short of naming or contrasting any sibling such as gestoria_resumen_mandante, which is the closest alternative.

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 qualifier 'For a gestoría account', which signals the prerequisite context but not when to pick this over related gestoría reporting tools. There is no explicit when/when-not, no mention of prerequisites like an active mandante mandate, and no alternative named.

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

gestoria_exportExport all gestoría clientsA
Read-only
Inspect

Return the URL to download one ZIP with every accepted client's export (invoices, expenses, libros, modelos), each in its own folder, for a year or year+quarter. Download it with the same credentials used here.

NameRequiredDescriptionDefault
yearYes
quarterNo1-4, omit for the full year

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the read-only profile, and the description adds genuine context beyond that: the result is a URL rather than the file itself, the archive is one ZIP with per-client folders, and the download requires the same credentials. It does not mention expiry, size limits, or latency, which would matter for a bulk export.

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 sentences, no filler, with the core return value front-loaded and the credential note placed last where it belongs. Every clause carries information an agent would otherwise have to guess.

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

Completeness4/5

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

With no output schema, the description correctly explains what comes back (a URL to a single ZIP with a folder per client). The 'accepted client' qualifier is unexplained, but for a 2-parameter read-only tool the remaining gaps are minor.

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 50%: quarter is documented in the schema, year is not. The phrase 'for a year or year+quarter' clarifies the relationship between the two parameters (quarter narrows the range, omission means full year), which is modest added value over the schema. Baseline 3 is appropriate given partial coverage.

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 (return the download URL) and resource (a single ZIP containing every accepted client's export), and enumerates contents (invoices, expenses, libros, modelos). This clearly separates it from per-client siblings like gestoria_facturas_mandante or get_libros_registro, though it never names them explicitly.

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 the year / year+quarter framing and the note to download with the same credentials, which is useful auth context. It does not say when to prefer this bulk export over the per-mandante or per-documento tools, nor any prerequisites (e.g. what 'accepted' requires).

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

gestoria_facturas_mandanteGestoría client: list invoicesA
Read-only
Inspect

For a gestoría account: the invoices of ONE accepted client in a year or quarter, newest first: number, date, customer, base, IVA, total, status and whether the invoice carries a Veri*factu record. Read-only.

NameRequiredDescriptionDefault
yearNo
limitNoMax rows, default 50, max 200
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id
quarterNo1-4; omit for the whole year

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Read-only' repeats structured data. However, the description adds real value beyond annotations: the 'newest first' ordering and the exact return-field list (number, date, customer, base, IVA, total, status, Veri*factu flag), which is important since no output schema exists.

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 with the audience/scope front-loaded before the colon-delimited field list. The enumeration is slightly long, but it is warranted because no output schema exists to describe return values.

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 read-only list tool with no output schema, the description covers scope, ordering and returned fields adequately. Remaining gaps are minor: the meaning of 'accepted' client status and the default/max limit behavior (the latter is in the 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 75% and already documents link_id, quarter and limit. The description adds meaning the schema does not: 'accepted' status qualifies which link_id is valid, and 'one client in a year or quarter' clarifies the mutually exclusive period filtering. The undocumented 'year' parameter is only implicitly covered by the phrase 'in a year'.

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 (invoices) with tight scope: 'ONE accepted client in a year or quarter', plus the exact fields returned. An agent can distinguish it from the general list_invoices by the 'gestoría account' framing and the single-client constraint, though no sibling is named explicitly.

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 'For a gestoría account' opener implies the applicable context, and 'ONE accepted client' implies usage after gestoria_listar_mandantes. But there is no explicit when-to-use/when-not guidance versus list_invoices or gestoria_gastos_mandante, leaving the choice to inference.

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

gestoria_gastos_mandanteGestoría client: list expensesA
Read-only
Inspect

For a gestoría account: the expenses (gastos) of ONE accepted client in a year or quarter, newest first: date, description, supplier and its NIF, base, IVA, total, category, and whether a receipt file is attached. Read-only.

NameRequiredDescriptionDefault
yearNo
limitNoMax rows, default 50, max 200
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id
quarterNo1-4; omit for the whole year

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's 'Read-only' is consistent with them. Beyond that it adds real context: sort order (newest first), the exact fields returned including supplier NIF, IVA and the receipt-attached flag, and the single-client scoping. It omits pagination/row-cap behavior, which lives only in the schema.

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

Conciseness5/5

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

One front-loaded sentence: audience/account type first, then scope, then ordering, then returned fields. The field enumeration is long but earns its place because there is no 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 output schema, the description compensates by enumerating returned fields, which is exactly what an agent needs to decide to call it. The remaining gap is row-limit/pagination behavior and whether quarter requires year, both left entirely to the 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 75% and already documents link_id provenance and the quarter range, so the baseline is met. The description adds the period semantics ('in a year or quarter') and stresses 'ONE accepted client', reinforcing that link_id is a per-client identifier rather than a tenant scope.

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 the resource (expenses/gastos) and immediately narrows the scope: a gestoría account, ONE accepted client, a year or quarter, newest first. The 'For a gestoría account' and 'ONE accepted client' framing cleanly separates it from list_expenses (own account) and gestoria_facturas_mandante (invoices) without needing to open 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?

'For a gestoría account' and 'ONE accepted client' tell the agent the precondition and the scope constraint that rules out the general list_expenses tool. It does not explicitly name an alternative tool or say when-not to call it, but the account-type gating is a clear, usable condition.

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

gestoria_invitar_mandanteInvite a gestoría clientAInspect

Invite a client (by email) to link their contix account to this gestoría. If the email already has an account, they get a confirmation link; otherwise a registration link. Either way the client must accept before the gestoría can read anything. Returns the same generic confirmation text regardless of whether that email already has an account.

NameRequiredDescriptionDefault
emailYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context: the client must accept before the gestoría can read anything, and the response is deliberately generic regardless of account existence (anti-enumeration). It does not mention rate limits or error behavior, but it substantially exceeds what the annotations provide.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then the branch behavior, then the consent requirement and return semantics. No sentence is 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?

No output schema, and the description covers the return value (generic confirmation text) plus the key consent gate, which is enough to call it correctly. Edge cases like duplicate pending invitations or error responses 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 coverage is 0%, but the single parameter is fully implied by 'Invite a client (by email)' — the description confirms the parameter is an email address. No format, validation, or normalization detail (e.g. case handling) is added, so it is adequate but minimal for a one-param 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?

Specific verb (Invite) plus resource (a client / gestoría mandante) and the mechanism (by email, to link their contix account to this gestoría). The direction of the invitation is explicit, which distinguishes it from the reverse-direction sibling invite_gestoria.

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 lays out the two branches (existing account → confirmation link, new email → registration link) and the precondition that the client must accept. It does not explicitly name alternatives such as gestoria_abrir_mandante or invite_gestoria, leaving some sibling routing to inference.

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

gestoria_listar_mandantesList gestoría clientsA
Read-only
Inspect

For an account in gestoría mode (is_gestoria): list all linked clients (pendiente/aceptado/revocado), and for the accepted ones, invoices this quarter, pending balance and last invoice date. Fails if this account is not a gestoría.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds the non-obvious failure mode for non-gestoría accounts and discloses that the result is composite (clients + quarterly invoices + pending balance + last invoice date), which goes beyond the structured fields.

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

Conciseness5/5

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

One dense sentence plus a short failure clause, with the gestoría precondition front-loaded. Each clause carries distinct information: scope, statuses, returned metrics, and error condition.

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, so the description must describe returns, and it does: client statuses and per-accepted-client quarterly invoices, pending balance and last invoice date. Combined with the declared failure mode, an agent has enough to call it correctly.

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

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 explain; the baseline of 4 applies. The description correctly implies the account context comes from the session rather than arguments.

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 (linked clients of a gestoría account) plus the statuses returned. It implicitly differs from gestoria_resumen_mandante by covering all linked clients rather than one, though it doesn't name that sibling explicitly.

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

Usage Guidelines4/5

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

"For an account in gestoría mode (is_gestoria)" gives a clear precondition for use, and "Fails if this account is not a gestoría" states the when-not case. No alternative tool is named, so an agent must infer that this is the multi-client overview rather than the per-mandante tools.

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

gestoria_resumen_mandanteGestoría client: figures for a periodA
Read-only
Inspect

For a gestoría account: the figures of ONE accepted client for a year or a quarter: number of invoices, net base, IVA repercutido, IRPF withheld, total, how many are still drafts; expenses with base, IVA soportado and total; plus how many blocking points and warnings the revision found. Sums and counts only, never an opinion on what to declare or deduct.

NameRequiredDescriptionDefault
yearNoCalendar year; defaults to the current one
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id
quarterNo1-4; omit for the whole year

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover readOnly/non-destructive, and the description adds real context beyond them: output is aggregates only, scoped to a single accepted client, and returns only blocking points/warnings rather than advice. It does not mention what happens if the client is not accepted or if the period has no data, but the behavioural profile is well disclosed.

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 account type and subject ('For a gestoría account: the figures of ONE accepted client'), then lists the returned figures, then the scope caveat. Dense but every clause carries signal; slightly long as a single run-on enumeration.

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, so the description shoulders the return-value burden and does it well by naming the invoice, expense and revision aggregates in order. Remaining gaps (behaviour for a non-accepted client, empty periods) are minor for a read-only aggregation 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 coverage is 100% and both year and quarter already carry descriptions, so baseline 3 applies. The description reinforces the period semantics ('a year or a quarter') and implies link_id identifies the client rather than the tenant, but adds no new format or default information.

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 pair ('the figures of ONE accepted client for a year or a quarter') and enumerates exactly which figures: invoice counts, net base, IVA repercutido, IRPF, totals, drafts, expenses with IVA soportado, blocking points and warnings. This cleanly separates it from siblings like gestoria_facturas_mandante (line-level invoices) or gestoria_revision_mandante (the revision itself) — it is the aggregate roll-up.

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 context ('For a gestoría account', 'ONE accepted client') and the scope fence 'Sums and counts only, never an opinion on what to declare or deduct'. It never explicitly says when to prefer this over gestoria_revision_mandante or gestoria_gastos_mandante for the same client/period, so routing still needs inference.

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

gestoria_revision_mandanteGestoría client: what is missingA
Read-only
Inspect

For a gestoría account: what is missing or does not add up formally in ONE accepted client's period: expenses without a receipt, draft invoices, suppliers without NIF above the Modelo 347 threshold, invoices without a Veri*factu record, a recurring receipt that did not arrive this quarter. Same source as the REVISION.txt in the bulk export and the quarter-close reminders. Each point is a QUESTION to put to the client, never a tax assessment or an instruction.

NameRequiredDescriptionDefault
yearNo
link_idYesThe id from gestoria_listar_mandantes, not the tenant_id
quarterNo1-4; omit for the whole year

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds the important behavioral framing that output items are questions to put to the client rather than tax assessments or instructions, which directly governs how the agent should relay results. It does not mention result size, whether an empty set is normal, or cost/latency limits.

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?

Scope and purpose lead; the enumeration, though long, earns its place by defining exactly which gaps qualify; the closing sentence is a compact presentation rule. No filler or repetition of annotation fields.

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 only three parameters and no output schema, the description does the heavier lifting well by characterizing the result as per-point client questions and by pinning down period/client scope. It could still be clearer about result shape (grouping, counts, empty-result meaning) for an agent composing a response.

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 67%: link_id and quarter are documented in the schema (including the omit-for-whole-year rule), and the description reinforces cardinality by saying 'ONE accepted client'. The undescribed `year` parameter gets no help from the description, and no format or default guidance is added 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 concrete analytical task ('what is missing or does not add up formally') scoped to 'ONE accepted client's period' and then enumerates the exact finding types (expenses without receipt, draft invoices, suppliers without NIF above the 347 threshold, missing Veri*factu records, absent recurring receipts). An agent can tell this apart from gestoria_resumen_mandante or gestoria_export 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 Guidelines4/5

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

Sets clear preconditions — a gestoría account, one accepted client, a period — and ties itself to the same source as REVISION.txt and quarter-close reminders, which tells the agent when this fits (pre-close review). It stops short of explicitly naming a sibling to use instead for a multi-client or summary view.

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

get_account_statementCustomer account statementA
Read-only
Inspect

Customer account statement (estado de cuenta): total invoiced, collected and outstanding balance, plus the list of invoices. Optionally limited to a period by issue date. Pure facts, no advice. Each invoice line also shows its own paid and outstanding amount.

NameRequiredDescriptionDefault
desdeNoYYYY-MM-DD, inclusive; omit for the whole history
hastaNoYYYY-MM-DD, inclusive; omit for the whole history
customer_idYes

TDQS

A3.7/5.0
Behavior4/5

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

readOnlyHint=true is consistent with a pure read tool. Beyond the annotation, the description discloses the return shape in useful detail — aggregated totals plus per-invoice paid and outstanding amounts — which matters because there is no output schema. It does not state whether cancelled/draft invoices are included in the totals, which for a financial statement is the one thing left uncovered.

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 payload (totals + invoice list), then the optional period constraint, then two short clarifiers. Four sentences, no filler; "Pure facts, no advice" is slightly meta but cheaply prevents the agent from expecting advisory output.

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-only, 3-parameter tool with no output schema, the return contents are described adequately. However, key inclusion rules that determine whether the numbers can be trusted (draft/cancelled/rectified invoices, currency, date basis for 'collected') are absent, which is a meaningful gap for a statement tool used near reconciliation tasks.

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 schema already documents desde/hasta format (YYYY-MM-DD, inclusive, omit for whole history) at 67% coverage. The description adds meaning beyond that by clarifying the period filters on issue date specifically rather than payment date — a real semantic distinction — and that leaving it out yields the full history. customer_id remains undocumented in both places.

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?

Names a specific resource (customer account statement) and enumerates exactly what it returns: total invoiced, collected, outstanding balance plus the invoice list, with per-line paid/outstanding. This separates it functionally from plain get_invoice/list_invoices (aggregate roll-up per customer), though it never names a sibling to route against.

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

Usage Guidelines3/5

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

"Optionally limited to a period by issue date" and "Pure facts, no advice" imply the usage context (period-scoped reconciliation view, no recommendations), but there is no explicit when-to-use-this-vs list_invoices/get_customer guidance and no stated prerequisites such as whether the customer must exist or have finalized invoices.

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

get_customerGet customerA
Read-only
Inspect

Get one customer (cliente) by id: NIF, contact and address.

NameRequiredDescriptionDefault
customer_idYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds some useful context by naming returned data (NIF, contact, address), but it does not describe not-found behavior or other operational details, leaving it only moderately 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?

A single front-loaded sentence with no filler. It states the action, scope, and returned fields 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?

The tool is simple and annotations cover its read-only nature, but there is no output schema. The description only partially describes the return payload (NIF, contact, address) and omits error/not-found behavior, so it is adequate but not 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%, so the description must clarify the single customer_id parameter. It only says "by id" and does not specify whether this is an internal integer ID, whether NIF can be used, or any format expectations beyond the schema's integer type.

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 states a specific verb ("Get") and resource ("customer") and scopes it to one record by id. The phrase "one customer ... by id" naturally distinguishes it from the sibling list_customers tool.

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: retrieve a single customer when an id is known. However, it does not explicitly say when to use this instead of list_customers or other customer-related siblings, nor does it mention prerequisites or exclusions.

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

get_face_statusGet FACe status (B2G)A
Read-only
Inspect

Processing status of an invoice at FACe: registrada, registrada_rcf, contabilizada, pagada, rechazada or anulada, plus the status of any cancellation request. Set refresh=true to query FACe live instead of returning the stored status.

NameRequiredDescriptionDefault
refreshNoQuery FACe live (default false)
invoice_idYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: by default it returns a stored (potentially stale) status, and refresh=true performs a live round-trip to FACe. What it does not mention is failure behavior when FACe is unreachable or the invoice has no FACe record.

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 tight sentences: the first front-loads the resource and its value set, the second carries the one behavioral switch. Nothing is repeated from the schema or title.

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, the description compensates well by enumerating the returned status values and noting that cancellation-request state is included. The remaining gap is the identity/format of invoice_id and what happens on FACe lookup failure.

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 50%: refresh is documented in the schema, invoice_id is not. The description fully explains refresh's live-vs-stored semantics and default, which is useful, but invoice_id — whether it is the internal invoice ID or a FACe registry number — is left undocumented in both places.

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: the FACe processing status of an invoice, and enumerates the six possible states. The FACe/B2G framing separates it from generic invoice readers like get_invoice, though no sibling is named explicitly.

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 purpose (check FACe submission/cancellation state), and the description does explain when to set refresh=true versus leaving it false. It never says when to prefer this over get_invoice or what to do if the invoice was never submitted to FACe.

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

get_invoiceGet invoice detailsB
Read-only
Inspect

Get full details of a single invoice including line items and Veri*factu hash.

NameRequiredDescriptionDefault
invoice_idYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuine value by disclosing that the payload includes line items and a Veri*factu hash, which tells the agent what data it gets back. It does not cover behavior for a missing/invalid invoice_id or any auth constraints, which keeps it below a 5.

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

Conciseness4/5

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

One front-loaded sentence that identifies the resource and enumerates the notable returned fields with no filler. It is appropriately sized, though it spends its space on return contents rather than the parameter that an agent must supply.

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?

With no output schema, the description usefully names the key return contents, and readOnlyHint covers safety. But for a lookup tool whose only parameter is undocumented, the description should at minimum explain what invoice_id is expected to be and possibly the error behavior for unknown IDs.

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 parameter invoice_id, an untyped-meaning integer with no explanation. The description mentions no parameter at all, so it fails to clarify whether this is an internal ID or the visible invoice number — a real ambiguity given the presence of get_invoice_display and series tools.

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 full details of a single invoice') with the scope made concrete by naming the returned content (line items, Veri*factu hash). It implicitly separates itself from list_invoices by saying 'single invoice', but never distinguishes itself from the other invoice-detail siblings such as get_invoice_display or get_invoice_facturae.

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: an agent can infer this is the single-invoice read versus list_invoices, but there is no explicit when-to-use, no mention of alternatives like get_invoice_display/get_invoice_facturae, and no stated prerequisites (e.g. whether the invoice must exist or be finalized).

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

get_invoice_defaultsGet invoice defaultsA
Read-only
Inspect

Get the tenant defaults a new invoice starts with: payment term in days (plazo de pago / días de vencimiento), IVA rate (tipo de IVA por defecto) and whether the retención field is hidden in the web forms. A customer's own saved values override these on their invoices.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With readOnlyHint=true already covering the safety profile, the description adds real value by declaring precedence: 'A customer's own saved values override these on their invoices.' That prevents misreading the result as the effective values for a specific customer. It does not mention tenant/auth scoping beyond 'tenant', but that is minor.

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 sentences, front-loaded with the returned content. The parenthetical Spanish synonyms (plazo de pago / días de vencimiento, tipo de IVA por defecto) add domain vocabulary useful for Spanish-invoicing users but slightly clutter the sentence.

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, so the description carries the burden of describing return values, and it names three concrete fields plus the override rule. It may still be missing other defaults the endpoint returns (e.g. series or footer defaults), which keeps it short of a 5.

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 correctly implies a single-tenant read with no filtering options, matching the empty 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 and resource ('Get the tenant defaults a new invoice starts with') and enumerates the exact contents: payment term in days, IVA rate, and retención visibility. This scope ('tenant defaults for a new invoice') cleanly separates it from get_invoice, get_invoice_display and get_invoice_footer.

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: an agent can infer it should call this before create_invoice to learn tenant defaults. There is no explicit 'use set_invoice_defaults to change these' pointer and no statement of when this is unnecessary, so the routing guidance is left to inference.

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

get_invoice_displayGet invoice display optionsB
Read-only
Inspect

How invoice PDFs are printed: IVA per line (iva_display: ninguno | auto | porcentaje | porcentaje_cuota | porcentaje_total) and whether the small 'Factura creada con contix.' note appears at the bottom (show_contix_badge), plus the phone and WhatsApp printed in the header (header_phone, header_whatsapp).

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read, so the severity bar is lower. The description adds useful substance by listing which settings exist and the allowed iva_display values (ninguno | auto | porcentaje | porcentaje_cuota | porcentaje_total), but it never explicitly says it returns the currently configured values or whether unset values have defaults.

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?

It is a single sentence with no filler, but it opens with a descriptive clause and a colon instead of leading with the action, and the parenthetical list of field names makes it dense and hard to scan. Front-loading 'Returns current invoice PDF display settings:' would improve it materially.

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?

No output schema exists, so the description carries the return-shape burden; it does enumerate the fields (iva_display, show_contix_badge, header_phone, header_whatsapp), which largely covers the response. What is missing is the retrieval framing — that these are the current stored values — and any hint about default behavior when options have not been set.

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 zero parameters, the baseline is 4. The description goes beyond that by documenting the enum domain of iva_display, which is a setting value the agent will encounter in the response rather than a parameter.

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 (invoice display options) and enumerates the exact settings involved, but it is phrased as a definition of what display options are ('How invoice PDFs are printed: ...') rather than as an action the tool performs. An agent can infer it retrieves settings, especially alongside sibling set_invoice_display, but the verb is never stated.

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 call this versus related tools. The clear counterpart set_invoice_display and related readers like get_invoice_defaults and get_invoice_footer are never referenced, so the agent must infer that this is the read side of the pair.

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

get_invoice_facturaeGet Facturae XML (B2G)A
Read-only
Inspect

Return the Facturae 3.2.1 XML of a finalized invoice, for invoicing Spanish public administrations (schools, ayuntamientos, universities). The XML is UNSIGNED and therefore not submittable on its own: FACe requires a XAdES-signed .xsig even through its web form. Use it to preview and validate the data; to actually file the invoice use submit_invoice_to_face, which signs it first. Requires the customer to be marked as public administration with the three DIR3 codes set; if data is missing, the tool explains exactly what to add.

NameRequiredDescriptionDefault
invoice_idYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond readOnlyHint=false mutation semantics by disclosing that the XML is UNSIGNED and therefore not submittable on its own, that FACe requires a XAdES-signed .xsig even via web form, and how the tool behaves when DIR3 data is missing ('the tool explains exactly what to add'). That is exactly the behavioral context annotations cannot carry.

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

Conciseness5/5

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

Four tight sentences, front-loaded with what is returned, then the signature caveat, then the alternative tool, then the precondition. No repetition of the name or title, 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 one parameter and no output schema, the description covers what is returned, its validity limits, the applicable alternative, and failure behavior — enough to call correctly. A minor gap is that it does not say whether the invoice must first be finalized via finalize_invoice, only that it is 'a finalized invoice'.

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% and the single parameter invoice_id has no type description in the schema. The description implies the id must refer to a finalized invoice, which adds useful meaning, but it does not clarify whether non-finalized or non-B2G invoices error out or return partial data.

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 with version precision: 'Return the Facturae 3.2.1 XML of a finalized invoice'. It distinguishes itself from nearby siblings like get_invoice and get_invoice_display by naming the exact artifact returned and the B2G/FACe scope.

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 scopes use to previewing and validating, and names the alternative: 'to actually file the invoice use submit_invoice_to_face, which signs it first'. It also states the prerequisite (customer marked as public administration with three DIR3 codes) that determines whether the call can succeed.

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

get_invoice_seriesGet invoice series/numberingA
Read-only
Inspect

Get the current invoice numbering series (serie de facturación / numeración): prefix (prefijo), year, next invoice number and whether the start number can still be changed this year.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful context beyond annotations: it discloses the four returned signals including whether the start number remains editable this year, which touches on a mutation boundary the agent otherwise wouldn't know about. Return format/shape is not detailed, keeping it from a 5.

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

Conciseness5/5

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

A single, front-loaded sentence with zero filler. The parentheticals earn their place by mapping the Spanish billing terminology an agent may encounter in this domain.

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, the description carries the burden of explaining returns and does so by naming the relevant fields and the changeability flag. It is complete enough to call, though it doesn't state the exact response structure or what happens if no series exists yet.

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 focuses on return semantics rather than inventing parameters, and the Spanish synonyms ('serie de facturación / numeración', 'prefijo') clarify domain vocabulary.

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 ('invoice numbering series') and enumerates what the caller receives: prefix, year, next invoice number, and mutability of the start number. It is clearly distinguishable from get_quote_series and set_invoice_series by the 'invoice'/'current' framing, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

The intent to read the current series before creating or configuring invoices is implied but never stated, and no alternatives are named (get_invoice_defaults, set_invoice_series). An agent can infer usage but receives 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.

get_libros_registroLibros registro (facturas expedidas / recibidas)A
Read-only
Inspect

Libro registro de facturas expedidas and recibidas for a quarter or year: one line per issued invoice (finalized only) and per received invoice and VAT rate, with base, VAT, IRPF withholding / deductible quota and total, plus period sums. The same rows the gestoría export contains. Pure listing, no advice.

NameRequiredDescriptionDefault
yearYes
quarterNo1-4; omit for the whole year

TDQS

A4/5.0
Behavior4/5

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

Read-only safety is already covered by readOnlyHint, but the description adds meaningful behavior: only finalized issued invoices are included, received invoices are broken out by VAT rate, and output rows include base, VAT, IRPF/deductible quota, total, and period sums. It does not discuss pagination or auth, but for a simple report it discloses the important semantics.

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?

The description is front-loaded and dense with useful information, with no filler. It moves from what the report is to what each row contains to how it relates to the gestoría export and its non-advice nature.

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, the description does a good job explaining the return shape and line granularity. It is nearly complete for a two-parameter read-only report, though it could be more explicit about the year parameter and whether all received invoices are included.

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 50%: quarter is documented in the schema, while year is not. The description reinforces that the report covers a quarter or year, but it does not add year format/range details or explain requiredness beyond what the schema already shows.

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 states a specific resource and scope: libro registro of issued and received invoices for a quarter or year, with one line per invoice and VAT rate. It also distinguishes this listing from export/advice behavior by saying it contains the same rows as the gestoría export and is a pure listing with no advice.

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 scope ('for a quarter or year') and by 'Pure listing, no advice,' but the description does not explicitly say when to use this instead of siblings such as list_invoices or gestoria_export. It gives context without clear alternatives or exclusions.

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

get_modeloGet AEAT tax model (modelo)A
Read-only
Inspect

Get an AEAT tax model summary (modelo / declaración): 303 & 390 (IVA), 130 (IRPF), 347, 349, 202. Read-only calculation from existing invoices and gastos. Provide quarter (1-4) for 303/130/349, or periodo (1P/2P/3P) for 202. Note: modelo 202 assumes pagos_anteriores=0 (prior-period payments not tracked): the resulting amount is a raw base calculation, not a final figure to pay. Returns the full breakdown AEAT uses for that modelo (its casillas/boxes with each computed amount) as JSON. To just sum casillas you already have by hand, without querying the account, use calculate_modelo_303 instead.

NameRequiredDescriptionDefault
yearYes
modelYes
periodoNo
quarterNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds substantive context beyond that: the calculation is derived from existing invoices and gastos, and modelo 202 assumes pagos_anteriores=0, so the figure is a raw base not a final payable amount. That caveat is exactly the kind of behavioral disclosure annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with purpose and the supported modelos, then caveat, return format, and the sibling alternative. Dense but every clause carries information; the modelo 202 warning is slightly long but genuinely necessary for correct interpretation of the output.

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, but the description explains the return shape (full AEAT breakdown of casillas as JSON). Period semantics are covered, though it doesn't state what happens if the period is omitted for a modelo that requires one.

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 for the tricky parameters: it maps quarter to 303/130/349 and periodo to 202, and the model enum values are all named in prose. Only 'year' is left unstated, though its meaning is self-evident.

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 ('Get an AEAT tax model summary') and enumerates exactly which modelos are supported (303, 390, 130, 347, 349, 202). It also distinguishes itself from the sibling calculate_modelo_303 by naming it explicitly.

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 routing: use this tool for the full AEAT breakdown, and use calculate_modelo_303 instead if you only need to sum casillas by hand without querying the account. It also specifies which period parameter applies to which modelo (quarter for 303/130/349, periodo for 202).

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

get_obligation_datesVeri*factu and e-invoicing deadlines (Spain)A
Read-only
Inspect

Deadlines from the published Spanish rules: Veri*factu (RD 1007/2023, dates of RD-ley 15/2025) and mandatory B2B e-invoicing (RD 238/2026, counted from the ministerial order, provisional while the order is a draft). Information about the rules, not advice. Returns a date (or null) and explanatory text for each obligation (verifactu, factura_electronica and, where it applies, estados_facturas).

NameRequiredDescriptionDefault
formaYessociedad = company paying Impuesto sobre Sociedades; autonomo = self-employed
mas_8_millonesNoTurnover above 8 million EUR last year
factura_a_empresasYesInvoices other businesses or professionals in Spain

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so the description focuses on what the annotations cannot say: which legal sources are used, that the e-invoicing dates are provisional while the ministerial order is a draft, and that a null date is a possible outcome. That provisionality/uncertainty disclosure is genuinely useful context a caller could not derive from structured fields.

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

Conciseness4/5

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

A compact paragraph that front-loads the subject (deadlines from published Spanish rules), then sources, then the return shape. It is dense with legal citations but every clause (regulation IDs, provisional status, null return, obligation keys) carries information an agent needs.

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, the description correctly compensates by describing the return: a date or null plus explanatory text, keyed by obligation name (verifactu, factura_electronica, estados_facturas). The one gap is that it never says which inputs trigger estados_facturas ('where it applies' is left ambiguous), though the schema hints at it via mas_8_millones.

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 100%, including an explanation of the forma enum and the mas_8_millones turnover threshold, so the schema carries parameter meaning fully. The description adds nothing about how forma / mas_8_millones / factura_a_empresas change which obligations are returned — baseline 3 is the right level.

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 (returns deadlines) and a specific, narrowly-scoped resource (Spanish Veri*factu and B2B e-invoicing obligations), citing the governing regulations. No sibling tool overlaps with this lookup, and the description makes that uniqueness obvious.

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: an agent can infer this answers 'when do I have to comply with Veri*factu / e-invoicing'. There is no explicit statement of when to call it versus e.g. get_modelo or calculate_modelo_303, and no prerequisites mentioned beyond the schema. The scope caveat 'Information about the rules, not advice' is the only boundary drawn.

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

get_product_groupsGet product groupsA
Read-only
Inspect

List the account's product groups (grupos de producto): one optional axis 'what was sold' (e.g. Hosting, Programación, SaaS) that an invoice can carry. Pure data: contix does not derive anything fiscal from it. Returns the list of group names, comma separated.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the data is non-fiscal ('contix does not derive anything fiscal from it') and the return shape is a comma-separated list of names, which tells the agent not to expect structured objects or ids.

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?

Three short sentences, front-loaded with the verb and resource, then the domain definition, then the return format. The Spanish parenthetical earns its place given the tool's locale, though the 'Pure data / no fiscal derivation' clause is slightly defensive verbosity.

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 read tool with no output schema, the description supplies the one thing missing from structured data: what the returned names look like (comma separated) and what the concept means. Only the absence of guidance on the write-side sibling keeps it from a 5.

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 nothing for the description to disambiguate; baseline 4 applies. The description correctly implies no filtering or pagination options exist.

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 ('List the account's product groups') and then defines the domain concept (an optional axis 'what was sold' that an invoice can carry) plus the Spanish term, which is the actual field name in the product. An agent knows exactly what this returns and how it differs from the mutating sibling set_product_groups.

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 verb — read the current catalogue of product groups — but there is no explicit routing such as 'to change them, use set_product_groups' or a note on when an agent should consult this list before creating an invoice. Adequate, not instructive.

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

get_quote_seriesGet quote numberingA
Read-only
Inspect

Next quote number (P-YYYY-NNNN) and the configured start number.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful context by disclosing the returned quote-number format and the configured start number, but it does not describe side effects, permissions, or whether it reflects unsaved settings.

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?

The description is a single, front-loaded sentence that states the return content without filler. Every element earns its place and 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?

With no parameters, no output schema, and a readOnly annotation, the description provides the key return values an agent needs. It could be slightly more complete by clarifying whether the result is purely a preview or tied to the current series configuration, but it is adequate for a simple getter.

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 parameter semantics are inherently simple and the baseline is 4. The description appropriately avoids spending words on non-existent 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?

The description clearly states the resource and result: the next quote number in P-YYYY-NNNN format plus the configured start number. It is specific about what is returned, though it does not explicitly differentiate itself from siblings such as set_quote_series or get_invoice_series.

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 like set_quote_series or get_invoice_series. The read-only preview nature is implied only by the output described, not by explicit usage conditions or exclusions.

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

get_subscription_statusGet subscription/trial statusA
Read-only
Inspect

Get the account's subscription status: trial (período de prueba), active, past_due or canceled, including days remaining in the trial and the next billing date. Use this when the user asks about their plan, trial or billing, or proactively once during a session if unsure whether the account might be close to needing payment.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered; the description adds the actual payload semantics (trial days remaining, next billing date) and a self-throttling rule for proactive calls. It stops short of mentioning auth requirements or caching/staleness of billing data, which keeps it from a 5.

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

Conciseness5/5

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

Two sentences, both load-bearing: the first defines the output, the second defines the trigger. The bilingual gloss ('período de prueba') plausibly aids matching Spanish-language user phrasing rather than 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?

A zero-parameter read tool with no output schema, fully covered: the description explains what comes back (status values, days remaining, billing date) and when to call it. Nothing an agent needs to invoke it correctly is missing.

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

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 nothing to disambiguate and the schema is trivially complete. Baseline 4 applies; no additional parameter guidance is owed.

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?

A specific verb and resource ('Get the account's subscription status') followed by an explicit enumeration of the returned states (trial, active, past_due, canceled). No sibling tool covers subscription/billing status, and the description makes that scope unmistakable.

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?

States two concrete triggers: when the user asks about their plan, trial or billing, and proactively once per session if unsure about payment proximity. The 'once during a session' qualifier is an explicit usage constraint that prevents over-calling.

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

invite_gestoriaInvite your gestoríaAInspect

Invite the accounting firm (gestoría) that keeps this account's books, by email, so it can see and export these invoices and expenses from its own contix panel (read-only, until this account grants more in Ajustes). If the email already has a contix account, the firm gets a notification and accepts from its client list; otherwise it gets a link to register as a gestoría. Same generic reply in every case. Only for the own account. Returns that same generic confirmation text, by design, so it reveals nothing about whether the email has an account.

NameRequiredDescriptionDefault
emailYes

TDQS

A4.1/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: access is read-only until the account grants more in Ajustes, the recipient's flow differs depending on whether it already has a contix account, and the same generic reply is returned in all cases by design for privacy. This privacy-preserving return contract is exactly the kind of thing an agent cannot 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-loads purpose and access level, then explains the two recipient paths and the generic reply. Dense and nearly waste-free, though the final sentence partly restates the 'same generic reply' point already made.

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 one-parameter mutation with no output schema, the description covers the access granted, the recipient-side flow, the privacy-motivated return value, and the account scope. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Only one parameter (email) with 0% schema description coverage. The description confirms the invite is sent 'by email' and discusses what happens based on account existence, but adds no format, validation, or constraint details for the email value itself.

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 ('Invite the accounting firm (gestoría) ... by email') and what the invite grants (read-only visibility and export of invoices/expenses). It scopes itself with 'Only for the own account', which helps distinguish it from the gestoria_*_mandante siblings, though it never names them.

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: invite the firm that keeps this account's books, and explicitly restricts to the own account, implying the mandante sibling is for other cases. It doesn't explicitly name the alternative tool or state when not to use it beyond that scoping sentence.

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

list_bank_importsList bank importsA
Read-only
Inspect

Bank statement imports of this account, one row per import day: number of movements and their date range. Use it to offer the user 'delete what I imported on '.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds the meaningful behavioral detail that results are aggregated to one row per import day with a movement count and date range, which is not in the annotations and there is no output schema to carry it. It omits ordering/pagination and how far back imports are retained.

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 sentences: the data shape is front-loaded, then the intended use case. Every clause earns its place and nothing is repeated from the annotations or 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?

For a zero-parameter read tool with no output schema, the description covers what the rows represent and how to apply them, which is close to sufficient. Missing only minor operational context such as ordering or the scope of history returned.

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 nothing for the description to disambiguate; baseline 4 applies. The description correctly adds no parameter chatter.

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 (bank statement imports of this account) and the exact result granularity (one row per import day, with movement count and date range), which lets an agent distinguish it from sibling bank tools like list_bank_trash or delete_bank_transactions. It never names a sibling to contrast with, 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 Guidelines4/5

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

"Use it to offer the user 'delete what I imported on <day>'" gives a concrete workflow context, implicitly routing to the delete counterpart. It does not state exclusions or name the alternative tools (e.g. list_bank_trash for already-deleted items), so routing 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.

list_bank_trashBank trashA
Read-only
Inspect

Deleted bank movements still recoverable, one row per deletion (lote) with count and the date it is purged.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, and the description adds real value beyond that: it discloses result granularity (one row per deletion lote, not per movement) and that each row carries a count and a purge date. That return-shape information is meaningful since there is no output schema. It omits whether anything is filtered or capped.

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 sentence with no filler, front-loading the resource ('Deleted bank movements still recoverable') before the row-shape detail. Every clause carries information the schema and annotations do not.

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 read tool with no output schema, the description covers what is listed, the level of aggregation, and one key field (purge date) — enough to call it correctly. It stops short of describing whether results are grouped, paginated, or bounded, which would complete the picture.

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 of 4 applies. The description makes no parameter claims and needs none, and the empty schema is self-evident.

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 precisely what the resource is: deleted bank movements that are still recoverable, with one row per deletion batch (lote). Combined with the tool name, an agent knows this is a trash-listing read. It does not explicitly contrast itself with restore_bank_trash or delete_bank_transactions, so sibling differentiation is only implicit.

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 phrase 'still recoverable' implies this is the discovery step before calling restore_bank_trash, but no explicit when/when-not guidance or named alternative is given. Usage is inferable rather than stated.

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

list_customersList customersA
Read-only
Inspect

List customers in the user's contix account. Optional query matches against company_name, contact_name, or NIF. Optional nif returns only the customer with exactly that NIF/CIF. Returns one line per customer: id, name and NIF.

NameRequiredDescriptionDefault
nifNoExact NIF/CIF (optional; ignores case, spaces, dots, dashes)
limitNo
queryNoSearch term (optional)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuinely new behavior: the matching fields for `query` and the fact that `nif` narrows the result to a single customer. It does not mention pagination beyond the `limit` default or result ordering, which keeps it from a 5.

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

Conciseness5/5

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

Three short sentences, each carrying distinct information (scope, filters, return shape), with the account scope front-loaded. No filler or restatement of the title.

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, the description usefully states the return shape ('one line per customer: id, name and NIF'). For a read-only list tool that is close to sufficient; only pagination/limit behavior and the total-vs-truncated result question remain unaddressed.

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 67% and the description fills the largest gap: the schema only says 'Search term (optional)', while the description specifies that `query` matches company_name, contact_name, or NIF. `nif` semantics are largely redundant with the schema, and `limit` (default 20, max 100) is never mentioned in the description.

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 ('List customers in the user's contix account') and clarifies the two filtering modes. It never names `get_customer` as the alternative for single-record lookup, so sibling differentiation is only partial.

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 description explains the two optional filters (`query` for fuzzy matching, `nif` for an exact single match), which implicitly tells the agent when to use which. It gives no explicit guidance on when to prefer `get_customer` or `create_customer`, and never states that a bare call returns all customers up to `limit`.

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

list_expensesList expensesA
Read-only
Inspect

List expenses (gastos): date, description, supplier, total, category, and whether the original receipt file is attached (SIN JUSTIFICANTE = no file). Optional free text (query: description, invoice number, notes, supplier name/NIF, amount), e.g. to check whether a supplier invoice is already booked. To attach the receipt file to an expense use attach_expense_receipt.

NameRequiredDescriptionDefault
limitNo
queryNofree text, e.g. supplier invoice number or supplier name

TDQS

A4.6/5.0
Behavior4/5

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

With readOnlyHint=true already declared, the description adds useful behavioral context by listing the exact fields returned, including the receipt-attached flag and the meaning of 'SIN JUSTIFICANTE = no file'. It does not describe pagination or ordering, but the schema's limit bounds partially cover that and the tool has no output schema, making the field disclosure especially valuable.

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 dense but well-structured sentences: first the resource and returned fields, then query semantics with an example use case, then the alternative tool for attachment. Every sentence adds information without repetition, and the key scope is front-loaded.

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?

The description covers what the tool returns, which is critical because there is no output schema, and it fully explains the only under-documented parameter (query). It also names the relevant sibling for the adjacent attach action, leaving no major gaps for an agent to call it correctly.

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

Parameters5/5

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

The query parameter's schema description is minimal ('free text, e.g. supplier invoice number or supplier name'), while the tool description significantly expands its meaning to search across description, invoice number, notes, supplier name/NIF, and amount. The limit parameter is fully specified in the schema with default and min/max, so no additional description is needed.

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 states a specific verb and resource (list expenses/gastos) and immediately enumerates the returned fields (date, description, supplier, total, category, receipt attached), which clearly distinguishes it from mutation siblings such as create_expense or update_expense. It also explicitly routes receipt attachment to attach_expense_receipt, making the scope unambiguous.

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 a concrete use case ('e.g. to check whether a supplier invoice is already booked') and names the alternative tool for a related but different action ('To attach the receipt file to an expense use attach_expense_receipt'). It does not explicitly say when not to use it (e.g., for invoices use list_invoices), but the main boundary is clear.

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

list_invoicesList invoicesA
Read-only
Inspect

List invoices for the user's contix account. Filter by status (draft/sent/paid/overdue), year, or free text (query: invoice number, reference, notes, customer, and the line descriptions, so a domain or product that only appears in an invoice line is found). Recent first. Returns one line per invoice: id, number (or Borrador for a draft), issue date, total and status. Use get_invoice for one invoice's full line items and Veri*factu hash.

NameRequiredDescriptionDefault
yearNo
limitNo
queryNofree text, e.g. a domain, product, customer or invoice number
statusNo

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint already declared, the description adds real context: result ordering ("Recent first") and the exact per-invoice projection (id, number or "Borrador" for a draft, date, total, status). It does not say whether results are capped by the limit parameter or truncated, which is the one behavioral gap that 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.

Conciseness5/5

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

Dense but front-loaded: purpose, then filters, then ordering, then return shape, then the sibling redirect. No filler sentences and every clause carries information an agent needs.

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, yet the description fully specifies the return shape at line granularity, so the agent knows what it will receive. Combined with ordering and filter semantics, nothing essential for a correct call 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 only 25%, so the description must compensate, and it largely does: it enumerates status filters, explains that query searches not just number/reference/notes/customer but also line descriptions (a real behavior the schema does not convey), and implies year filtering. It omits the limit parameter entirely (default 20, max 100), leaving one of four params undocumented.

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 ("List invoices") plus the scoping domain ("for the user's contix account"), and explicitly contrasts with the sibling get_invoice. An agent can distinguish this list/search tool from the single-invoice fetch 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 Guidelines4/5

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

Explicitly routes the agent to get_invoice when full line items or the Veri*factu hash are needed, which is the main ambiguity for a invoices listing. However there is no guidance on when to prefer list_invoices vs. other listing tools (list_quotes, list_expenses) and no mention of limits/pagination strategy.

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

list_paymentsList payments of an invoiceA
Read-only
Inspect

The individual payments recorded against one invoice, oldest first. The invoice's amount_paid stays the leading sum, this is its breakdown. Imported invoices have none: their history lives in the source system. Returns one line per payment: date, amount, method and reference, plus the invoice's total paid and outstanding.

NameRequiredDescriptionDefault
invoice_idYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds substantive context beyond that: ordering (oldest first), the relationship to amount_paid, the imported-invoice empty case, and the return field set. It doesn't cover error behavior for an unknown invoice_id, keeping it at 4.

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 definition, then the disambiguating note about amount_paid, then the empty case and return shape. Every sentence carries information; the amount_paid sentence is slightly convoluted but earns its place as a disambiguator.

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, the description does the right work by enumerating the returned fields and ordering, plus the imported-invoice edge case. It lacks any statement on error handling or volume/limits, which is a modest gap for a single-param read.

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% with one required integer invoice_id, so the description must carry the load. It only implies the parameter ("one invoice") and never says where the id comes from (e.g. list_invoices or get_invoice) or what happens with an invalid id, so it adds minimal meaning over the bare 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 resource — the individual payments recorded against one invoice — and its scope/ordering, which implicitly separates it from get_invoice (which gives the aggregate) and record_payment (which writes one). An agent can tell exactly what it gets back 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 Guidelines4/5

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

Gives a clear context for use (you want the breakdown behind amount_paid) and a valuable exclusion: imported invoices have no payment history. It does not name a sibling alternative such as get_invoice, so it falls short of explicit 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_quotesList quotesA
Read-only
Inspect

List quotes (presupuestos): non-fiscal offers sent to a customer before invoicing. Filter by status. Returns one line per quote: id, quote number, issue date, total and status.

NameRequiredDescriptionDefault
limitNo
statusNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest: it discloses that quotes are non-fiscal pre-invoice offers and spells out the exact per-row return shape (id, quote number, issue date, total, status), which is genuinely useful with no output schema. It omits pagination/limit behavior and whether results are ordered, keeping it below 5.

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 short sentences, front-loaded with the identity of the resource, then the filter, then the return shape. No filler and no repetition of the title.

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 read-only list tool with no output schema, the description supplies both the domain meaning and the returned fields. The one real gap is that 'limit' and result ordering/pagination are never addressed, which an agent needs to page results reliably.

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 covers the 'status' filter conceptually ('Filter by status') but never lists the enum values or explains their meaning, and it says nothing at all about 'limit' (default 20, max 100). Partial compensation only.

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 ('List quotes') and defines the domain term with a clarifying gloss ('presupuestos: non-fiscal offers sent to a customer before invoicing'), which implicitly separates it from list_invoices. It does not name a sibling tool explicitly, so it stops short of a 5.

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

Usage Guidelines3/5

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

'Filter by status' implies the intended use case (browse quotes by lifecycle state), but there is no explicit when-to-use/when-not guidance and no pointer to alternatives such as get_quote_series, get_invoice, or list_invoices. Usage must be inferred.

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

list_recurringList recurring profilesA
Read-only
Inspect

List recurring invoice profiles (facturas recurrentes / suscripciones): name, frequency, next date, active.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read with no side effects. The description adds the concrete field set (name, frequency, next date, active), which is useful behavioral detail, but says nothing about ordering, pagination, or whether inactive profiles are included — notable given 'active' appears as a field.

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?

One front-loaded sentence with the resource first and the field list appended; no filler. The Spanish/English synonym parenthetical earns its place for a Spanish-domain tool but is the only slight redundancy.

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 input parameters, no output schema, and readOnlyHint already covering safety, the description supplies the one thing the structured data omits — the shape of each returned record. Only pagination/result-volume behavior is absent, a minor gap for a simple list endpoint.

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 and there is nothing for the description to compensate for. No parameter semantics are needed or missing.

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+resource ('List recurring invoice profiles') and enumerates the returned fields, so an agent knows exactly what this returns. It is naturally distinguished from create_recurring/generate_recurring by the verb, but does not name those siblings explicitly.

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

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 verb 'List': an agent can infer this is the read path for recurring profiles. There is no explicit guidance on when to call this versus create_recurring or generate_recurring, nor on prerequisites or exclusions.

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

list_reminders_sentList reminders sentA
Read-only
Inspect

List invoices where contix already sent a payment reminder (recordatorio / aviso de pago): how many and when, newest first. Returns one line per invoice: reminder count, date of the last one and the invoice total.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuinely new behavior — ordering (newest first) and the per-invoice return granularity (count, last date, total). It does not disclose scope or limits (all time? all customers? pagination?), which is the remaining gap.

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

Conciseness5/5

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

Two sentences, no filler: the first defines the set and its ordering, the second defines the return shape. Front-loaded with the scoping condition rather than burying it.

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, the description carries the burden of explaining returns and does so explicitly (one line per invoice: count, last date, total). It is nearly complete; only the temporal/customer scope of the listing is left unstated.

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 there is nothing for the description to disambiguate and the baseline of 4 applies. It correctly makes no claims about filtering inputs.

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 a precisely scoped resource: invoices where a payment reminder was already sent, including the Spanish synonyms (recordatorio / aviso de pago). That qualifier is what separates it from the broad list_invoices sibling, so an agent can choose 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 Guidelines3/5

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

The use case is strongly implied by 'where contix already sent a payment reminder', but the description never states when to prefer this over list_invoices or how it relates to send_reminder. There is no explicit exclusion or alternative routing.

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

list_suppliersList suppliersA
Read-only
Inspect

List suppliers (proveedores) with id, NIF, country and how many expenses each has. Use it to find the supplier_id for create_expense, or to check whether a supplier already exists before creating one.

NameRequiredDescriptionDefault
limitNo
searchNofilter by name or NIF

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so safety is covered. The description adds useful behavioral context by specifying what data comes back (id, NIF, country, expense count), which helps the agent interpret results. It doesn't mention pagination behavior for the limit param.

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 sentences, front-loaded with the returned fields, then the use cases. No wasted text; every clause 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?

No output schema exists, but the description compensates by listing returned fields. For a simple read-only listing tool with annotations, this is nearly complete; only the limit pagination behavior is left implicit.

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?

At 50% schema coverage, only 'search' is documented in the schema; 'limit' has just defaults/bounds with no description. The description mentions neither parameter, so it does not compensate for the gap. Baseline 3 for the documented half 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 (list) and resource (suppliers/proveedores) and enumerates the returned fields (id, NIF, country, expense count). The agent can distinguish it from siblings like list_customers or list_expenses 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 Guidelines4/5

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

Explicitly names two concrete use cases: finding supplier_id for create_expense, and checking existence before creating a supplier. This routes the agent clearly, though it doesn't state exclusions or mention alternative discovery paths.

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

mark_invoice_sentMark invoice as sentAInspect

Record that a finalized invoice reached the customer by another channel (your own email thread, WhatsApp, paper), without contix emailing anything. Finalizing does NOT count as sent; send_invoice records it automatically. Optional date (YYYY-MM-DD) if it was sent on an earlier day. Returns the invoice id and the date it was marked as sent.

NameRequiredDescriptionDefault
dateNoYYYY-MM-DD, default today
invoice_idYes

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), it discloses the key behavioral fact that no email is sent, the precondition that the invoice must already be finalized, and the return payload (invoice id and marked-sent date). It does not say what happens if the invoice is not finalized (error vs silent accept) or whether repeated calls are idempotent, which keeps it short of a 5.

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

Conciseness5/5

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

Four sentences, front-loaded with the primary use case before the exclusion, the parameter note, and the return values. No filler and no repetition of the title or annotations.

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 mutation with no output schema, it covers the trigger, the no-op side effect, the prerequisite state, and the return shape. Only the failure mode for a non-finalized invoice is unstated.

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 only 50%, so the description has to carry weight; it explains the optional date's purpose (when it was actually sent on an earlier day) and its YYYY-MM-DD format, duplicating and extending the schema hint. invoice_id is undocumented in both places, though the name is self-explanatory.

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 (record) and resource (a finalized invoice as sent) plus the scope qualifier 'by another channel', and explicitly distances itself from send_invoice. An agent can distinguish it from send_invoice or finalize_invoice 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?

Gives the exact triggering condition (customer was reached via your own email thread, WhatsApp, paper), an explicit exclusion (finalizing does NOT count as sent), and names the alternative that handles the other case (send_invoice records it automatically). 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.

mark_quote_sentMark quote as sentAInspect

Move a DRAFT quote to sent without contix emailing it (you sent it yourself). Returns the quote number.

NameRequiredDescriptionDefault
quote_idYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare a non-read-only, non-destructive mutation; the description adds the state transition (DRAFT to sent), the no-email side effect, and the return value (quote number). It omits prerequisite/error behavior if the quote is not in DRAFT, but the key behavioral traits are disclosed.

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 sentences, zero filler, with the decisive distinction (no email sent) front-loaded ahead of the return value.

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 simple one-parameter state-flip with no output schema, the description covers what it does, the key caveat, and the return value. It could add the DRAFT prerequisite and error behavior, but nothing essential to calling it is missing.

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 explains quote_id (what kind of identifier it is, where to obtain it). With one undocumented required parameter, the description fails to compensate for the schema gap, leaving only the self-evident parameter name.

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 (move a DRAFT quote to sent) and explicitly separates itself from send_quote by noting the tool does not email the quote. An agent can pick it out from the large quote/invoice sibling set 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?

The parenthetical '(you sent it yourself)' gives a clear condition for choosing this over send_quote. It does not state exclusion cases (e.g., what to do if the quote is already sent or not a draft), but the core when-to-use is present.

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

record_paymentRecord a paymentAInspect

Record a payment against a finalized invoice. Defaults: amount = outstanding balance, date = today. Sets status to PAID or PARTIAL. No fiscal logic, it records what the user says was collected. Returns the invoice's new status, how much is now paid and still outstanding, and the payment id.

NameRequiredDescriptionDefault
notesNo
amountNoDefaults to the outstanding amount
methodNo
invoice_idYes
payment_dateNoYYYY-MM-DD, defaults to today
referencia_pagoNoWhere the money came from in the calling system (bank line id, Stripe payment_intent, receipt no.). Unique per tenant: a second call with the same reference is rejected instead of paying twice. Always pass it when booking automatically.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes further by disclosing the resulting status transitions (PAID vs PARTIAL), the defaulting behavior, the absence of fiscal computation, and the returned values. It does not mention the double-payment rejection surfaced only in the referencia_pago schema field, so it misses one meaningful behavioral guard.

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?

Four short sentences, front-loaded with the action and its precondition, then defaults, then side effects, then return shape. No filler and no repeated information.

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, and the description compensates by naming the return fields (new status, paid, outstanding, payment id). It covers the essential call contract for a low-risk mutation, but omits error/idempotency behavior for a tool that can record money twice.

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?

With 50% schema coverage, the description partially compensates by restating the amount and date defaults, but it adds nothing about method, notes, or the uniqueness semantics of referencia_pago. Of the six parameters, only one required field is implied by context; the description mostly repeats what the schema already says.

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 ('Record a payment against a finalized invoice') and adds a scoping constraint that separates it from siblings like list_payments or cancel_invoice. An agent can tell exactly what this tool does and to what object 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 Guidelines4/5

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

The 'against a finalized invoice' precondition tells the agent when this tool applies versus create_invoice/finalize_invoice, and 'No fiscal logic, it records what the user says was collected' sets the expectation that it won't compute taxes. There is no explicit exclusion (e.g. what to do for unfinalized invoices) or named alternative, so it falls short of a 5.

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

rectify_invoiceRectify invoice (Veri*factu)A
Destructive
Inspect

Create a rectificativa (factura rectificativa / abono / corrección) for a finalized invoice. This is a Veri*factu chain operation. Ask the user for explicit confirmation first, then call with confirm=true. It creates a DRAFT rectificativa that you review and finalize afterwards. Use negative amounts for a full credit. Returns the new rectificativa draft's id (and number, if already assigned).

NameRequiredDescriptionDefault
itemsYes
notesNo
confirmYesMust be true. Only after the user explicitly confirmed.
tax_rateNo
invoice_idYes
base_rectificadaNoTaxable base of the ORIGINAL invoice. Required when rectification_mode is S.
cuota_rectificadaNoTax amount of the ORIGINAL invoice. Required when rectification_mode is S.
rectification_modeNoI = por diferencias (only the delta), S = por sustitución (replaces the original). With S you MUST also pass base_rectificada and cuota_rectificada.I
rectification_typeNoAEAT reason class, goes into the Veri*factu record as given. R1 = art. 80.1/80.2/80.6 LIVA (the usual error case), R2 = art. 80.3 (insolvency), R3 = art. 80.4 (bad debt), R4 = other, R5 = corrective for a simplified invoice. Ask the user which case applies; do not infer it.R1
rectification_reason_codeNoOnly needed when the customer is a Spanish public administration (Facturae/FACe). Facturae has its OWN reason list, different from Veri*factu's R1-R5: 01-16 for formal errors, 80-85 for Art. 80 LIVA cases. Ask the user which applies, do not infer it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only tell the agent this is a destructive write; the description adds real context: a DRAFT is created rather than a finalized record, confirmation gating is mandatory, and the return value (new draft id, optional number) is disclosed. It stops short of stating whether the original invoice remains untouched or how the Veri*factu chain is affected, which is the main residual gap for a destructive tool.

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

Conciseness4/5

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

Five short sentences, front-loaded with the operation and followed by the mandatory confirmation gate and draft semantics; no filler. Slight redundancy with the schema on negative amounts costs it a point.

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 10-parameter destructive financial tool with no output schema, the description successfully covers the confirmation gating, draft lifecycle, credit convention, and return value. What it omits is downstream consequence — effect on the original invoice and the Veri*factu chain — which an agent would reasonably want before invoking.

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 60% and the schema already documents the hard parts (rectification_mode I/S with required base_rectificada/cuota_rectificada, R1-R5 meanings, Facturae reason codes, confirm=true). The description's only parameter guidance — negative amounts for full credit — restates the unit_price schema description, so it adds little beyond the structured fields.

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 (create) + resource (rectificativa/abono/corrección) + scope constraint (for a finalized invoice), with Spanish accounting terminology that maps the tool unambiguously against create_invoice/update_invoice. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Gives a concrete pre-call workflow (ask the user for explicit confirmation, then pass confirm=true) and a post-call expectation (draft to review and finalize), plus the rule for full credits via negative amounts. It does not explicitly name which sibling to use instead for non-finalized invoices, which keeps it at 4.

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

restore_bank_trashRestore bank movementsAInspect

Bring back all movements of one deletion (lote from list_bank_trash). Returns how many movements were restored.

NameRequiredDescriptionDefault
loteYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description only needs to add context. It does add two valuable facts: the unit of work is an entire deletion batch (no selective restore) and the response is a restored-movement count. It stays silent on permissions, partial-failure behavior, and whether the lote expires.

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 sentences with zero filler; the action and scope come first and the return value second.

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 one-parameter, no-output-schema tool, purpose, parameter provenance, and return value are all covered. Only edge-case behavior (irreversibility, partial failure) is missing, which is minor at this complexity.

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% and the single 'lote' parameter is a bare string, so the description must carry the meaning — and it does, tying 'lote' to a deletion batch obtainable from list_bank_trash. That is the key fact an agent needs to supply the value correctly.

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 (“bring back” = restore) and resource (all movements of one deletion batch), which is enough to distinguish it from any sibling. The word “bank” only appears in the name/title, not the description, so the resource is slightly less explicit than it could be.

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?

Points the agent at list_bank_trash as the source of the required 'lote', which is an implied prerequisite and a useful routing hint. It does not state when not to use it, whether a restore can be undone, or what happens if some movements still exist.

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

resubmit_invoice_aeatCorrect and resend Veri*factu record (subsanación)A
Destructive
Inspect

For an invoice whose Verifactu record the AEAT rejected or accepted with errors: sends a new correction record (Alta de subsanación, new link in the Verifactu chain) with the customer's CURRENT data. The invoice itself (number, date, amounts) does not change, so first fix what the AEAT flagged on the customer (update_customer), then call this. Per AEAT rules a subsanación is not possible when the cause requires a corrective invoice (rectify_invoice). Ask the user for explicit confirmation, then call with confirm=true. Returns the AEAT response status and message for the new subsanación record.

NameRequiredDescriptionDefault
confirmYesMust be true. Only after the user explicitly confirmed.
invoice_idYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare non-read-only and destructive behavior, and the description adds important context: a new Veri*factu chain link is created, invoice data itself does not change, customer data must be fixed first, confirmation is mandatory, and the AEAT response is returned. It does not fully spell out the fate of the prior rejected record or broader irreversibility, so it is strong but not exhaustive.

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

Conciseness5/5

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

The description is front-loaded with the triggering condition, then workflow, exception, confirmation, and return value. Every sentence adds useful information and there is no filler.

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

Completeness4/5

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

Given the destructive annotation and lack of an output schema, the description covers prerequisites, alternatives, confirmation, side effects, and return value well. The main remaining gap is the undocumented invoice_id parameter, which is only contextually implied.

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?

The invoice_id parameter has no schema description, and the description only implies it through 'For an invoice whose Veri*factu record...' without naming or constraining the parameter. The confirm parameter is fully described in the schema, and the description largely repeats that requirement rather than adding new parameter-level semantics.

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 names a specific action (sends a new correction record / Alta de subsanación) and resource (the rejected or error-accepted Veri*factu record), and explicitly distinguishes it from update_customer and rectify_invoice. An agent can identify the operation without opening the schema.

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

Usage Guidelines5/5

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

It states exactly when to use it: when AEAT rejected or accepted with errors, after fixing customer data via update_customer. It also states when not to use it: when the cause requires a corrective invoice, directing the agent to rectify_invoice. Confirmation requirements are explicit.

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

send_invoiceSend invoice by emailA
Destructive
Inspect

Email a finalized invoice to the customer with the PDF attached (Veri*factu QR included). This is the first send (envío inicial), for chasing an unpaid invoice afterwards use send_reminder instead. Requires the customer to have an email on file (update_customer if not). Returns the invoice number and the address(es) it was sent to. Already sent it yourself through another channel, use mark_invoice_sent instead of this tool.

NameRequiredDescriptionDefault
messageNoOptional custom email body; a plain default is used otherwise
invoice_idYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the external-side-effect profile is partly covered; the description adds real value by disclosing the attachment contents, the prerequisite data requirement, and the returned values. What it does not do is explain why the call is destructive — that the email cannot be recalled once sent — which is the main behavioral risk an agent should weigh.

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 sentences, each doing distinct work — action, alternative routing, prerequisite, return value. The primary action and its sibling boundary are front-loaded, and there is 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, the description compensates by stating the return (invoice number and destination addresses), and it covers prerequisites, alternatives, and attachment content. The remaining gap is failure/edge behavior — what happens if the invoice is not finalized or the send fails — which an agent would have to discover at call time.

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 50%: message is documented inline but invoice_id carries no schema description. The description partly compensates by saying the invoice must be "finalized," implying a state constraint on invoice_id that the schema omits, but it never mentions the optional custom message body or what happens to the default.

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 ("Email a finalized invoice to the customer") plus the payload (PDF with Veri*factu QR). It also explicitly names the scope as the first send, which separates it from send_reminder and mark_invoice_sent 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 Guidelines5/5

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

Names two sibling alternatives and the exact condition that selects each: send_reminder for chasing an unpaid invoice, mark_invoice_sent if the user already sent it through another channel. It also states the prerequisite (customer must have an email on file) and points to update_customer to fix it.

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

send_quoteSend a quote by emailA
Destructive
Inspect

Email a quote (presupuesto) to its customer with the PDF attached, using the tenant's own 'presupuesto' template and signature. A quote still in draft moves to sent; an accepted or rejected one keeps its status. Returns the recipient address and the resulting status.

NameRequiredDescriptionDefault
messageNoOptional body; omit to use the tenant's template
quote_idYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and openWorldHint=true; the description goes further by disclosing the exact state change (draft→sent, accepted/rejected unchanged), the fact that the PDF is attached with the tenant template and signature, and the returned values. It doesn't address irreversibility of the send or failure cases, which is the remaining gap for a destructive/open-world 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: purpose and mechanism first, state semantics second, return values last. No filler and nothing 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?

With no output schema, the description usefully states what comes back (recipient address and resulting status). For a destructive, open-world email action it could still mention failure modes or that sending is not undoable.

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 50%: 'message' is documented in the schema, 'quote_id' is not. The description compensates partially by explaining which quote states are meaningful, but adds no detail on the id itself (format, lookup, error behavior) beyond what the schema shows.

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 (email a quote with PDF attached) and the mechanism (tenant's own 'presupuesto' template and signature). It implicitly separates itself from mark_quote_sent via the status-transition note, but never names that sibling, so differentiation is inferred rather than explicit.

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

Usage Guidelines3/5

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

The context of use (deliver a quote to its customer) is clear, and the state rule tells the agent that draft quotes will be moved to sent while accepted/rejected ones keep their status. However, no alternative is named and no exclusions or prerequisites (e.g. quote must have a customer email) are given.

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

send_reminderSend payment reminderA
Destructive
Inspect

Send a payment reminder email (recordatorio / aviso de pago) to the customer of an unpaid invoice. tone: friendly, neutral or final. This sends a real email. Returns how many reminders have now been sent on this invoice in total.

NameRequiredDescriptionDefault
toneNoneutral
invoice_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag this as non-read-only, destructive, and open-world, but the description adds a crucial practical warning: 'This sends a real email.' That goes beyond the structured safety hints and is exactly the kind of side effect an agent needs to see. It stops short of describing permissions or irreversibility of the sent email.

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 compact sentences with the side-effect warning front-loaded, the tone options listed efficiently, and the return value summarized in one clause. No filler or repetition.

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, the description correctly explains what is returned (total reminders sent on the invoice). For a two-parameter tool, it covers the essential context well. The only shortfall is that it does not expand on tone semantics or possible error conditions, which would be useful given 0% schema description coverage.

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 carry more weight. It clarifies the invoice_id context (unpaid invoice) and enumerates tone values, but the schema already defines the tone enum and default. It does not explain what each tone means behaviorally (e.g., escalation or final notice consequences), leaving a gap that a low-coverage schema does not fill.

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 (send a payment reminder email) and scopes it precisely to the customer of an unpaid invoice. It is clearly distinguishable from siblings like send_invoice or mark_invoice_sent without opening 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 description implies a clear precondition (the invoice must be unpaid) and exposes the tone choices, giving the agent enough context to decide when this tool applies. It does not name alternatives or explicitly state exclusions, such as not using it for paid or cancelled invoices, so it falls short of a 5.

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

set_invoice_defaultsSet invoice defaultsA
Destructive
Inspect

Set the tenant defaults for new invoices: payment term in days and IVA rate (plazo de pago por defecto / tipo de IVA por defecto). Pure data storage: contix does not judge whether a term or rate is fiscally correct. Pass only the field you want to change. Returns the updated payment term, IVA rate and retención field visibility.

NameRequiredDescriptionDefault
tax_rateNodefault IVA percentage, e.g. 21
payment_daysNodays until due date; 0 = due on issue (contado)
hide_retentionNotrue hides the IRPF retention field (retención) in the web forms; display only, a rate above 0 always stays visible. The user decides, contix never derives it from the legal form.

TDQS

A3.6/5.0
Behavior3/5

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

Adds real context beyond annotations: partial-update semantics ('pass only the field you want to change'), the fact that no fiscal validation is performed, the display-only nature of hide_retention, and the return payload. However, annotations declare destructiveHint=true and the description never addresses destructiveness — it does not say the previous defaults are overwritten or whether already-created invoices are unaffected, which is exactly what an agent needs before calling a destructive tool.

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

Conciseness4/5

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

Front-loaded purpose sentence followed by two short behavioral clauses and a return statement; every sentence adds information. The bilingual parentheticals cost some length but are justified for user-terminology matching.

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, and the description compensates by stating what is returned (payment term, IVA rate, retención visibility). Scope and partial-update behavior are covered; the only material gap is the unaddressed destructive/overwrite consequence of changing tenant-wide defaults.

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 100%, so the baseline is 3, but the description adds the non-obvious partial-update contract and Spanish field aliases (plazo de pago por defecto / tipo de IVA por defecto) that help map user terminology to the English parameter names. The hide_retention caveat is also restated in the description's return sentence.

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 with scope: 'Set the tenant defaults for new invoices', then names the exact fields (payment term in days, IVA rate). It does not name the obvious counterpart get_invoice_defaults, so an agent must infer the read/write split from the verb alone.

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 'tenant defaults for new invoices' framing and the 'pass only the field you want to change' instruction, but there is no explicit when-to-use, when-not, or reference to get_invoice_defaults for reading current values. Nothing warns the agent that this overwrites tenant-wide settings rather than per-invoice values.

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

set_invoice_displaySet invoice display optionsAInspect

Change how invoice PDFs are printed. iva_display: IVA columns per line (ninguno = none, porcentaje = rate, porcentaje_cuota = rate + amount, porcentaje_total = rate + line total with IVA, auto = rate only when the invoice mixes rates). show_contix_badge: false hides the small 'Factura creada con contix.' note (on by default). header_phone / header_whatsapp: printed in the invoice header with an icon, empty string removes the line. Display only, no tax logic. Pass only what changes. Returns the updated display settings.

NameRequiredDescriptionDefault
iva_displayNo
header_phoneNo
header_whatsappNo
show_contix_badgeNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations are sparse, so the description usefully adds that this affects only display, does not alter tax logic, that empty strings remove header lines, and that the updated settings are returned. It does not cover permissions or side effects beyond display changes, but the key behavioral boundaries are clear.

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 dense but front-loaded with the core purpose and then organized parameter by parameter. It is appropriately sized for four undocumented parameters, though the long iva_display parenthetical could be slightly easier to scan.

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 output schema and 0% schema description coverage, the description is nearly complete: it explains scope, parameter effects, and return behavior. It could be stronger by explicitly naming when to prefer sibling tools.

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 carries the full burden and does so well. It explains every parameter: all iva_display enum meanings, the badge default and hiding behavior, and that empty header values remove the printed line.

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 clearly states the specific verb and resource: changing how invoice PDFs are printed/displayed. It distinguishes display-only behavior from tax logic, though it does not explicitly differentiate from nearby siblings such as get_invoice_display or set_invoice_defaults.

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 useful context: display only, no tax logic, and 'Pass only what changes'. However, it does not explicitly state when to use this instead of get_invoice_display, set_invoice_defaults, or set_invoice_footer.

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

set_invoice_seriesSet invoice series/numberingA
Destructive
Inspect

Set the invoice numbering series (serie / numeración / prefijo / formato / número inicial). number_format is a template: {PREFIJO} (required), {AAAA} or {AA} (year, OPTIONAL), {NNNN} (number, count of N = zero padding). WITHOUT a year token the counter runs continuously across years (Zoho style, e.g. '{PREFIJO}-{NNNN}' -> F-0158). Use start_number to continue numbering from a previous program ('quiero seguir en el número 15'). Changing prefix or format opens a NEW series (the old one stays closed and correlative). The start number is only accepted while that series cycle has no finalized invoice: Veri*factu forbids gaps. Prefixes R and S are reserved. Returns the updated format and the next invoice number preview. This sets invoice numbering only; quote numbering is separate, see set_quote_series.

NameRequiredDescriptionDefault
start_numberNothe NEXT invoice gets this number
number_formatNotemplate, e.g. '{PREFIJO}-{AAAA}-{NNNN}' (yearly reset) or '{PREFIJO}-{NNNN}' (continuous, no year)
invoice_prefixNo1-10 alphanumeric chars, starts with a letter (e.g. F, FA, FRA)

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as destructive, and the description adds meaningful consequences beyond that: changing the prefix or format closes the old series, start_number is rejected once a finalized invoice exists because Veri*factu forbids gaps, and R/S prefixes are reserved. It also states what the return value previews.

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?

The description is front-loaded with the core action, then layers in template semantics, side effects, and the quote-series alternative. Despite its length, every sentence carries operational information needed to avoid numbering mistakes.

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 destructive mutation tool with three optional parameters and no output schema, the description covers purpose, template semantics, side effects, constraints, and return preview. Nothing an agent needs in order to invoke it safely appears to be 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 100%, so the baseline is 3, but the description adds substantial meaning beyond the schema: it explains the template tokens, year-token behavior, continuous vs yearly numbering, and the restriction on when start_number is accepted. The invoice_prefix parameter is only partially enriched via the reserved-prefix rule.

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 states a specific verb and resource: setting the invoice numbering series. It also distinguishes the tool from quote numbering by explicitly pointing to set_quote_series, so an agent can route correctly without opening schemas.

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

Usage Guidelines5/5

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

It gives explicit usage context: use start_number to continue from a previous program, changing prefix or format opens a new series, and quote numbering is handled by a separate sibling tool. The alternative and relevant conditions are named directly.

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

set_product_groupsSet product groupsA
Destructive
Inspect

Replace the account's list of product groups (max 30 names, 50 chars each). Existing invoices keep the name they carry; removing a group changes no invoice. Returns the saved list of group names.

NameRequiredDescriptionDefault
product_groupsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, and the description usefully scopes that destructiveness: it only affects the group list, existing invoices retain their names, and removal changes no invoice. It also discloses the return value, which annotations alone cannot convey. Minor gap: no mention of permissions or whether an empty list clears all groups.

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 short sentences, front-loaded with the action, followed by behavioral caveats and the return value. No wasted words; each sentence adds distinct information.

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, but the description states the return value (the saved list of group names), and it clarifies the blast radius of the destructive replacement. It is nearly complete for a one-parameter mutation, missing only edge-case guidance such as empty-list semantics or deduplication.

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 carry meaning for the single parameter. It explains that the input is a list of group names and notes the max 30 names / 50 chars each limits, which mirror but reinforce the schema constraints. It does not address ordering, duplicates, or empty-array behavior.

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: 'Replace the account's list of product groups'. This is clearly distinct from the read-only sibling get_product_groups, and the replace semantics are unambiguous.

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 makes clear this is a full replacement ('Replace the account's list'), implicitly routing reads to get_product_groups, and adds the crucial reassurance that removing a group does not alter existing invoices. It does not explicitly name the alternative tool or exclusions, keeping it just below a 5.

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

set_quote_seriesSet quote start numberAInspect

Set the first number of the quote series (e.g. 2299 to continue from another program). Numbers are max(start, last+1), so a start below existing quotes never causes duplicates. null resets to 1. Returns the next quote number after the change. This sets quote numbering only; invoice numbering is separate, see set_invoice_series.

NameRequiredDescriptionDefault
start_numberYes

TDQS

A5/5.0
Behavior5/5

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

Annotations only declare it is non-read-only and non-destructive; the description adds substantial behavior beyond that – the max(start, last+1) rule, the guarantee against duplicates, null semantics, and the return value. This is exactly the extra context an agent needs for 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.

Conciseness5/5

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

Four dense sentences with zero filler; the core purpose is front-loaded and the caveat plus alternative follow in logical order.

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?

Complete for a single-parameter mutation with no output schema: it covers what changes, edge cases (null, values below existing quotes), the return value, and the boundary with the sibling tool.

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 carries the full burden: it defines what start_number means, how it interacts with existing quotes, and that null resets to 1, compensating fully for the bare 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 precise verb and resource ('Set the first number of the quote series') and immediately scopes the function (quote numbering only, not invoices). An agent can distinguish it from set_invoice_series 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?

Gives a concrete usage scenario ('2299 to continue from another program'), explains the null reset case, and explicitly routes to the alternative set_invoice_series for invoice numbering.

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

submit_invoice_to_faceSubmit invoice to FACe (B2G)A
Destructive
Inspect

Sign a finalized invoice with XAdES-EPES and submit it to FACe, the Spanish government invoicing gateway, returning the número de registro. Requires the customer to be marked as public administration with its three DIR3 codes, and a digital certificate uploaded in settings (the same one Verifactu uses). An invoice already registered is never submitted twice. Live submission is additionally gated per account; test environment otherwise.

NameRequiredDescriptionDefault
emailNoAddress FACe sends status updates to; the account email is used otherwise
confirmYesMust be true. Only set after the user explicitly confirmed the submission to the administration.
invoice_idYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and openWorldHint=true, and the description adds substantial context beyond them: external government submission, certificate dependency, idempotency ('never submitted twice'), per-account live gating with test-environment fallback, and the returned registration number. An agent knows the blast radius, the auth prerequisites, and the sandbox behavior before calling.

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

Conciseness5/5

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

Four tight sentences: the action and return value come first, then prerequisites, then idempotency, then environment gating. No sentence repeats the schema or annotations, and 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?

There is no output schema, but the description names the return value (número de registro). Prerequisites, idempotency, environment behavior, and the external-system nature are all covered, which is what an agent needs for a destructive, open-world submission 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 coverage is 67%: confirm and email are already documented in the schema, including the explicit-confirmation requirement, which the description merely reinforces. invoice_id is undocumented in the schema and the description only implies it must reference a finalized invoice, so it does not fully compensate for the 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 chain (sign with XAdES-EPES, submit) and the exact resource (FACe, the Spanish government invoicing gateway), plus the return value (número de registro). This clearly separates it from siblings like send_invoice, mark_invoice_sent, and get_face_status.

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?

Explicit preconditions are given: the invoice must be finalized, the customer must be flagged as public administration with three DIR3 codes, a digital certificate must be uploaded, and live submission must be enabled for the account (test environment otherwise). It does not name sibling alternatives such as get_face_status for status checks or send_invoice for non-B2G delivery, so the routing guidance is implicit rather than explicit.

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

update_customerUpdate customerC
Destructive
Inspect

Update fields of an existing customer (cliente). Only the fields you pass are changed. Returns the updated customer's id and name.

NameRequiredDescriptionDefault
nifNo
cityNo
emailNo
notesNointernal notes about the customer
phoneNo
countryNo
email_ccNoAdditional recipients, replaces the whole list. Max 5.
provinceNo
customer_idYes
no_email_ccNoCollective customer: setting it clears the additional recipients and keeps the Zoho sync from refilling them.
postal_codeNo
company_nameNo
contact_nameNo
address_line1No
address_line2No
recipient_typeNokind of recipient, as the user states it; drives the Veri*factu recipient block and Modelo 347/349 assignment
is_public_adminNoTrue if the customer is a Spanish public administration (school, ayuntamiento, university). Enables Facturae/B2G invoicing. Requires the three DIR3 codes below.
dir3_organo_gestorNoDIR3 code of the Órgano Gestor. Provided by the administration.
default_product_groupNoProduct group new invoices of this customer get when create_invoice is called without one. Must be a name from get_product_groups; empty string clears it.
dir3_oficina_contableNoDIR3 code of the Oficina Contable, e.g. L01410950. Provided by the administration.
dir3_unidad_tramitadoraNoDIR3 code of the Unidad Tramitadora. Provided by the administration.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true; the description adds partial-update semantics ('only the fields you pass are changed') and a return shape, which is genuinely useful. However, it does not explain why a field update is destructive (e.g. email_cc replacing the whole list, no_email_cc clearing recipients, empty string clearing default_product_group) or note permission/irreversibility concerns.

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?

Three short, front-loaded sentences with no filler; the partial-update rule and return value arrive immediately. Slight under-specification rather than verbosity is the issue.

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 21-parameter mutation with 43% schema coverage and no output schema, the description is thin: it covers what happens to omitted fields and the response payload, but omits the destructive consequences, required customer_id, and the cross-tool dependencies of several parameters.

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 only 43%, so the description is expected to compensate, yet it names zero parameters beyond the return fields. Critical semantics for the 21 parameters — recipient_type enum effects, DIR3 requirements tied to is_public_admin, default_product_group needing get_product_groups — are left entirely to the 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?

Specific verb+resource ('Update fields of an existing customer') and the '(cliente)' synonym helps match the Spanish domain term. It implicitly distinguishes itself from create_customer and update_expense, but never names a sibling, 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 Guidelines2/5

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

No when-to-use / when-not-to-use guidance and no routing to alternatives like create_customer (new records), update_invoice, or get_customer (read-only). The only usage-adjacent content ('only the fields you pass are changed') is a behavioral trait, not selection guidance.

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

update_expenseEdit expenseA
Destructive
Inspect

Edit an existing expense (gasto) by id. Only the fields you pass are changed. Gastos are not part of the Verifactu chain, so editing is safe. Use list_expenses to find the id. Returns the updated expense's id, description and total.

NameRequiredDescriptionDefault
notesNo
totalNo
categoryNoexpense category slug (see web app)
subtotalNo
tax_rateNo
tax_linesNoOnly for a receipt carrying MORE THAN ONE VAT rate (e.g. a Correos ticket: 21% on postage, exempt on the stamp). One entry per rate. When given, subtotal/tax_amount/tax_rate/total are derived from it, do not compute them yourself. Passing a list REPLACES the existing blocks; an empty list removes them. Leave it out to keep them unchanged.
expense_idYesexpense id from list_expenses
tax_amountNo
descriptionNo
supplier_idNoexisting supplier id from list_suppliers
invoice_dateNoYYYY-MM-DD
supplier_nifNosupplier NIF/CIF/VAT as printed on the document
is_deductibleNofalse keeps the expense out of the deductible totals entirely
supplier_nameNosupplier (proveedor) name, matched against existing suppliers by NIF or name, created if new
invoice_numberNo
reverse_chargeNoinversión del sujeto pasivo, as stated by the user
supplier_countryNosupplier country, ISO-2 (ES, FR, DE...). Drives Modelo 349 intra-EU acquisitions
deductible_percentNoporcentaje imputable: share of this expense (0-100) the user allocates to the business, e.g. a shared car or a home office. Enter the FULL receipt amounts in subtotal/tax_amount/total and the percentage here, not pre-reduced amounts; the IVA and income-tax modelos count only that share. Default 100. Use only a percentage the user states, contix never proposes one.
reverse_charge_typeNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already flag the write/destructive nature, so the description correctly focuses on what annotations can't convey: partial-update behavior, the fact that edits do not touch the Verifactu chain, and the returned fields. That is genuinely useful context beyond the schema. Minor gap: no mention of permission requirements or reversal options.

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?

Four short sentences, front-loaded with the core action and no filler. The safety note and return-value sentence each earn their place. The only slight redundancy is the parenthetical "(gasto)" translation.

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 19-parameter mutation with no output schema, the description covers the essentials: partial-update behavior, id sourcing, side-effect safety, and the shape of the return value. Given the rich per-parameter schema descriptions, remaining gaps (permissions, failure modes) are minor.

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 58%, so a baseline of 3 applies. The description adds the key cross-parameter semantic (only supplied fields change), but contributes no detail on the tax-heavy parameters (tax_lines, deductible_percent, reverse_charge) that the schema already documents.

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 (edit) and resource (expense/gasto), plus a scope qualifier: only passed fields change, and it returns id/description/total. Sibling relationships are implied (list_expenses for ids, edit vs create/delete by name) rather than explicitly differentiated.

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 a prerequisite ("Use list_expenses to find the id") and clarifies partial-update semantics, which helps an agent call it correctly. But it never says when to choose this over create_expense, delete_expense, or the gestoria expense tools, 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.

update_invoiceUpdate draft invoiceA
Destructive
Inspect

Edit an existing DRAFT invoice (borrador): items, prices, customer, dates, tax/retention rates or notes. Only DRAFT invoices can be edited, a finalized invoice is immutable, use rectify_invoice instead. Only the fields you pass are changed, EXCEPT items: passing items REPLACES the full line-item list (pass all lines you want to keep, not just the changed one). Returns the updated draft's id and new total.

NameRequiredDescriptionDefault
itemsNoReplaces ALL line items when provided.
notesNo
due_dateNoYYYY-MM-DD
tax_rateNo
invoice_idYes
issue_dateNoYYYY-MM-DD
referenciaNoShort human reference shown on the PDF and searchable in the invoice list. Pass an empty string to clear it.
customer_idNo
numero_pedidoNoPurchase order / commitment number of a public customer (Facturae ReceiverTransactionReference). Can still be set on a FINALIZED invoice as long as it was not submitted to FACe. Empty string clears it.
product_groupNoProduct group from get_product_groups. Pass an empty string to clear it.
retention_rateNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, it discloses that finalized invoices are immutable, that only passed fields change except for items, and that items completely replace the line-item list. It also states what the tool returns, giving the agent mutation and response context.

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?

The description is front-loaded with the draft-only constraint and alternative tool, then covers mutation semantics and return values. Every sentence carries actionable information with no wasted wording.

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 an 11-parameter mutation tool with no output schema, it provides the essential constraints: draft-only editing, the rectify_invoice alternative, full replacement semantics for items, and what is returned. That is enough for an agent to call it correctly.

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

Parameters4/5

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

The description adds crucial semantics for the items parameter, especially that it replaces the full line-item list rather than patching individual lines. Schema coverage is moderate at 55%, and the description covers major editable field categories but does not explain every parameter such as referencia, numero_pedido, or product_group.

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 states a specific verb and resource: editing an existing DRAFT invoice, enumerating editable fields and scope. It clearly distinguishes this tool from rectify_invoice by naming that sibling and the condition that selects it.

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 explicitly says when to use this tool (DRAFT invoices only) and when not to (finalized invoices, where rectify_invoice should be used instead). The alternative route is named 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.

update_quoteUpdate quoteA
Destructive
Inspect

Change a quote that is still draft or sent: customer, dates, rates, notes, or the whole list of items (items replaces all lines). Only the fields you pass change. Returns the quote number and new total.

NameRequiredDescriptionDefault
itemsNo
notesNo
quote_idYes
tax_rateNo
issue_dateNoYYYY-MM-DD
customer_idNo
valid_untilNoYYYY-MM-DD
retention_rateNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag write + destructive, and the description reinforces that with the crucial 'items replaces all lines' warning and the patch semantics ('Only the fields you pass change'). It also discloses the return payload (quote number and new total), which matters since there is no output schema. Missing only permission/auth context and confirmation 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?

Three tight sentences, front-loaded with the operation and its precondition, then the destructive caveat, then the return value. 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 8 params, no output schema and sparse schema descriptions, the definition supplies the field mapping, the items replacement rule and the return shape, which is nearly everything an agent needs. It would be complete at 5 with a note on permissions or behavior when the quote is not in draft/sent state.

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 only 25%, so the description must compensate, and it does: it maps the prose field list (customer, dates, rates, notes, items) onto customer_id, issue_date/valid_until, tax_rate/retention_rate, notes and items. The important replace-vs-merge ambiguity for items is resolved explicitly. Sub-field formats inside items and rate units (integer percent vs absolute) remain undocumented.

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 (change a quote) and enumerates the mutable fields — customer, dates, rates, notes, items — so the agent knows exactly what surface this tool touches. It does not explicitly contrast with create_quote or update_invoice, but the draft/sent status scoping already separates it from most siblings.

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?

'Change a quote that is still draft or sent' gives a clear precondition for when the tool applies. It stops short of naming alternatives (e.g. what to do for accepted or converted quotes), so exclusion handling is implied rather than stated.

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

update_recurringUpdate recurring profileAInspect

Change a recurring invoice profile (factura recurrente): start or pause the series (is_active), the next or end date, automation flags, payment term, name or reference. Setting is_active=true starts the series: only do it after the user confirmed the start date and frequency, because from then on invoices are finalized and emailed to the customer without a further click. If next_invoice_date is today or earlier, call generate_recurring right after to issue the first invoice now. Pass only the fields to change. Returns the profile's state, next invoice date and whether it sends by email.

NameRequiredDescriptionDefault
nameNo
notesNo
end_dateNoYYYY-MM-DD
auto_sendNo
is_activeNotrue = series running, false = draft/paused
profile_idYes
descriptionNoReferencia, max 200
payment_daysNo-2 fin de mes, -3 fin del mes siguiente, else days
auto_finalizeNo
next_invoice_dateNoYYYY-MM-DD

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries real weight and delivers it: activating the series causes invoices to be finalized and emailed to the customer with no further click. It also discloses what the call returns, which no output 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?

Front-loads the verb and resource, then the highest-risk behavioral warning, then the follow-up tool call, then the patch rule and return values. Every sentence is doing work; nothing is redundant with the schema or annotations.

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

Completeness4/5

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

With 10 parameters, 50% schema coverage, no output schema and a mutation that has external side effects, the description covers the dangerous paths and the return shape. The remaining gap is the silent behavior of the automation flags (auto_send, auto_finalize) and notes, which an agent must 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 50%, and the description compensates for the most consequential fields by explaining the is_active true/false meaning and the follow-up behavior of next_invoice_date, plus naming payment term, name and reference as editable. It leaves notes, auto_send and auto_finalize unexplained, which are still undocumented in both places.

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 ('Change a recurring invoice profile') and immediately names the concrete editable facets (is_active, next/end date, automation flags, payment term, name/reference). This is clearly distinguishable from create_recurring, list_recurring and generate_recurring, which appear as 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?

Gives explicit when-to-use conditions: setting is_active=true only after the user confirms start date and frequency, and calling generate_recurring right after when next_invoice_date is today or earlier. It also states the patching convention ('Pass only the fields to change'), which prevents accidental overwrites.

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

validate_ibanValidate an IBANA
Read-only
Inspect

Check whether an IBAN is well formed: country length (SWIFT IBAN registry) and ISO 13616 check digits. For Spanish IBANs also the two account check digits (DC) and the bank (entidad) with its BIC from the Banco de España registry. A 20-digit Spanish account number (CCC) is converted to its IBAN. Pure arithmetic: it does NOT confirm that the account exists or who owns it.

NameRequiredDescriptionDefault
ibanYesIBAN or 20-digit Spanish account, spaces allowed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantive behavior: it is pure arithmetic against registry data, it discloses which registries are consulted (SWIFT, Banco de España), and it explicitly caps its own guarantees by saying it does not verify account existence or ownership. That last point is exactly the kind of limitation an agent needs and is not available anywhere in the structured fields.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the core check and then narrowing to the Spanish-specific behavior and the limitation. Every clause carries information; nothing is restated from the name or title.

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-parameter, read-only validation tool, the description covers inputs, checks performed, and limits. The only gap is that, with no output schema, it never indicates the shape of the result (e.g., valid/invalid plus reasons), which an agent may need to interpret the response.

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 100%, so baseline is 3. The description goes beyond the schema by clarifying that a 20-digit Spanish account (CCC) is accepted and internally converted to its IBAN, and that spaces are tolerated, which disambiguates the single parameter's accepted inputs.

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 (validate/check) and resource (IBAN), then enumerates exactly which checks are performed: SWIFT country length, ISO 13616 check digits, and Spanish DC/entidad/BIC. This is clearly distinct from siblings like check_vat_number, 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?

The description gives a clear context of use (well-formedness validation) and draws an explicit boundary: it does NOT confirm the account exists or who owns it. It also notes the CCC-to-IBAN conversion path. It stops short of naming alternatives or stating when-not-to-use conditions, so it is strong but not fully routing-aware.

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

validate_spanish_tax_idCalculate/validate a Spanish DNI, NIE or CIF check characterA
Read-only
Inspect

Two modes in one input. If valor is only 1-8 digits, computes the DNI check letter and returns the full 8-digit-plus-letter DNI (digits are left-padded with zeros). If valor is a full document, validates its check character: DNI (8 digits + letter), NIE (X/Y/Z + 7 digits + letter) or CIF (entity letter + 7 digits + check digit or letter, with the entity type per Orden EHA/451/2008). Tolerates spaces, dots, dashes and an ES prefix. Pure arithmetic: it does NOT confirm the document exists, is active or belongs to the person who gave it. In validation mode, returns valido (true/false) and, when it does not match, the correct check character (letra_correcta / control_correcto).

NameRequiredDescriptionDefault
valorYes1-8 digits, or a full DNI/NIE/CIF

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses critical behavior: it is pure arithmetic and does NOT confirm document existence, active status, or ownership. It also describes the return values in validation mode, including valido and corrected check characters.

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?

The description is dense but front-loaded with 'Two modes in one input,' then systematically covers calculation, validation, format tolerance, limitations, and return values. Every sentence carries useful information and there is no redundant filler.

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 single-parameter validation tool with no output schema, the description fully equips an agent to call it correctly: it explains the two modes, accepted input formats, scope limitations, and expected validation responses. Nothing essential 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 100%, so the baseline is 3, but the description adds meaningful semantics for the single `valor` parameter: accepted formats, left-padding behavior, and the distinction between numeric-only and full-document input. It could be even stronger by detailing CIF entity-letter rules, but it already adds substantial value 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?

The description states a specific verb (calculate/validate) and resource (Spanish DNI, NIE, CIF check character), and immediately explains the two input modes. It is clearly distinguishable from siblings like validate_iban or check_vat_number.

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 gives clear usage context by explaining that 1-8 digits triggers DNI calculation while a full document triggers validation, and notes formatting tolerance. It does not explicitly compare against sibling validation tools such as check_vat_number, so it falls short of a 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Addedget_referral_link
  2. 2 tool updates
    • Changedcreate_recurring4 fields changed
      • changedInput schema / properties / auto_send / default
        Previous value: -falseNew value: +true
      • changedInput schema / properties / auto_send / description
        Previous value: -"Auto-email the customer when generated"New value: +"Email the customer automatically when generated (only once the series is active)"
      • changedInput schema / properties / is_active / default
        Previous value: -trueNew value: +false
      • addedInput schema / properties / is_active / description
        Added value: +"Leave false (draft) unless the user has already confirmed the start; see update_recurring"
    • Addedupdate_recurring
  3. 1 tool update
    • Addedattach_expense_receipt
  4. 78 tool updates
    • First observedcalculate_modelo_303
    • First observedcalculate_vat
    • First observedcancel_invoice
    • First observedcheck_period
    • First observedcheck_vat_number
    • First observedclone_invoice
    • First observedconvert_quote_to_invoice
    • First observedcreate_customer
    • First observedcreate_expense
    • First observedcreate_invoice
    • First observedcreate_quote
    • First observedcreate_recurring
    • First observeddelete_bank_transactions
    • First observeddelete_expense
    • First observeddelete_invoice
    • First observedfinalize_invoice
    • First observedgenerate_recurring
    • First observedgestoria_abrir_mandante
    • First observedgestoria_certificado_mandante
    • First observedgestoria_cierre_config
    • First observedgestoria_cierre_configurar
    • First observedgestoria_cierre_vista_previa
    • First observedgestoria_comisiones
    • First observedgestoria_export
    • First observedgestoria_facturas_mandante
    • First observedgestoria_gastos_mandante
    • First observedgestoria_invitar_mandante
    • First observedgestoria_listar_mandantes
    • First observedgestoria_resumen_mandante
    • First observedgestoria_revision_mandante
    • First observedget_account_statement
    • First observedget_customer
    • First observedget_face_status
    • First observedget_invoice
    • First observedget_invoice_defaults
    • First observedget_invoice_display
    • First observedget_invoice_facturae
    • First observedget_invoice_footer
    • First observedget_invoice_series
    • First observedget_libros_registro
    • First observedget_modelo
    • First observedget_obligation_dates
    • First observedget_product_groups
    • First observedget_quote_series
    • First observedget_subscription_status
    • First observedinvite_gestoria
    • First observedlist_bank_imports
    • First observedlist_bank_trash
    • First observedlist_customers
    • First observedlist_expenses
    • First observedlist_invoices
    • First observedlist_payments
    • First observedlist_quotes
    • First observedlist_recurring
    • First observedlist_reminders_sent
    • First observedlist_suppliers
    • First observedmark_invoice_sent
    • First observedmark_quote_sent
    • First observedrecord_payment
    • First observedrectify_invoice
    • First observedrestore_bank_trash
    • First observedresubmit_invoice_aeat
    • First observedsend_invoice
    • First observedsend_quote
    • First observedsend_reminder
    • First observedset_invoice_defaults
    • First observedset_invoice_display
    • First observedset_invoice_footer
    • First observedset_invoice_series
    • First observedset_product_groups
    • First observedset_quote_series
    • First observedsubmit_invoice_to_face
    • First observedupdate_customer
    • First observedupdate_expense
    • First observedupdate_invoice
    • First observedupdate_quote
    • First observedvalidate_iban
    • First observedvalidate_spanish_tax_id

Publisher details

Operator
Martin Schenk S.L. (contix), Madrid, Spain · Publisher source
Operator website
https://contix.es
Vendor relationship
First-party
Trust center
Not available
Restrictions
Needs a contix account (paid subscription after a 30-day trial). Sign in with OAuth 2.1 (dynamic client registration) or an API key from the contix panel. The free tools server es.contix/herramientas needs no account.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to issue, correct, and register legally compliant Spanish electronic invoices with AEAT VeriFactu, supporting F1/F2 types, R1–R5 correctives, and NIF validation from Claude, ChatGPT, Cursor, or VS Code.
    131
    125 npm
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to interact with Quipu accounting data via natural language, including invoicing, expenses, contacts, and Spanish VAT reporting.
    18
    263 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides access to official Spanish fiscal data and tools based on AEAT and BOE sources, covering income tax, VAT, and regional deductions. It enables AI assistants to answer tax-related queries and verify filing deadlines using verified information.
    10
    12 npm
    13
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 450+ tools for Spanish businesses to handle invoicing, purchases, catalog, tax filings, time tracking, and automations via natural language in MCP clients.
    297 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources