Skip to main content
Glama
Frihet-io

Frihet MCP Server

by Frihet-io

Distribution

Channel

Status

Install

npm

Live

npx @frihet/mcp-server

Remote endpoint

Live

https://mcp.frihet.io/mcp (zero install, OAuth or API key)

Smithery

Live

smithery.ai/servers/frihet/frihet-mcp

MCP Registry

Live

registry.modelcontextprotocol.io

Glama

Live

glama.ai/mcp/servers/Frihet-io/frihet-mcp

mcp.so

Auto-index (unverified)

mcp.so — indexes from npm + GitHub

PulseMCP

Auto-index (unverified)

pulsemcp.com — indexes from npm + GitHub

Cursor Marketplace

Coming soon

cursor.com/marketplace

ChatGPT Apps

Coming soon

chatgpt.com

Anthropic Claude Directory

Coming soon

claude.ai/settings/connectors

Surface truth: the catalogue contains 158 canonical operations. The local full profile serves 163 tool names, 11 resources, and 10 prompts (158 canonical operations plus 5 fiscal aliases). The hosted grouped profile serves 166 tool names, 7 resources, and 10 prompts (the same names plus 3 discovery tools, with API-backed resources kept local-only). The separately reviewed OpenAI profile serves 33 tool names, 0 resources, and 0 prompts. Catalogue membership is not a promise that a backing API is enabled for every workspace.


Related MCP server: Finizi B4B MCP Server

What is this

An MCP server that connects your AI assistant to Frihet. Create invoices by talking. Query expenses in natural language. Manage your entire business from your IDE.

You:     "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/hour, due March 1st"
Claude:  Done. Invoice INV-2026-089 created. Total: 3,000.00 EUR + 21% IVA = 3,630.00 EUR.

158 canonical operations. Five fiscal aliases. Ten prompts. The local package serves 11 resources; the hosted Worker deliberately serves the 7 static resources, while API-backed workspace resources remain local-profile only.


Try it instantly (no signup)

Kick the tires with zero setup — no account, no API key:

FRIHET_DEMO=1 npx -y @frihet/mcp-server

In demo mode the server answers from realistic example fixtures (Spanish invoices with IVA/IGIC, expenses, clients, products, a bank account, and more) — every record uses demo_-prefixed IDs and the server prints a DEMO MODE banner on startup. Nothing is persisted and no network call is ever made. Writes are simulated and fiscal actions (e-invoice, VeriFactu, TicketBAI, FACe, payroll) return a clearly-labeled simulation — never a real submission to any tax authority.

When you're ready for your real data, drop the flag and add your key (app.frihet.io → Settings → API keys). See Install below.


For AI agents

If you are an agent reading this repository rather than a person reading a page, everything you need is machine-readable and generated from the running server — you do not have to parse this README.

What

Where

Onboarding contract: quickstart per client, auth, safe workflow, human-authority tool lists, error recovery

docs/agent-onboarding.json — also shipped inside the npm package

Per-tool capability truth: callability, writesFrihet, externalInteraction, externalSideEffects

_meta["io.frihet/capability"] on every entry of tools/list

How to behave once connected

the instructions string returned by initialize — your client hands it to you automatically

Three rules the contract encodes, in short:

  1. Orient before acting. get_business_context and the frihet://tax/rates resource decide the correct fiscal treatment. Do not recall a Spanish tax rate from memory.

  2. Draft, show, stop. create_invoice, create_quote and create_credit_note all default to status=draft — no fiscal number, no hash, nothing sent to a tax authority. Present the draft and hand back.

  3. Human authority is not yours to assume. Any tool with a non-empty externalSideEffects reaches a client's inbox, a webhook, money, or AEAT / VeriFactu / TicketBAI / FACe. Several also take confirm=true; that flag records a human decision — never set it to satisfy your own plan.

docs/agent-onboarding.json is regenerated from the live surface by npm run generate:agent-onboarding and gated in CI by npm run gate:agent-onboarding, so its tool lists and counts cannot drift from the server.


Install

One-line (Claude Code, Cursor, Copilot, Codex, Windsurf, Gemini CLI, and more)

npx skills add Frihet-io/frihet-mcp

Claude Code plugin (skill + MCP server in one install)

This repository is also a Claude Code plugin (frihet-erp): installing it wires up both the business-management skill and the MCP server.

# Try it locally
claude --plugin-dir /path/to/frihet-mcp

Once available in the community marketplace:

/plugin marketplace add anthropics/claude-plugins-community
/plugin install frihet-erp@claude-community

Skill invocation: /frihet-erp:frihet-mcp. The bundled .mcp.json launches @frihet/mcp-server via npx — set FRIHET_API_KEY in your environment (get one at app.frihet.io → Settings → API keys).

Claude Code — one command

claude mcp add frihet -s user -e FRIHET_API_KEY=fri_your_key_here -- npx -y @frihet/mcp-server
claude mcp list          # verify: frihet ✓ Connected

The CLI owns the config file, so there is nothing to hand-edit and no path to get wrong. (User scope writes ~/.claude.json, not ~/.claude/mcp.json.)

Codex CLI — one command

codex mcp add frihet --env FRIHET_API_KEY=fri_your_key_here -- npx -y @frihet/mcp-server
codex mcp list           # verify

Codex config is TOML, not JSON. codex mcp add writes:

[mcp_servers.frihet]
command = "npx"
args = ["-y", "@frihet/mcp-server"]

[mcp_servers.frihet.env]
FRIHET_API_KEY = "fri_your_key_here"

Pasting a JSON mcpServers block into ~/.codex/config.toml is a TOML parse error that takes down your whole Codex config, not just this server. Use the command above.

Claude Desktop, Cursor, Windsurf, Cline — JSON config

{
  "mcpServers": {
    "frihet": {
      "command": "npx",
      "args": ["-y", "@frihet/mcp-server"],
      "env": {
        "FRIHET_API_KEY": "fri_your_key_here"
      }
    }
  }
}

Tool

Config file

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json

Cursor

.cursor/mcp.json or ~/.cursor/mcp.json

Windsurf

~/.windsurf/mcp.json

Cline

VS Code settings or .cline/mcp.json

The JSON above is identical for these four clients; only the file path changes. Claude Code and Codex are not in this table — they manage their own config through the CLI commands shown above.

Remote (no install)

Use the hosted endpoint at mcp.frihet.io -- zero local dependencies, runs on Cloudflare Workers.

With API key:

{
  "mcpServers": {
    "frihet": {
      "type": "streamable-http",
      "url": "https://mcp.frihet.io/mcp",
      "headers": {
        "Authorization": "Bearer fri_your_key_here"
      }
    }
  }
}

With OAuth 2.0 + PKCE (browser-based login, no API key needed):

Clients that support OAuth (Claude Desktop, Smithery, etc.) can connect directly to https://mcp.frihet.io/mcp and authenticate via browser. The server implements the full OAuth 2.1 authorization code flow with PKCE.

Get your API key

  1. Log into app.frihet.io

  2. Go to Settings > API

  3. Click Create API key

  4. Copy the key (starts with fri_) -- it's only shown once


What you can do

Talk to your ERP. These are real prompts, not marketing copy.

Invoicing

"Show me all unpaid invoices"
"Create an invoice for Acme SL with 10h of consulting at 95/hour"
"Mark invoice abc123 as paid"
"How much has ClientName been invoiced this year?"

Expenses

"Log a 59.99 EUR expense for Adobe Creative Cloud, category: software, tax-deductible"
"List all expenses from January"
"What did I spend on travel last quarter?"

Clients

"Add a new client: TechStart SL, NIF B12345678, email admin@techstart.es"
"Show me all my clients"
"Update ClientName's address to Calle Mayor 1, Madrid 28001"

CRM

"Add a contact to Acme SL: Ana Garcia, CTO, ana@acme.es"
"Log a call with TechStart: discussed Q2 proposal, they're interested in upgrade"
"Add a note to ClientName: prefers invoices in English, payment NET 30"
"Show me all activities for Acme SL"

Quotes

"Create a quote for Design Studio: logo design (2000 EUR) + brand guidelines (3500 EUR)"
"Show me all pending quotes"

Webhooks

"Set up a webhook to notify https://my-app.com/hook when invoices are paid"
"List all my active webhooks"

What to expect

This MCP is a structured data interface -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. Most of the 158 canonical operations are CRUD operations over the REST API; the rest are read-only summaries and fiscal/e-invoice actions. Alias and discovery names are counted separately.

Works great:

"Create an invoice for TechStart SL, 40h consulting at 75 EUR/h"   --> creates the invoice
"Show unpaid invoices over 1,000 EUR"                               --> queries and filters
"Log a 120 EUR expense for the Madrid train, category: travel"      --> records the expense
"Update client Acme's email to billing@acme.es"                     --> modifies the record

Does not do:

  • OCR or PDF scanning -- you cannot upload an invoice image and have it read

  • File upload or attachment handling

  • Image processing of any kind

If you need to digitize paper invoices or receipts, extract the data first (e.g., Claude Vision API, a dedicated OCR service, or manual entry), then use the MCP to create the record:

1. Scan/photograph the invoice
2. Use Claude Vision: "Read this invoice image and extract the vendor, items, amounts, and dates"
3. Then: "Create an expense in Frihet for [extracted data]"

Catalogue operations (158)

Invoices (12)

Tool

What it does

list_invoices

List invoices with pagination

get_invoice

Get full invoice details by ID

create_invoice

Create a new invoice with line items

update_invoice

Update any invoice field

delete_invoice

Delete a draft invoice; a sent/paid one is cancelled, not destroyed (confirm=true required)

search_invoices

Find invoices by client name, date, or status

send_invoice

Email invoice to client (PDF attachment) — reaches a third party, confirm=true required

mark_invoice_paid

Mark an invoice as paid with optional payment date

get_invoice_pdf

Get bounded invoice PDF bytes as base64

get_invoice_einvoice

Get bounded XML or Factur-X PDF bytes for an invoice

create_credit_note

Create a credit note linked to an existing invoice

apply_late_fee

Apply a late payment fee to an overdue invoice

Expenses (5)

Tool

What it does

list_expenses

List expenses with pagination

get_expense

Get expense details

create_expense

Record a new expense

update_expense

Modify an expense

delete_expense

Delete an expense

Clients (5)

Tool

What it does

list_clients

List all clients

get_client

Get client details

create_client

Register a new client

update_client

Update client info

delete_client

Remove a client

CRM: Contacts (3)

Tool

What it does

list_client_contacts

List all contacts for a client

create_client_contact

Add a contact person to a client

delete_client_contact

Remove a contact from a client

CRM: Activities (2)

Tool

What it does

list_client_activities

List CRM activities (calls, emails, meetings, tasks)

log_client_activity

Log a call, email, meeting, or task against a client

CRM: Notes (3)

Tool

What it does

list_client_notes

List all notes for a client

create_client_note

Add a free-form note to a client

delete_client_note

Remove a note from a client

Products (5)

Tool

What it does

list_products

List products and services

get_product

Get product details

create_product

Add a product or service

update_product

Update pricing or details

delete_product

Remove a product

Quotes (6)

Tool

What it does

list_quotes

List all quotes

get_quote

Get quote details

create_quote

Draft a new quote

update_quote

Modify a quote

delete_quote

Delete only a clean draft with no delivery, response, attachment, or conversion evidence; refuse protected drafts; cancel non-drafts (confirm=true required)

send_quote

Email quote to client for acceptance

Webhooks (6)

Tool

What it does

list_webhooks

List configured webhooks

get_webhook

Get webhook details

create_webhook

Register a new webhook endpoint

update_webhook

Modify events or URL

delete_webhook

Remove a webhook

test_webhook

Send a test payload to a configured webhook endpoint

Intelligence (4)

Tool

What it does

get_business_context

Full snapshot: profile, plan, recent activity, top clients, current month

get_monthly_summary

Monthly P&L: revenue, expenses, profit, tax liability, top clients by revenue

get_quarterly_taxes

Quarterly tax prep: Modelo 303/130 fields, collected vs deductible, liability

duplicate_invoice

Clone an invoice for recurring billing (copies items/client/tax, starts as draft)

E-Invoicing (10)

Tool

What it does

send_einvoice

Dispatch an invoice in 11 formats (XRechnung, Factur-X, FatturaPA, PEPPOL, Facturae, UBL, CII) via email / Chorus Pro / SDI / PEPPOL / download

get_einvoice_status

Poll Hatchet workflow run status until succeeded/failed — returns ackId, XML URL, PDF/A-3 URL

validate_einvoice_xml

Validate raw XML against format schema + schematron rules (KOSIT / Mustang / XSD / Schematron)

export_datev

Export accounting data as DATEV EXTF (Buchungsstapel / Debitoren / Kreditoren) in CP1252 encoding

einvoice_export

Export e-invoice data in machine-readable formats (JSON/XML) for archival or integration

face_submit

Submit invoice to FACe (Spain B2G government e-invoicing platform)

face_status

Poll submission status from FACe for a submitted invoice

ticketbai_submit

Submit TicketBAI fiscal record to Basque Country tax authority (Hacienda)

ticketbai_status

Poll TicketBAI submission status from the Basque tax authority

ksef_submit

Submit invoice to KSeF (Poland) — stub: transport is infra-ready in Frihet-ERP but not yet exposed as a live endpoint (production gated on KSeF cert); returns a labeled "unavailable" error until activated

Time Tracking (6)

Tool

What it does

list_time_entries

List time entries with filter by user, project, date range, billable status

get_time_entry

Get full details of a single time entry by ID

create_time_entry

Log hours for a project (billable flag, description, date)

update_time_entry

Update any field on an existing time entry (PATCH semantics)

delete_time_entry

Soft-delete a time entry (confirm=true required)

get_time_summary

Aggregate total/billable/non-billable hours for a period, with optional groupBy (user/project/day)

Recurring Invoices (8)

Tool

What it does

list_recurring_invoices

List all recurring invoice templates (filter by active/paused)

get_recurring_invoice

Get full details of a recurring template by ID

create_recurring_invoice

Create a new recurring invoice template (daily/weekly/monthly/quarterly/yearly)

update_recurring_invoice

Update template fields — affects future generated invoices only

pause_recurring_invoice

Pause an active template — no invoices generated while paused

resume_recurring_invoice

Resume a paused template — next invoice on next scheduled cycle

delete_recurring_invoice

Permanently delete a template (confirm=true required)

run_recurring_now

Manually trigger immediate generation of the next invoice instance

Team Management (4)

Tool

What it does

list_team_members

List active members + pending invites (owner excluded)

invite_team_member

Invite a new member by email with role (admin/editor/accountant/viewer)

update_team_member_role

Change an existing member's role (admin/editor/accountant/viewer)

remove_team_member

Remove a member from the workspace (confirm=true required)

Gestoria — Accountants (5)

Tool

What it does

gestoria_message_send

Send a message in a contextual thread (documentRequest / filingItem / obligation)

gestoria_messages_list

List messages in a thread, newest first; paginate backwards with before

gestoria_template_create

Create a reusable document request template with variables + due-date offset

gestoria_template_bulk_send

Bulk send a template to up to 500 client workspaces in one call

gestoria_aging_consolidated

Cross-client AR aging report (buckets, per-workspace breakdown, top overdue)

Audit GL (3)

Tool

What it does

frihet_gl_entry_approve

Approve a GL journal entry (gestor/admin only — TRUST AREA)

frihet_gl_entry_reject

Reject a GL entry with a mandatory reason (TRUST AREA)

frihet_gl_entry_audit_log

Retrieve full audit trail for a GL entry

White-label Portal Domain (3)

Tool

What it does

frihet_portal_domain_add

Add a custom domain to the client portal (returns DNS CNAME records)

frihet_portal_domain_verify

Verify DNS propagation for a custom portal domain

frihet_portal_domain_remove

Remove a custom portal domain (reverts to default Frihet subdomain)

Self-onboard & VIES (2)

Tool

What it does

frihet_portal_onboard_link_generate

Generate a time-limited self-onboard link for a prospective client

frihet_tax_id_vies_lookup

Validate an EU VAT number (CIF intracomunitario) via VIES

IGIC — Canary Islands Indirect Tax (4)

Tool

What it does

frihet_modelo_415_summary

M415 annual operations >€3,005 (Canarias equivalent of M347)

frihet_modelo_425_summary

M425 annual IGIC recap for Canary Islands businesses

frihet_modelo_418_summary

M418 monthly IGIC return for large enterprises (grandes empresas)

frihet_aiem_calculate

Calculate AIEM (Arbitrio Importación) for imported/produced goods in Canarias

Impuesto sobre Sociedades — Corporate Tax (2)

Tool

What it does

frihet_modelo_200_summary

Modelo 200 annual IS return (taxable base, deductions, net payable)

frihet_modelo_202_summary

Modelo 202 installment payments (1P April, 2P October, 3P December)

Bank Categorization Rules (2)

Tool

What it does

frihet_bank_rules_list

List all bank auto-categorization rules (conditions + actions + status)

frihet_bank_rule_create

Create a new rule to auto-categorize transactions by description, amount, counterparty

Deposits (7)

Tool

What it does

list_deposits

List deposits with pagination

get_deposit

Get deposit details by ID

create_deposit

Record a new client deposit

update_deposit

Update deposit fields

delete_deposit

Delete a deposit (confirm=true required)

apply_deposit

Apply a deposit balance against an invoice

refund_deposit

Issue a refund for a deposit

Vendors (5)

Tool

What it does

list_vendors

List all vendors/suppliers

get_vendor

Get vendor details

create_vendor

Add a new vendor

update_vendor

Update vendor info

delete_vendor

Remove a vendor

Banking (5)

Tool

What it does

list_bank_accounts

List connected bank accounts

get_bank_account

Get details for a bank account

list_transactions

List bank transactions with filters

categorize_transaction

Assign a category and expense/income type to a transaction

match_transaction_to_invoice

Link a bank transaction to an existing invoice

Fiscal — Spanish Tax Models (7)

Tool

What it does

get_modelo_303_summary

Quarterly IVA return (Modelo 303) — collected vs deductible, net payable

get_modelo_130_summary

Quarterly IRPF installment for self-employed (Modelo 130)

get_modelo_390_summary

Annual IVA summary (Modelo 390)

get_modelo_180_summary

Annual withholding summary for rentals (Modelo 180)

get_modelo_347_summary

Annual third-party transactions >€3,005 (Modelo 347)

verifactu_status

Get VeriFactu submission status for a fiscal record

verifactu_resubmit

Resubmit a rejected VeriFactu fiscal record

ticketbai_status

Poll TicketBAI submission status — cross-reference from E-Invoicing (10); NOT counted toward this section's 7

Vacation Rentals / Stay (5)

Tool

What it does

list_reservations

List rental reservations with filters

get_reservation

Get reservation details

create_reservation

Create a new reservation

list_properties

List all rental properties

sync_channel

Trigger OTA channel sync (Airbnb, Booking.com, etc.)

POS — Point of Sale (4)

Tool

What it does

list_terminals

List registered POS terminals

get_sale

Get details for a POS sale transaction

list_sales

List POS sales with pagination

refund_sale

Issue a refund for a POS sale

Kitchen / Restaurant (6)

Tool

What it does

list_kitchen_tickets

List kitchen order tickets for the live board, filtered by status or station

get_kitchen_ticket

Get a single kitchen ticket by ID with all items and their individual statuses

update_kitchen_ticket

Advance a ticket's status (queued → preparing → ready → served) or reassign it to another station

list_kitchen_stations

List all kitchen stations with id, name, and active status

list_menu_items

List the kitchen menu catalog with free-text search and active/inactive filter

kitchen_flow_summary

Slow-station detection: aggregate open tickets per station and flag the bottleneck

HR — Human Resources (9)

Tool

What it does

leave_request_create

Create a leave request (vacation, sick, personal)

leave_approve

Approve a pending leave request

leave_reject

Reject a leave request with a reason

leave_cancel

Cancel an approved or pending leave request

leave_list

List leave requests with filters (user, status, date range)

attendance_clock_in

Record clock-in for an employee

attendance_clock_out

Record clock-out for an employee

overtime_report

Read daily/weekly overtime, aggregate minutes/hours, and compliance alerts computed over the selected YYYY or YYYY-MM records

anomaly_list

List attendance anomalies (missing punches, excessive overtime)

Payroll (2)

Tool

What it does

payroll_export

Read normalized payroll-ready employee data; the format value is an echoed destination label, not a generated file

payroll_checklist

List payable employees with payroll-profile readiness, missing fields, and monthly review state

Onboarding (2)

Tool

What it does

onboarding_status

Get onboarding completion status for the current workspace

onboarding_persona_set

Set or update the business persona (freelancer, SME, gestoría, etc.)

Permissions (2)

Tool

What it does

permissions_matrix

Get the documented RBAC-model snapshot (not a runtime authorization guarantee)

permissions_me

Compare RBAC-model fields with actual API-key scopes and known scope denials (non-exhaustive)

Period Close (3)

Tool

What it does

period_close_status

Get the current or selected YYYY fiscal-year range, open/closed state, and nullable closing details

period_close

Close an accounting period (gestor/admin only — TRUST AREA)

period_reopen

Reopen a closed period with a mandatory reason (TRUST AREA)

All canonical operations (and their aliases) return structured output via outputSchema -- typed JSON, not raw text. List response shapes follow their API family; not every list endpoint is paginated.

Capability and side-effect truth

On the full MCP surfaces, every tools/list entry includes _meta["io.frihet/capability"]:

  • registered means the name and handler exist in this server build;

  • callability is api_dependent (the handler calls the API; deployment, workspace enablement, and authorization still decide), runtime_checked (the handler explicitly distinguishes an absent backend from empty data), deferred, unavailable, or local—never an unconditional “available” claim;

  • writesFrihet, externalInteraction, and externalSideEffects distinguish state changes and calls to external entities/providers;

  • MCP action annotations remain the standard source for read-only, destructive, idempotent, and open-world hints.

The ChatGPT/OpenAI host is a separately reviewed surface: exactly 33 business operations with complete descriptions, 0 discovery meta-tools, 0 prompts, and 0 resources. Its 17 reads and 16 writes are deliberately narrow, and all writes require literal confirm=true. Ten writes may deliver full business events to active endpoints previously configured by the workspace owner; webhook administration itself remains excluded. Direct email delivery, the legacy monthly summary, raw invoice PDFs, invoice lifecycle transitions, updating an existing quote, regulated filing, deleting client parent records, deleting expenses with their linked files, deleting products, and deleting vendors are also excluded. This surface must not be inferred from the full catalogue.


Resources

Context the AI can read to make smarter decisions.

The local package serves 11 resources: 7 static references plus 4 API-backed workspace resources. The hosted Worker serves the 7 static resources. The OpenAI-reviewed host serves 0 resources.

Static (reference data, no API calls):

Resource

URI

What it provides

API Schema

frihet://api/schema

OpenAPI summary: endpoints, auth, rate limits, pagination, error codes

Tax Rates

frihet://tax/rates

Tax rates by Spanish fiscal zone: IVA, IGIC, IPSI, EU reverse charge, IRPF

Tax Calendar

frihet://tax/calendar

Quarterly and annual filing deadlines for the listed Spanish tax models

Expense Categories

frihet://config/expense-categories

8 categories with deductibility rules, IVA treatment, amortization

Invoice Statuses

frihet://config/invoice-statuses

Status flow (draft > sent > paid/overdue > cancelled), transition rules, webhook events

Currencies

frihet://config/currencies

40 supported currencies with ISO codes, symbols, decimal places, locale formatting

Countries

frihet://config/countries

61 supported countries with fiscal zones, default tax rates, currencies, invoice prefixes

Dynamic (live data from your account):

Resource

URI

What it provides

Business Profile

frihet://business-profile

Your business info, plan, defaults, recent activity, top clients

Monthly Snapshot

frihet://monthly-snapshot

Current month P&L, revenue, expenses, tax liability

Overdue Invoices

frihet://overdue-invoices

All invoices past due date (up to 100)

Plan Limits

frihet://status/plan-limits

Live plan tier, usage counters, invoices/month, API rate limits


Prompts (10)

Pre-built workflows the AI can execute as guided multi-step operations.

Prompt

What it does

Arguments

monthly-close

Close the month: review unpaid invoices, categorize expenses, check tax obligations, generate summary

month? (YYYY-MM)

onboard-client

Set up a new client with correct tax rates by location, optionally create a welcome quote

clientName, country?, region?

quarterly-tax-prep

Prepare quarterly tax filing: calculate IVA/IGIC, identify deductibles, preview Modelo 303/130/420

quarter?, fiscalZone?

overdue-followup

Find overdue invoices, draft follow-up messages, suggest payment reminders

--

new-client-invoice

Create a client + first invoice in one workflow with tax rate lookup

clientName, country?

expense-report

Generate expense report grouped by category with deductible totals

month? (YYYY-MM)

year-end-close

Full annual closing: quarterly review, pending invoices, uncategorized expenses, year-end checklist

year (YYYY)

cash-flow-forecast

Project cash flow for coming months: recurring income, expenses, overdue receivables, tax deadlines

months? (default: 3)

invoice-aging-review

AR aging analysis: group unpaid invoices by bucket (0-30/31-60/61-90/90+ days), top debtors, collection actions

--

expense-batch

Process expenses in bulk: categorize, apply tax rates, flag missing receipts

fiscalZone?


How it works

graph LR
    AI["Your AI assistant"]
    MCP["frihet-mcp"]
    API["api.frihet.io"]
    DB["Frihet ERP"]

    AI -- "create_invoice()" --> MCP
    MCP -- "POST /v1/invoices" --> API
    API --> DB
    DB -- "201 + invoice data" --> API
    API -- "structured JSON" --> MCP
    MCP -- "typed response + suggestions" --> AI

    style AI fill:#09090b,stroke:#4ade80,color:#fafafa
    style MCP fill:#09090b,stroke:#fafafa,color:#fafafa
    style API fill:#09090b,stroke:#3f3f46,color:#a1a1aa
    style DB fill:#09090b,stroke:#3f3f46,color:#a1a1aa

The server translates tool calls into REST API requests. It handles authentication, rate limiting (automatic retry with backoff on 429), pagination, and error mapping.

Two transports:

  • stdio (local) -- npx @frihet/mcp-server with FRIHET_API_KEY

  • Streamable HTTP (remote) -- https://mcp.frihet.io/mcp with Bearer token or OAuth 2.0+PKCE

Environment variables

Variable

Required

Default

FRIHET_API_KEY

Yes (stdio)

--

FRIHET_API_URL

No

https://api.frihet.io/v1

FRIHET_TOOL_MODE

No

full


Tool exposure: depth served on demand

Frihet's differentiator is depth — full ES/EU fiscal coverage plus native compliance (VeriFactu, TicketBAI, Facturae/FACe; KSeF Poland infra-ready, activation pending), banking, CRM, HR/payroll, stay/PMS and POS. But a flat list of every tool, loaded into an agent's context up front, is the 2026 context-rot problem: it crowds out the task and degrades tool selection before any work begins.

FRIHET_TOOL_MODE lets you choose how that depth is exposed.

Mode

Behavior

full (default)

Canonical tools and fiscal aliases are exposed with full descriptions and schemas. Public descriptors add conservative callability and side-effect truth; operation names, schemas and handlers are unchanged.

grouped

Progressive disclosure. Each tool's description collapses to a one-line [group] summary — full schema via describe_tool('name'), and three lightweight discovery tools are added. The agent loads depth only for the tools it actually needs.

In grouped mode operation names, input schemas and handlers are unchanged. Descriptors also expose the same conservative capability and action truth as the full profile. Discovery flows through three meta-tools:

  • list_tool_groups() — the domain map (invoicing, expenses, fiscal/compliance, banking, CRM, HR/payroll, stay/PMS, POS, intelligence, products, platform) with a one-line blurb and tool count for each.

  • search_tools(query) — free-text search across tool name, title, summary and group; returns matching tools with their group, summary, read-only flag and input fields. Optional group filter and limit.

  • describe_tool(name) — the full original description and input fields for one tool, on demand, before you call it.

// claude_desktop_config.json — opt in to grouped mode
{
  "mcpServers": {
    "frihet": {
      "command": "npx",
      "args": ["@frihet/mcp-server"],
      "env": {
        "FRIHET_API_KEY": "fri_...",
        "FRIHET_TOOL_MODE": "grouped"
      }
    }
  }
}

Grouped exposure changes description density, not operation behavior. The versioned OpenAI-reviewed profile is composed separately and remains independently gated.


API limits

Limit

Value

Requests per minute

100 per API key

Results per page

100 max (50 default)

Request body

1 MB max

Webhook payload

100 KB max

Webhooks per account

20 max

Rate limiting is handled automatically with exponential backoff.


Claude Code Skill

Beyond raw MCP tools, this repo includes a Claude Code skill that adds business context: Spanish tax rules, workflow recipes, financial reports, and natural language commands.

Install the skill

git clone https://github.com/Frihet-io/frihet-mcp.git
ln -s "$(pwd)/frihet-mcp/skill" ~/.claude/skills/frihet

Or with the universal installer:

npx skills add Frihet-io/frihet-mcp

Commands

Command

What it does

/frihet status

Account overview, recent activity, pending payments

/frihet invoice

Create, list, search invoices

/frihet expense

Log and query expenses

/frihet clients

Manage client database

/frihet quote

Create and manage quotes

/frihet report

Financial summaries (P&L, quarterly, overdue)

/frihet webhooks

Configure automation triggers

/frihet setup

Guided setup and connection test

The skill knows about IVA rates, IRPF retention, Modelo 303 prep, expense deductibility rules, and VeriFactu compliance.

Full documentation: docs.frihet.io/desarrolladores/skill-claude-code


Development

git clone https://github.com/Frihet-io/frihet-mcp.git
cd frihet-mcp
npm install
npm run build

Run locally:

FRIHET_API_KEY=fri_xxx node dist/index.js

Test with the MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Contributing

Contributions are welcome. Please open an issue first to discuss what you'd like to change.

git clone https://github.com/Frihet-io/frihet-mcp.git
cd frihet-mcp
npm install
npm run build   # must pass before submitting

Current limitations

  • No OCR or file upload -- the MCP works with structured data, not images or PDFs.

  • Single company -- one API key maps to one Frihet workspace.

  • Frihet account required -- you need an active account at app.frihet.io and an API key (starts with fri_).


Ecosystem

Package

What it is

@frihet/mcp-server

This MCP server (158 canonical operations + 5 alias names; 11 local resources; 10 prompts)

@frihet/sdk

TypeScript SDK (frihet.invoices.create())

frihet

CLI (frihet invoices list --status overdue)

n8n-nodes-frihet

n8n community node for workflow automation

REST API

OpenAPI 3.1 at api.frihet.io/v1

Remote MCP

Hosted endpoint on Cloudflare Workers (zero install)

Webhooks

Real-time events with HMAC-SHA256


License

MIT. See LICENSE.

Built by Frihet.

Available Tools

148 tools
anomaly_listList AnomaliesA
Read-onlyIdempotent

List HR / operational / financial anomalies detected by the system. Filter by type (duplicate_clock_in, overtime_spike, missing_clock_out, expense_outlier, etc.), severity (low/medium/high/critical), or period. Useful for daily HR review and compliance audits. / Lista anomalias detectadas (RRHH/operativas/financieras) con filtros opcionales.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoPeriod end ISO 8601 / Fin
fromNoPeriod start ISO 8601 / Inicio
typeNoFilter by anomaly type slug / Tipo
limitNoMax results / Maximos
offsetNoOffset / Desplazamiento
severityNoFilter by severity / Severidad

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds value by specifying what anomalies are included and the available filters, going beyond the annotation hints.

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

Conciseness4/5

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

The description is front-loaded with the purpose and filters. It is relatively concise, though the bilingual repetition adds some redundancy. Overall efficient.

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 tool's simplicity, the description covers the essential use cases. With an output schema present, return values are handled. Could mention pagination behavior, but offset/limit parameters imply it.

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 parameters are described in the schema. The description adds no additional parameter-level information; it only lists filter types already in the schema.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'anomalies', specifies the domains (HR/operational/financial), and lists example types. It distinguishes itself from sibling list tools by focusing on anomalies.

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 mentions it is 'useful for daily HR review and compliance audits', giving clear context for use. However, it does not explicitly state when not to use it or mention alternative tools.

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

apply_depositApply DepositA
Idempotent

Apply a deposit to an invoice or mark it as used. Transitions the deposit status to 'applied'. Example: id='dep_abc123', invoiceId='inv_xyz' / Aplica un deposito a una factura o lo marca como utilizado.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeposit ID / ID del deposito
notesNoApplication notes / Notas de aplicacion
invoiceIdNoInvoice ID to apply the deposit to / ID de la factura a la que aplicar el deposito

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A3.9/5.0
Behavior4/5

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

The description adds behavioral context: the deposit status transitions to 'applied'. Annotations provide idempotentHint=true, which is consistent but not elaborated. The description does not contradict annotations and adds meaningful state-change info.

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 two sentences with an example and bilingual text. It is clear and front-loaded, though the Spanish translation adds redundancy for an English-focused agent. Still, it is efficient and not overly verbose.

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?

The description covers the core functionality and mentions the optional invoiceId for applying to an invoice. Given the output schema exists and parameters are simple, the description is reasonably complete, though it could mention prerequisites or error scenarios.

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 parameters are well-documented structurally. The description adds an example but does not provide additional semantic meaning beyond what the schema already offers. 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 clearly states the tool applies a deposit to an invoice or marks it as used, and transitions status to 'applied'. It distinguishes from sibling tools like refund_deposit or update_deposit by specifying the action on invoices.

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 gives an example but no explicit guidance on when to use this tool versus alternatives like refund_deposit or update_deposit. Usage is implied but not clarified with when-not or alternative conditions.

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

apply_late_feeApply Late FeeA

Apply late payment interest to an overdue invoice. Calculates interest based on EU Late Payment Directive (8% default) or auto-calculates from days overdue. Creates a debit note linked to the original invoice. / Aplica intereses de demora a una factura vencida. Calcula intereses segun la Directiva Europea de Morosidad (8% por defecto) o los calcula automaticamente a partir de los dias de retraso. Crea una nota de debito vinculada a la factura original.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoOverride fee amount. If omitted, auto-calculated from days overdue and legal rate. / Importe de la comision. Si se omite, se calcula automaticamente.
invoiceIdYesID of the overdue invoice / ID de la factura vencida
daysOverdueNoOverride days overdue count. If omitted, calculated from due date. / Dias de retraso. Si se omite, se calcula a partir de la fecha de vencimiento.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.4/5.0
Behavior5/5

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

The description details key behaviors: interest calculation based on EU directive, auto-calculation from days overdue, and creation of a debit note. Annotations (readOnlyHint=false, destructiveHint=false) align with this, and additional context is provided beyond annotations.

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

Conciseness3/5

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

The description is bilingual, making it longer than necessary. While clear and front-loaded, the duplication of content in two languages reduces conciseness for an AI agent.

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

Completeness4/5

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

The description covers the main function and auto-calculation feature. It assumes the invoice is overdue, which is clearly stated. Given the output schema exists, it is sufficiently complete for a tool of moderate 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 100%, so baseline is 3. The description adds value by explaining that amount and daysOverdue can be auto-calculated if omitted, supplementing the schema's override 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 clearly states the tool applies late payment interest to overdue invoices, calculates based on EU Late Payment Directive, and creates a debit note. It is specific and distinct from sibling tools like create_credit_note.

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 indicates the tool is for applying late fees to overdue invoices but does not explicitly contrast with alternatives or state when not to use it. However, the context of sibling tools implies its specific role.

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

attendance_clock_inClock In (Attendance)A

Record an employee clock-in. Optionally captures mood (employee well-being tracking) and location (remote/office/site). Returns an attendance entry with status='open'. Pair with attendance_clock_out to close the entry. / Registra una entrada de fichaje. Captura opcionalmente estado de animo y ubicacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
moodNoOptional mood slug (e.g. 'great','ok','tired') / Estado de animo
locationNoOptional location ('remote','office','site') / Ubicacion
employeeIdYesEmployee ID / ID del empleado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
moodNo
statusNo
locationNo
clockInAtNo
createdAtNo
updatedAtNo
clockOutAtNo
employeeIdNo
durationMinutesNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations provide no special hints, so description carries full burden. It discloses that the tool records a clock-in and returns an entry with status='open', but does not mention potential side effects like duplicate clock-in prevention or permissions.

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

Conciseness4/5

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

The description is short, consisting of two English sentences and a Spanish repetition. It is front-loaded with the main purpose. The bilingual aspect slightly increases length but is not excessive.

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 clock-in tool, the description covers purpose, optional parameters, return status, and pairing with clock_out. Given that output schema exists (so return details are not needed here) and schema covers parameters, this is fairly complete. Missing details about error conditions but adequate.

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 descriptions already cover all three parameters. The tool description adds minimal context by labeling mood as 'employee well-being tracking' and location as 'remote/office/site'. With 100% schema coverage, baseline is 3; description adds marginal value.

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 clearly states the tool records a clock-in, optionally captures mood and location, and returns an attendance entry with status='open'. It distinguishes from sibling attendance_clock_out by mentioning pairing.

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 context by stating 'Pair with attendance_clock_out to close the entry,' implying when to use this tool (to start a shift) and that clock_out is the complementary tool. However, it does not explicitly state when not to use (e.g., if already clocked in).

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

attendance_clock_outClock Out (Attendance)A
Idempotent

Close an open attendance entry. Stamps clockOutAt and computes durationMinutes. Idempotent: clocking out an already-closed entry is a no-op. / Cierra una entrada de fichaje abierta. Calcula la duracion en minutos.

ParametersJSON Schema
NameRequiredDescriptionDefault
entryIdYesOpen attendance entry ID / ID de la entrada abierta

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
moodNo
statusNo
locationNo
clockInAtNo
createdAtNo
updatedAtNo
clockOutAtNo
employeeIdNo
durationMinutesNo

TDQS

A4.4/5.0
Behavior5/5

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

Discloses idempotency (closing an already-closed entry is a no-op) which adds beyond the idempotentHint annotation. Also explains it stamps clockOutAt and computes durationMinutes.

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 primary action, includes idempotency note, and a Spanish translation. No unnecessary words.

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?

Complete for a simple tool: explains action, idempotency, and output calculation. Output schema exists to cover return values. Could mention prerequisites (entry must be open) but it's 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?

Schema description coverage is 100%, and the description does not add additional meaning beyond what the schema provides for the only parameter (entryId).

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?

Clearly states the tool closes an open attendance entry, stamps clockOutAt and computes duration. Distinguishes from sibling attendance_clock_in by being the clock-out counterpart.

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?

States the tool is for closing an open attendance entry, but does not explicitly exclude scenarios or mention alternatives. However, the complementary relationship with attendance_clock_in is clear.

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

categorize_transactionCategorize TransactionA
Idempotent

Apply a category to a bank transaction for manual classification. Categories map to expense categories for tax deduction tracking. Example: id='tx_abc', category='supplies', notes='Office paper Q1' / Asigna una categoria a un movimiento bancario. Las categorias se mapean a categorias de gastos para el control de deducciones fiscales.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTransaction ID / ID del movimiento
notesNoOptional notes for this classification / Notas opcionales
categoryYesCategory slug (e.g. 'supplies', 'travel', 'software') / Categoria

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
amountYes
statusNo
categoryNo
currencyNo
postedAtNo
accountIdNo
createdAtNo
updatedAtNo
descriptionNo
matchedDocIdNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate it's not read-only and idempotent. The description adds context about manual classification and tax mapping, but does not disclose overwrite behavior or potential side effects. With annotations bearing part of the burden, this is adequate but not thorough.

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 very concise: two sentences plus an example in two languages. It front-loads the purpose and includes relevant details without unnecessary words.

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 three parameters and presence of an output schema, the description covers the essential intent and usage. It lacks some details like category validation, but the schema examples compensate. It is complete enough for an agent to use correctly.

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

Parameters3/5

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

Schema coverage is 100% with parameter descriptions. The description provides an example that clarifies usage but does not add new meaning beyond the schema. Baseline of 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 clearly states the verb 'apply a category' and the resource 'bank transaction' and the purpose of manual classification for tax deduction tracking. An example is provided, making it unambiguous. It is easily distinguishable from siblings like 'match_transaction_to_invoice'.

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 implies use for manual classification but does not explicitly state when to use this tool versus alternatives like automatic categorization or matching. No exclusions or when-not-to-use guidance is provided.

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

create_client_noteCreate Client NoteA

Add a note to a client. Notes are free-form text entries useful for keeping context. Example: clientId='abc123', content='Prefers invoices in English. Payment NET 30.' / Anade una nota a un cliente. Las notas son texto libre para mantener contexto.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesNote content / Contenido de la nota
clientIdYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
contentYes
createdAtNo
updatedAtNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the write nature is clear. The description adds no further behavioral details such as idempotency, limits, or side effects beyond the basic verb and purpose.

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 reasonably concise at three sentences including a bilingual translation and an example. The structure is clear, though the bilingual part adds some redundancy for English readers.

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 tool's simplicity, 100% schema coverage, and existence of an output schema, the description is complete enough. It covers the essential purpose, parameters, and usage context without requiring extensive elaboration.

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% with descriptions for both parameters. The description adds value by providing a concrete example with parameter values, illustrating typical usage and expected data format.

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 clearly states the verb 'Add' and resource 'a note to a client', and distinguishes notes as free-form text entries from sibling tools like log_client_activity, which might be more structured.

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 implies usage via an example but does not explicitly state when to use this tool versus alternatives like log_client_activity or list_client_notes. No when-not-to-use or exclusion criteria are provided.

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

create_credit_noteCreate Credit NoteA

Create a credit note (factura rectificativa) for an existing invoice. This reverses all or part of an invoice for compliance. Spanish market: generates VeriFactu-compliant R1-R5 rectificativa. Other markets: standard credit note with negative amounts. / Crea una factura rectificativa para una factura existente. Mercado espanol: genera rectificativa R1-R5 conforme a VeriFactu. Otros mercados: nota de credito estandar con importes negativos.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesReason for the credit note. Maps to Spanish R-types: error→R1 (art. 80.1), refund/discount/cancellation/other→R4 / Motivo de la rectificacion. error→R1, resto→R4
invoiceIdYesID of the original invoice to credit / ID de la factura original a rectificar
issueDateNoISO date for the credit note (YYYY-MM-DD). Defaults to today. / Fecha de emision (YYYY-MM-DD). Por defecto hoy.
fullCreditNotrue = full credit (tipo S, sustitucion), false = partial (tipo I, diferencias). Default: true / true = abono total (tipo S), false = parcial (tipo I). Por defecto: true
reasonDescriptionNoOptional free-text description of the reason / Descripcion libre del motivo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
metaNo
successNo
creditNoteNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations are minimal (readOnlyHint=false, destructiveHint=false, etc.). The description adds behavioral context: it performs a write operation that reverts an invoice, and in the Spanish market it generates VeriFactu-compliant R1-R5 rectificativa. This goes beyond the annotations by specifying compliance details and the effect on the invoice.

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 concise, with the first sentence front-loading the main action. It includes a bilingual paragraph for Spanish users, which is slightly redundant but serves a clear audience need. No wasted sentences, but length could be reduced for English-only contexts.

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?

The description covers the core functionality and market differences, which is adequategiven the presence of an output schema and parameter descriptions. Missing are prerequisites (e.g., invoice must exist and not be fully credited) and error conditions, but these are not critical for initial selection. Overall complete enough for an agent to understand the tool's role.

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

Parameters3/5

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

Schema coverage is 100%, with each parameter already having bilingual descriptions in the input schema. The tool description itself does not add additional semantics for parameters. Per guidelines, when schema_coverage is high, baseline is 3, which is appropriate here.

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?

Description clearly states it creates a credit note (factura rectificativa) for an existing invoice, specifying it reverses all or part of an invoice for compliance. It distinguishes the tool from siblings like create_invoice and refund_sale by mentioning market-specific behavior (VeriFactu in Spain, standard negative amounts elsewhere), making its purpose unmistakable.

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

Usage Guidelines4/5

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

Description explains when to use the tool: to generate a credit note for an existing invoice. It provides context about market-specific compliance requirements but does not explicitly state when not to use it or name alternatives. However, the context is sufficient for an agent to decide based on the invoice and market.

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

create_depositCreate DepositA

Record a new deposit from a client. Requires clientId and amount. Useful for tracking advance payments, retainers, and security deposits. Example: clientId='abc123', amount=500, currency='EUR', description='Project retainer' / Registra un nuevo deposito de un cliente. Requiere clientId e importe. Util para adelantos, retenciones y depositos de garantia.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDeposit date in ISO 8601 (YYYY-MM-DD) / Fecha del deposito
notesNoInternal notes / Notas internas
amountYesDeposit amount / Importe del deposito
statusNoStatus (e.g. 'pending', 'applied', 'refunded') / Estado
clientIdYesClient ID / ID del cliente
currencyNoCurrency code (e.g. 'EUR', 'USD') / Codigo de moneda
referenceNoExternal reference or receipt number / Referencia externa
clientNameNoClient name (denormalized) / Nombre del cliente
descriptionNoDeposit description / Descripcion del deposito
paymentMethodNoPayment method (e.g. 'bank_transfer', 'card') / Metodo de pago

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
notesNo
amountYes
statusNo
clientIdYes
currencyNo
createdAtNo
referenceNo
updatedAtNo
clientNameNo
descriptionNo
paymentMethodNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate this is a non-read-only, non-idempotent, non-destructive mutation. The description adds no behavioral traits beyond stating it records a deposit. It does not mention side effects, auth needs, or idempotency behavior. With annotations covering the mutation type, a 3 is appropriate.

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

Conciseness5/5

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

The description is extremely concise with two sentences in English (plus Spanish translation). It front-loades purpose and requirements, with no filler. Every sentence is essential.

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 10 parameters (100% schema coverage) and presence of an output schema, the description covers core purpose, required params, and example. It does not explain optional parameters, but the schema handles that. It is sufficiently complete for a creation tool.

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 adds value by explicitly highlighting required parameters (clientId and amount) and providing an example with values. This helps clarify usage beyond 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 clearly states 'Record a new deposit from a client' with specific verb and resource. It provides use cases (advance payments, retainers, security deposits) and distinguishes from sibling tools that update, delete, refund, apply, list, or get deposits.

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 explicitly requires clientId and amount, gives an example, and lists use cases. However, it does not explicitly state when not to use it or provide direct comparisons with alternative tools like apply_deposit or refund_deposit. Still, the intended usage 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 InvoiceA

Create a new invoice. Requires client name and at least one line item. The invoice number is auto-generated. Defaults to draft status and today's date. Example: clientName='Acme Corp', items=[{description:'Consulting', quantity:10, unitPrice:150}], taxRate=21, irpfRate=15 / Crea una nueva factura. Requiere nombre del cliente y al menos un concepto. El numero se genera automaticamente. Por defecto estado borrador y fecha de hoy. Soporta retencion IRPF (autonomos ES), recargo de equivalencia, serie, anticipo y descuento global.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesLine items (each with description, quantity, unitPrice) / Conceptos de la factura
notesNoAdditional notes shown on the invoice / Notas adicionales
statusNoInvoice status (default: draft) / Estado de la factura
dueDateNoDue date in ISO 8601 format (YYYY-MM-DD) / Fecha de vencimiento
taxRateNoTax rate percentage (e.g. 21 for 21% IVA, 7 for IGIC) / Porcentaje de impuesto
clientIdNoExisting client ID — server back-fills taxId/address / ID de cliente existente
irpfRateNoIRPF withholding % (retencion autonomo ES, e.g. 15 or 7) / Retencion IRPF %
poNumberNoClient purchase-order reference / Numero de pedido del cliente
seriesIdNoInvoice numbering series ID / ID de serie de numeracion
issueDateNoIssue date in ISO 8601 format (YYYY-MM-DD), defaults to today / Fecha de emision
clientNameYesClient/customer name / Nombre del cliente
prepaymentNoPrepaid/advance amount already collected in EUR / Anticipo cobrado en EUR
clientTaxIdNoClient tax ID (NIF/CIF/VAT) shown on the invoice / NIF/CIF del cliente
discountRateNoGlobal discount % applied to the invoice / Descuento global %
clientAddressNoClient billing address shown on the invoice / Direccion fiscal del cliente
operationTypeNoOperation type (service or goods) / Tipo de operacion
clientLocationNoFiscal zone driving IVA vs IGIC vs exempt / Zona fiscal (IVA/IGIC/exento)
documentNumberNoExternally-issued number for import (honored verbatim) / Numero externo para importacion
equivalenceSurchargeRateNoRecargo de equivalencia % (ES retail regime) / Recargo de equivalencia %

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
dueDateNo
taxRateNo
createdAtNo
issueDateNo
updatedAtNo
clientNameNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate a mutation tool (readOnlyHint=false). The description adds significant behavioral context: auto-generated invoice number, default draft status, today's date, and support for advanced features like IRPF, equivalence surcharge, series, prepayment, and global discount. This goes beyond what annotations provide.

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

Conciseness4/5

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

The description is concise, front-loaded with essential information, and includes a helpful example. The bilingual content (English and Spanish) adds redundancy but is not excessive. Every sentence contributes meaningful guidance.

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 tool's complexity (19 parameters, 3 enums, output schema present), the description covers core behavior, prerequisites, defaults, and advanced features. It does not need to explain return values due to the output schema. The context is sufficient for an agent to invoke the tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by providing an example that demonstrates how to use common parameters (clientName, items, taxRate, irpfRate) and highlights advanced features (IRPF, surcharge, series, prepayment, discount) that correspond to schema properties.

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

Purpose5/5

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

The description clearly states 'Create a new invoice' and specifies required parameters (client name, at least one line item). It distinctively identifies the creation action compared to sibling tools like get_invoice, update_invoice, and delete_invoice.

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 explicitly states prerequisites (client name, at least one line item) and defaults (auto-generated number, draft status, today's date). It provides an example but does not explicitly state when not to use or mention alternatives, though none are directly relevant.

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

create_productCreate ProductA

Create a new product or service in the catalog. Requires a name and unit price. Products can be referenced when creating invoices and quotes for faster data entry. Example: name='Web Design', unitPrice=1500, taxRate=21, description='Full website redesign' / Crea un nuevo producto o servicio en el catalogo. Requiere nombre y precio unitario. Los productos se pueden usar al crear facturas y presupuestos para entrada rapida de datos.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProduct/service name / Nombre del producto o servicio
taxRateNoDefault tax rate % (e.g. 21 for 21% IVA) / IVA por defecto
unitPriceYesUnit price in EUR / Precio unitario en EUR
descriptionNoProduct description / Descripcion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
taxRateNo
createdAtNo
unitPriceYes
updatedAtNo
descriptionNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds value beyond annotations by specifying required fields (name and unit price) and giving an example. Annotations indicate non-destructive behavior, and the description aligns with that.

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

Conciseness3/5

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

The description is bilingual, which makes it slightly longer. While front-loaded with English, the Spanish repetition adds verbosity. Could be more concise by omitting the Spanish or reducing 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?

Given the presence of an output schema (not shown) and the parameter schema with full coverage, the description explains the tool's purpose and usage context sufficiently, including integration with invoices and quotes.

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 description's mention of required fields and the example provides additional clarity, reinforcing parameter semantics without redundancy.

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 clearly states 'Create a new product or service in the catalog' with a specific verb and resource. It distinguishes from sibling tools like 'list_products' and 'update_product' by focusing on creation.

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

Usage Guidelines4/5

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

It explains that products can be referenced when creating invoices and quotes for faster data entry, providing context for use. However, it does not explicitly state when not to use it or alternatives beyond those mentioned.

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

create_quoteCreate QuoteA

Create a new quote/estimate for a client. Requires client name and at least one line item. Quotes can later be converted to invoices. Defaults to draft status. Example: clientName='Acme Corp', items=[{description:'Design', quantity:1, unitPrice:3000}], validUntil='2026-04-30' / Crea un nuevo presupuesto. Requiere nombre del cliente y al menos un concepto. Los presupuestos se pueden convertir en facturas despues.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesLine items (each with description, quantity, unitPrice) / Conceptos del presupuesto
notesNoAdditional notes shown on the quote / Notas adicionales
statusNoQuote status (default: draft) / Estado del presupuesto
dueDateNoDue date in ISO 8601 (YYYY-MM-DD) / Fecha de vencimiento
taxRateNoTax rate % (e.g. 21 IVA, 7 IGIC) / Porcentaje de impuesto
clientIdNoExisting client ID — server back-fills taxId/address / ID de cliente existente
irpfRateNoIRPF withholding % (retencion autonomo ES) / Retencion IRPF %
issueDateNoIssue date in ISO 8601 (YYYY-MM-DD), defaults to today / Fecha de emision
clientNameYesClient name / Nombre del cliente
validUntilNoExpiry date in ISO 8601 (YYYY-MM-DD) / Fecha de validez
clientTaxIdNoClient tax ID (NIF/CIF/VAT) / NIF/CIF del cliente
clientAddressNoClient billing address / Direccion fiscal del cliente
clientLocationNoFiscal zone driving IVA vs IGIC vs exempt / Zona fiscal
equivalenceSurchargeRateNoRecargo de equivalencia % / Recargo de equivalencia %

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
createdAtNo
updatedAtNo
clientNameNo
validUntilNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations lack clear hints (readOnlyHint: false, destructiveHint: false). The description adds that the default status is 'draft' and mentions future conversion to invoices, providing some behavioral context. However, it does not disclose other behaviors like permission requirements or side effects beyond creation.

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 extremely concise: two sentences and one example. It front-loads the core purpose and requirements, then adds a practical example. No filler or 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?

Given the tool's complexity (14 params, but schema covers them all) and the presence of an output schema, the description covers the essentials. It includes required fields and a future use case (conversion to invoice), but could mention that clientId can back-fill address/taxId.

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 100% (all 14 parameters have descriptions). The description adds an example showing clientName and items structure, which enhances understanding beyond the schema. However, it doesn't explain nuanced parameters like clientLocation or equivalenceSurchargeRate.

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 explicitly states 'Create a new quote/estimate for a client' and specifies required fields (client name, at least one line item), providing a clear verb-resource-action. It distinguishes from siblings like update_quote and create_invoice by mentioning future conversion to invoices.

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 context for when to use the tool (initial quote creation) and notes quotes can be converted to invoices. It does not explicitly exclude alternatives (e.g., update_quote for modifications), but the purpose is well-understood.

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

create_recurring_invoiceCreate Recurring InvoiceA

Create a new recurring invoice template. Specify frequency (daily/weekly/monthly/quarterly/yearly), recipient client, line items, and optional start date. The first invoice instance is generated on the next scheduled run date. Example: clientId='cli_abc', frequency='monthly', templateName='Servicio mensual', lineItems=[{description:'SaaS', quantity:1, unitPrice:299}] / Crea una nueva plantilla de factura recurrente. Especifica frecuencia, cliente destinatario, lineas y fecha de inicio opcional. La primera instancia se genera en la proxima fecha programada.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoNotes to include on generated invoices / Notas a incluir en las facturas generadas
taxRateNoTax rate percentage (e.g. 21 for 21% IVA) / Tipo impositivo (e.g. 21 para IVA 21%)
clientIdYesClient ID (recipient of generated invoices) / ID del cliente destinatario
frequencyYesBilling frequency / Frecuencia de facturacion
lineItemsYesInvoice line items / Lineas de la factura
startDateNoFirst billing date ISO 8601 (YYYY-MM-DD). Defaults to next natural cycle date. / Primera fecha de facturacion (por defecto proximo ciclo natural)
templateNameYesName for this recurring template / Nombre de la plantilla

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
statusNo
nextRunNo
createdAtNo
frequencyNo
lineItemsNo
recipientNo
updatedAtNo
templateNameNo

TDQS

A4/5.0
Behavior4/5

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

The description discloses key behavioral traits: template creation (not immediate invoice) and scheduling ('first invoice instance generated on next scheduled run date'). Annotations already indicate non-readonly and non-destructive, so the description adds scheduling context without contradiction.

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

Conciseness3/5

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

The description is bilingual, doubling length without essential additional info. While the English part is concise, the Spanish repetition adds redundancy. Still, key information is front-loaded, but not maximally efficient.

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 an output schema (not provided but indicated), the description adequately covers creation behavior and scheduling. It doesn't address error cases or active status, but for a template creation tool with 100% schema coverage, it is reasonably 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 100%, so the description adds limited value beyond the schema. It reiterates frequency options and provides an example, but the schema already describes all parameters clearly. 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 clearly states 'Create a new recurring invoice template,' specifying the verb (create), resource (recurring invoice template), and key fields (frequency, client, line items, start date). It distinguishes from one-time invoice creation via sibling tools like create_invoice and update_recurring_invoice.

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 provides clear context: specify frequency, client, line items, and optional start date, with an example. It implies use for recurring billing but lacks explicit when-to-use vs alternatives or exclusions. Still, the context is well communicated.

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

create_reservationCreate ReservationA

Create a new reservation manually (not via channel sync). Requires property ID, check-in/check-out dates, and guest count. Optionally provide a guest ID or inline guest data to create a new guest. / Crea una nueva reserva manualmente. Requiere propiedad, fechas y numero de huespedes.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestNoNew guest data (used if guestId not provided) / Datos del nuevo huesped si no se proporciona guestId
notesNoInternal notes / Notas internas
checkInYesCheck-in date YYYY-MM-DD / Fecha de entrada
guestIdNoExisting guest ID (if known) / ID de huesped existente
checkOutYesCheck-out date YYYY-MM-DD / Fecha de salida
currencyNoISO 4217 currency (defaults to workspace currency) / Divisa
channelIdNoBooking channel ID (Airbnb, Booking.com, Direct) / Canal de reserva
guestCountYesNumber of guests / Numero de huespedes
propertyIdYesProperty ID / ID de propiedad
totalAmountNoTotal amount in workspace currency / Importe total

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
notesNo
nightsNo
statusYes
checkInYes
guestIdNo
checkOutYes
currencyNo
channelIdNo
createdAtNo
updatedAtNo
guestCountYes
propertyIdYes
totalAmountNo

TDQS

A4/5.0
Behavior3/5

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

Annotations declare no readOnly or destructive hints, and the description confirms it's a create operation. However, it does not disclose side effects like confirmation emails or immediate channel sync implications.

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 in English and one in Spanish, front-loaded with purpose, no redundant 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?

Given 10 parameters, nested objects, and output schema, the description covers the essentials but could mention what the tool returns (e.g., reservation ID) or date validation rules.

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%, so baseline 3. The description adds minimal info beyond schema, only listing required fields and optional guest data, without further detail.

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 clearly states the verb 'Create', the resource 'reservation', and the context 'manually (not via channel sync)', distinguishing it from sibling tool sync_channel.

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 notes when to use (manual creation) and contrasts with channel sync, but does not mention when not to use or other alternatives like importing from channels.

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

create_time_entryCreate Time EntryA

Log a time entry for a project. Requires projectId, hours (decimal), and date. Mark as billable=true to include in client invoicing. Example: projectId='proj_abc', hours=2.5, description='Frontend review', billable=true, date='2026-05-10' / Registra una entrada de tiempo para un proyecto. Requiere projectId, horas (decimal) y fecha. Marca billable=true para incluirlo en la facturacion al cliente.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesWork date ISO 8601 (YYYY-MM-DD) / Fecha del trabajo
hoursYesHours worked (decimal, e.g. 1.5) / Horas trabajadas (decimal)
userIdNoUser ID (defaults to API key owner) / ID del usuario (por defecto el propietario de la API key)
billableNoWhether hours are billable to client (default true) / Si las horas son facturables
projectIdYesProject ID / ID del proyecto
descriptionNoDescription of work done / Descripcion del trabajo realizado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
hoursYes
statusNo
userIdNo
billableNo
createdAtNo
projectIdNo
updatedAtNo
descriptionNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations indicate this is a write operation (readOnlyHint=false) and not destructive (destructiveHint=false). The description aligns with this by stating it 'logs' a time entry, but adds no further behavioral context beyond the example. Given annotations carry the burden, the description is adequate but minimal.

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 two concise sentences (plus bilingual repeat) that front-load the main purpose and key parameters. Every sentence adds value without redundancy or wasted words.

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 tool has an output schema (not shown but indicated true) and 100% schema coverage, the description covers the essential aspects: action, required fields, optional billable, and an example. It is complete enough for an agent to use correctly, though it could mention default behavior for userId or billable more explicitly.

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 input schema has 100% description coverage, explaining each parameter. The description adds value by providing a concrete example (projectId='proj_abc', hours=2.5, etc.), which helps clarify how to format the inputs, exceeding what the schema alone offers.

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 clearly states the tool's action: 'Log a time entry for a project.' It specifies the required fields (projectId, hours, date) and an optional one (billable). This distinguishes it from sibling tools like list_time_entries, get_time_entry, update_time_entry, delete_time_entry, and get_time_summary.

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

Usage Guidelines4/5

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

The description provides clear usage context with an example and highlights when to set billable=true. However, it does not explicitly state when not to use this tool or mention alternatives among siblings.

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

create_vendorCreate VendorA

Create a new vendor/supplier. Requires at minimum a name. Vendors are used when tracking expenses and purchase orders. Example: name='Office Supplies Ltd', email='billing@office.com', taxId='B87654321', address={street:'Gran Via 1', city:'Madrid', country:'ES'} / Crea un nuevo proveedor. Requiere como minimo un nombre. Los proveedores se usan al registrar gastos y pedidos de compra.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVendor/company name / Nombre del proveedor o empresa
emailNoEmail address / Correo electronico
phoneNoPhone number / Telefono
taxIdNoTax ID (NIF/CIF/VAT) / NIF o CIF
addressNoVendor address / Direccion del proveedor

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
emailNo
phoneNo
taxIdNo
addressNo
createdAtNo
updatedAtNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate a non-read-only mutation. The description adds a requirement (minimum a name) and includes an example, which enriches behavioral transparency beyond the annotations. However, it does not detail further behavioral traits like idempotency or side effects.

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

Conciseness4/5

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

The description is efficient with two sentences plus an example. It is front-loaded with the core purpose. The bilingual repetition slightly reduces conciseness, but overall it is clear and compact.

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?

The tool has a modest parameter set (5) with 1 required, and an output schema exists. The description explains the purpose, required field, and usage context. It lacks detail on validation or error handling, but for a simple creation tool, it is reasonably complete.

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 by providing a concrete example with parameter values (name, email, taxId, address), demonstrating the structure and acceptable data. This adds meaning that aids selection and invocation.

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 clearly states 'Create a new vendor/supplier' with a specific verb and resource. It distinguishes from sibling tools like list_vendors, get_vendor, etc., by explicitly stating the creation action.

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 provides context by mentioning that vendors are used when tracking expenses and purchase orders, giving a clear usage scenario. It does not explicitly list alternatives or when not to use, but the context is sufficient for a creation tool with no direct sibling.

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

create_webhookCreate WebhookA

Register a new webhook endpoint. You must specify the URL to receive notifications and which events to subscribe to. Available events: invoice.created, invoice.updated, invoice.paid, invoice.deleted, expense.created, expense.updated, expense.deleted, client.created, client.updated, quote.created, quote.updated, quote.accepted. Example: url='https://example.com/webhook', events=['invoice.created','invoice.paid'], secret='my-secret' / Registra un nuevo endpoint de webhook. Especifica la URL y los eventos a suscribir.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesWebhook endpoint URL / URL del endpoint del webhook
activeNoWhether the webhook is active (default: true) / Si el webhook esta activo
eventsYesEvents to subscribe to (e.g. ['invoice.created', 'invoice.paid']) / Eventos a suscribir
secretNoSigning secret for payload verification / Secreto para verificar las notificaciones

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYes
activeNo
eventsYes
secretNo
createdAtNo
updatedAtNo

TDQS

A4/5.0
Behavior3/5

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

Annotations are minimal (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds context by listing events and mentioning a signing secret, but does not disclose potential side effects (e.g., URL validation, test notification sent), rate limits, or authentication requirements. The description does not contradict annotations.

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

Conciseness3/5

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

The description is concise and includes an example, but is repeated in both English and Spanish, doubling length without adding value. The structure is front-loaded with the main verb and resource, but the bilingual repetition is not efficient.

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 presence of an output schema (not shown), the description does not need to explain return values. It covers the main functionality, required parameters, and available events. It lacks mention of permissions or URL accessibility requirements, but overall is sufficiently complete for a webhook creation tool.

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 adds value by listing all available events and showing an example with url, events, and secret. It also implies the active parameter defaults to true (schema confirms). This goes beyond the schema's basic 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 clearly states 'Register a new webhook endpoint' with specific verb ('register') and resource ('webhook endpoint'). It lists available events and provides an example, distinguishing it from sibling tools like get_webhook, update_webhook, delete_webhook, test_webhook, list_webhooks.

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

Usage Guidelines4/5

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

The description explains what to specify (URL, events, secret) and provides a list of available events. It gives an example usage. However, it does not explicitly state when to use this tool versus alternatives (e.g., update_webhook), nor does it mention prerequisites or context for use.

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

delete_client_contactDelete Client ContactA
DestructiveIdempotent

Permanently delete a contact from a client. This action cannot be undone. / Elimina permanentemente un contacto de un cliente. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientIdYesClient ID / ID del cliente
contactIdYesContact ID / ID del contacto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A3.6/5.0
Behavior3/5

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

The description adds that the deletion is permanent and irreversible, which goes beyond the destructiveHint annotation. However, it does not disclose other behavioral traits like error handling, idempotency behavior, or authorization needs.

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

Conciseness4/5

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

The description is concise, with two short sentences (plus bilingual repetition). It is front-loaded and contains minimal waste, though it could be slightly more streamlined.

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

Completeness3/5

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

For a simple delete operation with two required parameters and an output schema, the description covers the core purpose and irreversibility. However, it lacks details on prerequisites, success/failure behavior, and edge cases.

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?

Input schema covers both parameters with bilingual descriptions, achieving 100% coverage. The description does not add any additional meaning or constraints beyond what the schema already 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 clearly states the action: 'Permanently delete a contact from a client.' It uses a specific verb and resource, and distinguishes from siblings like delete_client or delete_client_note by specifying 'contact'.

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 does not provide explicit guidance on when to use this tool versus alternatives. It only states what it does, leaving the agent to infer usage from the context of sibling tools.

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

delete_client_noteDelete Client NoteA
DestructiveIdempotent

Permanently delete a note from a client. This action cannot be undone. / Elimina permanentemente una nota de un cliente. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteIdYesNote ID / ID de la nota
clientIdYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A3.9/5.0
Behavior4/5

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

Description adds 'cannot be undone' beyond destructiveHint annotation. However, it is bilingual and somewhat repetitive.

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 clear sentences in English followed by Spanish translation. No unnecessary detail, but could be slightly more concise.

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 delete operation, description and schema are sufficient. Output schema exists but not shown; description doesn't need to elaborate return values.

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% with clear descriptions. Description does not add further meaning beyond 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?

Clearly states 'Permanently delete a note from a client' with specific verb and resource. Distinguishes from sibling tools like list_client_notes and create_client_note.

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?

No explicit guidance on when to use vs alternatives or prerequisites. Implied usage is clear but lacks exclusionary context.

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

delete_depositDelete DepositB
DestructiveIdempotent

Permanently delete a deposit by its ID. This action cannot be undone. / Elimina permanentemente un deposito por su ID. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeposit ID / ID del deposito

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds 'cannot be undone,' reinforcing irreversibility. But no additional context about permissions, side effects, or error cases.

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?

English part is succinct and front-loaded. The Spanish translation duplicates content, adding length without new information, slightly reducing conciseness.

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 simple delete operation with one parameter and an output schema, the description fully covers what the agent needs: the action, the irreversibility warning, and the input requirement.

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% for the single parameter 'id'. The description adds no extra meaning beyond the schema's description, so baseline score 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?

The description clearly states the action ('delete') and resource ('deposit'), making the purpose unambiguous. However, it does not differentiate from sibling delete tools (e.g., delete_invoice, refund_deposit), missing an opportunity to guide selection.

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 guidance on when to use this tool versus alternatives like refund_deposit or other delete tools. Lacks prerequisites, exclusions, or context for appropriate use.

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

delete_expenseDelete ExpenseA
DestructiveIdempotent

Permanently delete an expense by its ID. This action cannot be undone. / Elimina permanentemente un gasto por su ID. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID / ID del gasto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds crucial context: 'permanently delete' and 'cannot be undone', which reinforces the irreversible nature. No contradiction with annotations; the description enriches behavioral understanding beyond structured data.

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 concise with two English sentences and two Spanish equivalents. It is front-loaded with the key action. The bilingual repetition is slightly redundant but still efficient. No unnecessary fluff; every phrase adds 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?

Given the simplicity of the tool (one required parameter, no nested objects, and an output schema exists), the description is adequate. It specifies the core action and its irreversibility. For a delete operation, this completes the context needed by an agent, though it could briefly mention the output format.

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 tool description does not add any parameter-specific information beyond what is already in the input schema. The schema covers 100% of parameters with a clear description for 'id'. Thus, the baseline score of 3 is appropriate, as the description adds no extra 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 clearly states the action ('permanently delete') and the resource ('expense by its ID'). The verb 'delete' and the noun 'expense' are specific, and the mention of 'ID' clarifies the input. This distinguishes it from sibling tools like 'update_expense' or 'list_expenses'.

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 implies use when wanting to remove an expense permanently, but it does not explicitly state when to use this tool versus alternatives (e.g., 'update_expense' for modifications). No when-not-to-use guidance is provided. The inclusion of 'This action cannot be undone' hints at caution but is insufficient.

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

delete_invoiceDelete InvoiceA
DestructiveIdempotent

Permanently delete an invoice by its ID. This action cannot be undone. / Elimina permanentemente una factura por su ID. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, but description adds 'permanently delete' and 'cannot be undone', reinforcing the irreversible nature. No contradiction.

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

Conciseness5/5

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

Two concise sentences in English and Spanish, front-loaded with the main action. No unnecessary words.

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 simple delete-by-ID tool with output schema, the description covers essential aspects: action, permanence, and required ID. No gaps.

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 covers 100% of parameters with description, but description adds no additional meaning beyond what 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?

Description clearly states the action (permanently delete) and resource (invoice by ID), distinguishing it from sibling tools like get_invoice or update_invoice.

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 warns that action cannot be undone, but does not provide explicit guidance on when to use this tool vs alternatives (e.g., credit notes) or when not to use it.

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

delete_productDelete ProductA
DestructiveIdempotent

Permanently delete a product by its ID. This action cannot be undone. / Elimina permanentemente un producto por su ID. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProduct ID / ID del producto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds emphasis on the permanent nature ('cannot be undone'), which reinforces the destructive behavior. It does not contradict annotations and provides additional context beyond what annotations offer.

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 extremely concise: two sentences (plus Spanish translation) that front-load the action and parameter. No wasted words; every sentence serves a purpose.

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

Completeness5/5

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

Given the simplicity of the tool (1 parameter, clear annotations, output schema exists), the description is complete. It explains the action, the necessary parameter, and the irreversible consequence. No additional information is needed.

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 the 'id' parameter. The description does not add any additional meaning beyond what is in the schema. 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 clearly states the action: 'Permanently delete a product by its ID.' It specifies the resource (product) and the operation (delete), distinguishing it from sibling tools like update_product or get_product. The information is specific and unambiguous.

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

Usage Guidelines2/5

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

The description does not provide any guidance on when to use this tool vs alternatives. It lacks context about prerequisites, conditions, or exclusions. The warning about irreversibility is helpful but does not constitute usage guidelines.

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

delete_quoteDelete QuoteA
DestructiveIdempotent

Permanently delete a quote by its ID. This action cannot be undone. / Elimina permanentemente un presupuesto por su ID. Esta accion no se puede deshacer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesQuote ID / ID del presupuesto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds that deletion is permanent and cannot be undone, providing additional context beyond annotations. No contradictions noted. No mention of authentication or rate limits, but for a simple delete this is sufficient.

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

Conciseness4/5

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

The description is very short and front-loaded with the key action. The Spanish repetition is somewhat redundant but serves a multilingual audience. Every sentence is meaningful, though could be slightly more compact.

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 that an output schema exists (context signal true), the description does not need to explain return values. It covers the destructive nature and irreversibility. It could mention prerequisites or error scenarios, but for a delete operation the information is adequate.

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%: the single parameter 'id' is described as 'Quote ID / ID del presupuesto'. The description adds no further meaning or examples beyond what the schema already provides, so baseline score 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 clearly states the action ('delete') and resource ('quote'), specifying it is permanent and by ID. It distinguishes from sibling tools like 'update_quote' or 'get_quote'. The bilingual text does not hinder clarity.

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 does not explicitly state when to use this tool versus alternatives. It implies usage when intending to delete a quote, but lacks guidance on when not to use it (e.g., if deletion is not allowed due to dependencies). No comparison with sibling tools is provided.

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

delete_recurring_invoiceDelete Recurring InvoiceA
DestructiveIdempotent

Permanently delete a recurring invoice template. This does NOT delete previously generated invoices — only the template and future scheduled runs. Requires confirm=true to prevent accidental deletion. / Elimina permanentemente una plantilla de factura recurrente. No elimina facturas ya generadas — solo la plantilla y las ejecuciones futuras. Requiere confirm=true para evitar eliminaciones accidentales.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecurring invoice template ID / ID de la plantilla
confirmYesMust be true to confirm deletion / Debe ser true para confirmar la eliminacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true and readOnlyHint=false; description adds nuance: 'Permanently delete... only the template and future scheduled runs. Requires confirm=true to prevent accidental deletion.' Adds behavioral detail beyond 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 short, front-loaded sentences. Bilingual but no waste. Every sentence earns its place – scope, exclusions, safety requirement.

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 deletion tool with output schema, description covers scope (template only), permanence, safety (confirm flag). No gaps given annotations and 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 100% with descriptions for both parameters. Description reinforces the confirm parameter's purpose ('Requires confirm=true') and implicitly links id to the template. Adds value beyond 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?

Clearly states 'Permanently delete a recurring invoice template' – specific verb+resource. Also clarifies scope (does not delete generated invoices), distinguishing it from delete_invoice and other delete 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?

Explains what it does and does not do (template vs generated invoices) and notes the required confirm=true. Provides clear context, though no explicit alternatives or when-not-to-use.

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

delete_time_entryDelete Time EntryA
DestructiveIdempotent

Soft-delete a time entry by ID. Requires confirm=true to prevent accidental deletion. Deleted entries are excluded from billing reports but retained for audit. / Elimina (soft-delete) una entrada de tiempo por su ID. Requiere confirm=true para evitar eliminaciones accidentales. Las entradas eliminadas se excluyen de informes de facturacion pero se retienen en auditoria.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTime entry ID / ID de la entrada de tiempo
confirmYesMust be true to confirm deletion / Debe ser true para confirmar la eliminacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond annotations (destructiveHint, idempotentHint), the description reveals it's a soft-delete, that deleted entries are excluded from billing reports but retained for audit. This adds valuable behavioral context not captured by annotations.

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 bilingual, doubling its length, but each sentence adds value: defines the operation, the requirement, and the impact. It is front-loaded with purpose and concisely explains consequences.

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

Completeness5/5

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

Given the presence of an output schema, the description need not cover return values. It explains the core effect (soft-delete) and relevant business impact (exclusion from billing, audit retention), making it fully informative for a delete operation.

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% with bilingual descriptions. The description adds meaning by explaining confirm=true's purpose (prevent accidental deletion), which is not in the schema descriptions. This goes beyond the baseline for full schema coverage.

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?

Description clearly states 'Soft-delete a time entry by ID', specifying the action (soft-delete), resource (time entry), and scope (by ID). This distinguishes it from sibling tools like create_time_entry, update_time_entry, and other delete_* 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?

Explicitly states 'Requires confirm=true to prevent accidental deletion', guiding the agent to always set confirm=true. While it doesn't contrast with alternatives, the requirement is clear and contextually sufficient.

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

delete_vendorDelete VendorA
DestructiveIdempotent

Permanently delete a vendor by their ID. This action cannot be undone. Warning: this may affect existing expenses referencing this vendor. / Elimina permanentemente un proveedor por su ID. Esta accion no se puede deshacer. Advertencia: puede afectar a gastos existentes que referencien este proveedor.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVendor ID / ID del proveedor

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, but the description adds specific context: 'cannot be undone' and 'may affect existing expenses referencing this vendor'. This provides behavioral transparency beyond annotations, though no details on authorization or return value are given (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?

The description is concise, front-loaded with the key action in English, and includes a warning. The bilingual repetition adds slight redundancy but does not detract significantly. Every sentence provides essential 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?

With one parameter, an output schema, and annotations covering safety traits, the description adequately covers the tool's purpose and key behavioral warning. It mentions the main side effect (affecting expenses), which is sufficient for the tool's simplicity.

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 input schema has 100% coverage with a single required 'id' parameter. The description mentions 'by their ID' but does not add any additional semantics or constraints 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 clearly states the verb 'delete' and the resource 'vendor', and specifies the action is permanent. It distinguishes from sibling tools like 'list_vendors', 'get_vendor', 'create_vendor', and 'update_vendor' by focusing on deletion.

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 warns that the action cannot be undone and may affect existing expenses, providing implicit usage guidance. However, it does not explicitly state when to use this tool versus alternatives or when not to use it (e.g., if vendor has pending expenses).

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

delete_webhookDelete WebhookA
DestructiveIdempotent

Permanently delete a webhook by its ID. Notifications will stop immediately. / Elimina permanentemente un webhook por su ID. Las notificaciones se detendran inmediatamente.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID / ID del webhook

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
successYes

TDQS

A4.1/5.0
Behavior4/5

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

Adds context beyond annotations by stating 'Notifications will stop immediately', aligning with destructiveHint. No contradiction with annotations.

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

Conciseness5/5

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

Two short, clear sentences front-loading the action and effect. Bilingual redundancy is acceptable for scope.

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

Completeness5/5

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

Given the simple delete operation, one parameter, annotations present, and output schema exists, the description fully covers necessary context.

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 (id) which is fully described in the schema. The description adds no additional meaning beyond the schema's bilingual description.

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

Purpose5/5

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

Clearly states 'Permanently delete a webhook by its ID', specifying the verb and resource. Differentiates from sibling tools like get_webhook, create_webhook, update_webhook, and test_webhook.

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 use when wanting to permanently remove a webhook, but does not explicitly specify when not to use or mention alternatives like update_webhook for temporary disabling.

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

duplicate_invoiceDuplicate InvoiceA

Duplicate an existing invoice for a new period. Copies all line items, client data, tax rate, and notes. Strips the original ID, document number, status, and timestamps. The new invoice starts as 'draft' with today's date (or the provided date). Perfect for recurring invoices — duplicate last month's invoice and adjust if needed. / Duplica una factura existente para un nuevo periodo. Copia conceptos, cliente, impuestos y notas. La nueva factura empieza como 'borrador' con fecha de hoy.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the invoice to duplicate / ID de la factura a duplicar
newDueDateNoDue date for the new invoice (YYYY-MM-DD) / Fecha de vencimiento de la nueva factura
newIssueDateNoIssue date for the new invoice (YYYY-MM-DD), defaults to today / Fecha de emision de la nueva factura

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

The description details what is copied (line items, client, tax rate, notes) and what is stripped (original ID, document number, status, timestamps), plus the new invoice starts as 'draft'. Annotations (destructiveHint: false) align with non-destructive creation, and the description adds valuable behavioral context beyond annotations.

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 bilingual, front-loaded with the core action, and each sentence adds value. It is appropriately sized, though the Spanish repetition slightly reduces conciseness.

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 tool's complexity (duplicating with several field groups) and the presence of an output schema, the description covers the key aspects: what is copied, what is reset, and the resulting draft status. It is sufficient for an agent to understand the tool's behavior.

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 sufficiently documents parameters. The description adds limited extra meaning: it mentions the new invoice defaults to today's date and allows providing a due date, but does not elaborate on the id parameter beyond what's in the schema.

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

Purpose5/5

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

The description clearly states it duplicates an existing invoice for a new period, copying line items and client data while stripping identifiers and resetting status. This distinguishes it from siblings like create_invoice (new from scratch) or update_invoice (modify existing).

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 suggests usage for recurring invoices ('Perfect for recurring invoices — duplicate last month's invoice and adjust if needed.'), providing clear context. However, it does not mention when not to use it or alternatives like create_invoice for new invoices.

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

einvoice_exportExport E-Invoice XMLA
Read-onlyIdempotent

Export an invoice as e-invoicing XML in a specific format. Supports Facturae (ES B2G), XRechnung-CII (DE), XRechnung-UBL (DE), Factur-X profiles (FR), FatturaPA (IT), PEPPOL-BIS-3 (EU network), UBL and CII (generic). For Facturae, set signed=true to get XAdES-enveloped XML for FACe/AEAT submission. Returns a signed download URL valid for 24 hours.

/ Exporta una factura como XML de facturacion electronica en el formato especificado. Para Facturae con signed=true devuelve XML firmado XAdES para envio a FACe/AEAT.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatYesE-invoice format. Choose based on recipient country: ES B2G→facturae, DE→xrechnung-cii/ubl, FR→facturx-*, IT→fatturapa, EU PEPPOL→peppol-bis-3, generic→ubl or cii / Formato de factura electronica.
signedNoIf true, returns XAdES-enveloped signed XML (Facturae only). Requires workspace signing certificate configured. / Si true, devuelve XML firmado XAdES (solo Facturae). Requiere certificado de firma configurado.
invoiceIdYesFrihet invoice ID to export / ID de la factura a exportar

Output Schema

ParametersJSON Schema
NameRequiredDescription
xmlYesRaw e-invoice XML content (the document itself, returned inline by the CF)
formatYesE-invoice format used (echoes the requested format)
signedYesWhether XAdES signature was applied (Facturae + signed=true only)
filenameYesSuggested filename (e.g. INV-2026-001_Facturae.xml)
contentTypeYesMIME type of the XML payload (application/xml)

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. The description adds that signed XML for Facturae requires a workspace signing certificate and returns a signed download URL valid for 24 hours, which are important behavioral traits 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.

Conciseness4/5

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

The description is front-loaded with key information in English, followed by Spanish translation. While slightly longer due to bilingual content, every sentence adds value and no information 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 an output schema present, the description need not cover return values. It adequately covers purpose, format selection, signed behavior, and URL expiration. Minor gap: does not mention potential error conditions or prerequisites beyond cert for signed Facturae.

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 100%, but the description adds significant value: it explains how to choose format based on recipient country, clarifies that signed only applies to Facturae, and mentions certificate configuration requirement. This goes beyond the schema's enum and type info.

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 clearly states the tool exports an invoice as e-invoicing XML, lists supported formats, and specifies the signed option. It distinguishes itself from siblings like send_einvoice and validate_einvoice_xml by focusing on generating the XML file.

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?

Provides per-country format guidance (e.g., ES->facturae, DE->xrechnung-cii/ubl) and explains the signed parameter's use case. Does not explicitly mention when not to use or alternatives, but the context is sufficient for correct selection.

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

export_datevExport DATEVA
Read-onlyIdempotent

Export accounting data in DATEV EXTF format for import into DATEV Kanzlei-Rechnungswesen or compatible systems. Returns a signed download URL valid for 24 hours.

Supported EXTF formats: • extf-buchungsstapel — Journal entries (Buchungsstapel) — most common, use for P&L/tax • extf-debitoren — Accounts receivable master data (Debitoren-/Kreditorenstamm AR) • extf-kreditoren — Accounts payable master data (Debitoren-/Kreditorenstamm AP)

Output encoding is always CP1252 per DATEV EXTF specification. Date range: both periodStart and periodEnd must be ISO 8601 dates (YYYY-MM-DD).

If the DATEV export backend is not deployed for this workspace, returns an honest 'unavailable' response — never a fabricated file URL. / Exporta datos contables en formato DATEV EXTF para importacion en DATEV o sistemas compatibles.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatYesDATEV EXTF export format: extf-buchungsstapel (journal entries), extf-debitoren (AR master), extf-kreditoren (AP master) / Formato EXTF de DATEV.
periodEndYesEnd of the export period (ISO 8601 YYYY-MM-DD). Inclusive. / Fin del periodo de exportacion (YYYY-MM-DD). Inclusivo.
periodStartYesStart of the export period (ISO 8601 YYYY-MM-DD). Inclusive. / Inicio del periodo de exportacion (YYYY-MM-DD). Inclusivo.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileUrlYesSigned URL to download the DATEV EXTF file
encodingYesFile encoding — always CP1252 per DATEV EXTF spec
filenameYesSuggested filename (e.g. EXTF_Buchungsstapel_2026-01.csv)
rowCountYesNumber of accounting rows in the export
fiscalPeriodYesFiscal period covered (e.g. '2026-01' or '2026-Q1')

TDQS

A4/5.0
Behavior4/5

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

Annotations already convey safety (readOnlyHint, idempotentHint). The description adds important operational details: signed download URL valid 24 hours, CP1252 encoding, and honest backend availability response. These go beyond what annotations specify.

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

Conciseness3/5

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

The description is informative but verbose due to bilingual repetition (English and Spanish). Key information is front-loaded, but the dual-language text makes it longer than necessary.

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

Completeness4/5

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

Given the presence of an output schema and complete parameter coverage, the description covers essential aspects: purpose, available formats, date constraints, encoding, and backend behavior. It does not need to document return structure.

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%, but the description adds value by explaining each format's purpose in plain language, specifying ISO 8601 and inclusive date range, and noting output encoding – details not in the schema.

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

Purpose5/5

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

The description clearly states 'Export accounting data in DATEV EXTF format' with a specific verb and resource. It lists three distinct export formats, uniquely identifying this tool among siblings (no other DATEV-specific 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?

No explicit when-to-use or when-not-to-use guidance is provided. While the description mentions compatibility with DATEV Kanzlei-Rechnungswesen, it does not compare the tool to sibling export utilities like einvoice_export or face_submit.

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

face_statusGet FACe Submission StatusA
Read-onlyIdempotent

Poll the status of a FACe (Spain B2G) invoice submission. Returns the current FACe portal state code, description, and the registro number.

Common FACe status codes: • 1200 — Registrada / Registered (submission received) • 1300 — En proceso de contabilización / In accounting (being processed) • 1400 — Contabilizada / Accounted (approved, awaiting payment) • 2400 — Anulada / Cancelled • 3100 — Rechazada / Rejected (check rejectionReason)

/ Consulta el estado de un envío a FACe. Devuelve el código de estado, descripción y número de registro.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoiceIdYesFrihet invoice ID (same as used in face_submit) / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
codigoYesFACe status code (e.g. '1200'=Registrada, '1400'=Contabilizada, '3100'=Rechazada)
motivoYesReason/motive associated with the current status (e.g. rejection motive)
descripcionYesHuman-readable FACe status description
numeroRegistroYesFACe registration number for this submission
estadoTramitacionYesFACe processing-state code (estado de tramitación)

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive. Description adds 'Poll' which aligns but no extra details on rate limits, authentication, or side effects.

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

Conciseness4/5

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

Concise English paragraph with useful status code list. Spanish translation is somewhat redundant but acceptable. Well front-loaded.

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 output schema exists and annotations are present, description covers purpose, return values, and common status codes for interpretation. Adequate for a polling 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?

Single parameter invoiceId has 100% schema coverage with description matching. Description does not add further semantics beyond what the schema already provides.

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

Purpose5/5

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

Title and description clearly state 'Poll the status of a FACe invoice submission' with specific verb and resource. Distinguishes from sibling tools like face_submit and other status tools.

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?

Description implies polling but lacks explicit when-to-use vs alternatives. While the FACe context is clear, no guidance on when not to use or comparisons to get_einvoice_status or ticketbai_status.

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

face_submitSubmit to FACe (Spain B2G)A

Submit a Facturae-formatted invoice to the Spanish FACe (Punto General de Entrada de Facturas Electrónicas) B2G portal. The invoice must have a recipient with DIR3 administrative unit codes (órgano gestor, unidad tramitadora, oficina contable). Returns a submission reference (registro) that can be used with face_status to poll the portal.

Modes: • mock — local simulation only, no network call (safe for dev/test) • sandbox — FACe pre-production endpoint (requires sandbox credentials) • production — live FACe SOAP endpoint (default)

/ Envía una factura Facturae al portal FACe del Estado español. Requiere códigos DIR3 en el destinatario (órgano gestor, unidad tramitadora, oficina contable). Devuelve el número de registro para consulta de estado con face_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoSubmission mode: mock (local sim), sandbox (FACe pre-prod), production (live). Default: production. / Modo de envío: mock (simulación local), sandbox (pre-producción FACe), production (real). Por defecto: production.
invoiceIdYesFrihet invoice ID to submit / ID de la factura a enviar a FACe

Output Schema

ParametersJSON Schema
NameRequiredDescription
codigoYesFACe result code returned by the portal (resultado.codigo)
statusYesSubmission accepted by FACe (the CF returns an error otherwise)
idempotentNoTrue if this echoes a prior already-registered submission (no resubmission occurred)
descripcionYesHuman-readable FACe result description (resultado.descripcion)
numeroRegistroYesFACe registration number (número de registro) returned by the portal

TDQS

A3.7/5.0
Behavior3/5

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

The description adds value beyond annotations by detailing the three modes and the requirement for DIR3 codes. Annotations are minimal (no readOnly, destructive, idempotent hints contradicted), so the description carries the burden but does not fully disclose potential side effects or idempotency behavior.

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 concise, front-loaded with English, and includes a Spanish translation. Each sentence adds value, though the bilingual format slightly increases length. No unnecessary fluff.

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 presence of an output schema and the tool's specific domain, the description covers prerequisites (DIR3), modes, return value, and references the sibling tool for subsequent status polling. It is sufficiently comprehensive for an agent to invoke correctly.

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

Parameters3/5

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

Schema coverage is 100% and both parameters have descriptions in the schema. The description provides additional context for the 'mode' parameter (e.g., default is production, mock is safe) but largely repeats schema information. 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 clearly states it submits a Facturae invoice to the Spanish FACe B2G portal, with specific prerequisites (DIR3 codes) and return value. It distinguishes itself from the sibling face_status by noting the returned reference can be used with that 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?

The description explains the three modes (mock, sandbox, production) with guidance on when each is appropriate, including that mock is safe for dev/test. However, it does not explicitly state when to use this tool versus alternatives (e.g., face_status for polling) or provide exclusions.

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

frihet_aiem_calculateCalculate AIEM (Arbitrio Importación Canarias)A
Read-onlyIdempotent

Calculate the AIEM (Arbitrio sobre Importaciones y Entrega de Mercancias) for goods imported to or produced in the Canary Islands. Returns applicable AIEM rate, tax base, and amount due for the given product. AIEM is a Canarian surcharge on top of IGIC for protected local industries. Example: ncCode='8471', amount=1000, description='Ordenadores portatiles'. / Calcula el AIEM para mercancias importadas o producidas en Canarias. Devuelve tipo aplicable, base imponible y cuota. El AIEM protege la industria local canaria.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesTaxable base amount in EUR / Base imponible en EUR
ncCodeYesNomenclatura Combinada (NC) tariff code / Codigo NC (nomenclatura combinada)
descriptionNoProduct description for audit reference / Descripcion del producto (referencia auditoria)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, non-destructive. The description adds that it returns rate, base, and amount due, and explains the regional context. This goes beyond annotations without contradicting them.

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

Conciseness5/5

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

Two sentences per language plus an example, no fluff. Front-loaded with essential info. Every sentence adds 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?

Given the presence of an output schema (not shown but implied) and full schema coverage, the description is complete enough. It explains the tax, region, returns, and gives an example. Could mention rate source but that's minor.

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 parameters are well-documented. The description reinforces with an example (ncCode='8471', amount=1000), adding practical value.

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 clearly states the tool calculates AIEM for goods in the Canary Islands, using a specific verb and resource. It distinguishes from siblings (e.g., get_modelo_180_summary) by focusing on a specific tax calculation rather than summary reports.

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 tells when to use it (calculate AIEM for a product) and provides context about AIEM being a surcharge over IGIC for protected industries. It lacks explicit when-not-to-use or alternatives, but the purpose is clear and no sibling directly competes.

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

frihet_bank_rule_createCreate Bank Categorization RuleA

Create a new bank auto-categorization rule. Rules apply automatically to matching incoming transactions. A rule has conditions (AND logic) and actions (assign category, tag, or client). Example: name='Mercadona groceries', condition description contains 'MERCADONA', action category='groceries'. / Crea una nueva regla de categorizacion automatica de transacciones bancarias. Las reglas aplican condiciones (logica AND) y acciones (categoria, etiqueta, cliente).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRule name for identification / Nombre de la regla
actionsYesActions to apply when rule matches / Acciones a aplicar cuando la regla se cumple
isActiveNoWhether the rule is active (default true) / Si la regla esta activa (por defecto true)
conditionsYesRule conditions (AND logic — all must match) / Condiciones (logica AND — todas deben cumplirse)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate mutation (readOnlyHint=false) and non-destructiveness. The description adds that rules apply automatically and use AND logic, providing helpful behavioral context beyond 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 concise with three sentences and an example. It is front-loaded with purpose. The bilingual version adds no harm but is not essential. Every part serves a purpose.

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 presence of an output schema and full parameter descriptions, the description covers the essential logic and provides an example. It does not mention prerequisites or error cases, but overall is sufficient for use.

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 100% schema description coverage, baseline is 3. The description adds an example and explains the AND logic for conditions, enhancing understanding beyond schema 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?

The description clearly states the tool creates a bank auto-categorization rule. It distinguishes from siblings like 'frihet_bank_rules_list' by focusing on creation. The example illustrates the purpose well.

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 explicitly states when to use the tool (to create a rule) and provides an example. It does not discuss when not to use or alternatives, but the context is clear.

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

frihet_bank_rules_listList Bank Categorization RulesA
Read-onlyIdempotent

List all bank auto-categorization rules for the workspace. Rules automatically categorize transactions matching conditions (description, amount, counterparty). Returns rule name, conditions, actions (category/tag/client assign), and active status. / Lista las reglas de categorizacion automatica de transacciones bancarias del workspace. Devuelve nombre, condiciones, acciones (categoria/etiqueta/cliente) y estado activo.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results / Resultados maximos
offsetNoOffset / Desplazamiento
isActiveNoFilter by active/inactive rules / Filtrar por reglas activas/inactivas

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and idempotentHint, covering safety. The description adds that it lists all rules (no default filter) and describes return fields, which is useful but not extensive behavioral context beyond 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 English sentences front-load the purpose and output, followed by a Spanish translation. No wasted words; ideal structure.

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

Completeness5/5

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

Given the output schema exists, the description adds useful context about return fields. For a list tool with clear parameters and annotations, this is fully adequate.

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?

All three parameters are fully described in the schema (100% coverage). The description does not add parameter-specific semantics beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

The description clearly specifies the action ('List all') and the resource ('bank auto-categorization rules for the workspace'). It distinguishes from sibling 'frihet_bank_rule_create' and other list tools by focusing on workspace rules. The bilingual text adds no ambiguity.

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 usage is implied: use when you need to view existing auto-categorization rules. However, there is no explicit 'when not to use' or comparison with alternatives. The output description helps but lacks direct guidance on selection among siblings.

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

frihet_gl_entry_approveApprove GL EntryA
Idempotent

Approve a General Ledger journal entry pending review. Sets entry status to 'approved' and records the approver + timestamp in the audit trail. Requires gestor/admin role. This is a TRUST AREA action — double-check entry ID before calling. Example: entryId='gl_2026_q1_042'. / Aprueba un asiento contable pendiente de revision. Requiere rol gestor/admin. Accion de area de confianza.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional approval notes / Notas de aprobacion opcionales
entryIdYesGL entry ID to approve / ID del asiento contable a aprobar

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations (idempotentHint=true, destructiveHint=false) are not contradicted. The description adds important behavioral context: role requirement, trust area, and what the action does (updates status, records audit trail). No annotation contradiction.

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

Conciseness3/5

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

The description is relatively short but unnecessarily includes a full Spanish translation after the English part, creating redundancy. It could be more concise by using one language or a shorter format.

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

Completeness5/5

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

Given the tool has only 2 parameters, an output schema, and moderately rich annotations, the description fully covers purpose, effect, role requirements, and a usage warning. No significant gaps.

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 description adds minimal extra meaning. It provides an example entry ID ('gl_2026_q1_042') but otherwise repeats schema info.

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 clearly states the action ('Approve a General Ledger journal entry'), the resource, and the effect ('Sets entry status to 'approved' and records the approver + timestamp'). It distinguishes from sibling tool 'frihet_gl_entry_reject'.

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 specifies required role ('gestor/admin'), warns it's a 'TRUST AREA action', and advises to double-check entry ID. It provides context for when to use but does not explicitly list situations when not to use (beyond the trust area warning).

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

frihet_gl_entry_audit_logGet GL Entry Audit LogA
Read-onlyIdempotent

Retrieve the full audit trail for a General Ledger entry — all state transitions (created, submitted, approved, rejected), who acted, and when. Use this to investigate approval history or compliance audits. Example: entryId='gl_2026_q1_042'. / Obtiene el historial de auditoría completo de un asiento contable. Muestra todas las transiciones de estado, quien actuo y cuando.

ParametersJSON Schema
NameRequiredDescriptionDefault
entryIdYesGL entry ID / ID del asiento contable

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 idempotentHint=true. Description adds valuable context about the content of the audit trail (state transitions, actors, timestamps) and provides an example, going beyond what annotations convey.

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 plus a relevant example. No superfluous content. Spanish translation adds little value but does not harm. Front-loaded with key 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 simple read-only tool with one parameter, the description is complete. Annotations cover safety, output schema exists, and the description adequately describes the return value (audit trail).

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 (entryId) with full schema coverage (100%). The description does not add meaning beyond the schema's description; the example is helpful but not essential. 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?

Clearly states the action ('Retrieve') and resource ('full audit trail for a General Ledger entry'). Specifies exact data returned (state transitions, actors, timestamps) and provides an example. Distinct from sibling tools like frihet_gl_entry_approve.

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 directs use for 'investigate approval history or compliance audits.' No exclusions or alternatives are needed given the tool's uniqueness; the context is clear.

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

frihet_gl_entry_rejectReject GL EntryA
Idempotent

Reject a General Ledger journal entry pending review with a required reason. Sets entry status to 'rejected' and records the rejector + reason in the audit trail. Requires gestor/admin role. This is a TRUST AREA action. Example: entryId='gl_2026_q1_042', reason='Importe incorrecto, revisar factura F-2026-042'. / Rechaza un asiento contable pendiente con una razon obligatoria. Requiere rol gestor/admin.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesMandatory rejection reason (visible to submitter) / Razon del rechazo (obligatoria, visible al emisor)
entryIdYesGL entry ID to reject / ID del asiento contable a rechazar

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Beyond annotations (idempotentHint true, destructiveHint false), description explains it sets status to 'rejected' and records rejector+reason in audit trail. Adds TRUST AREA context. No contradictions.

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 covering purpose, effect, role, and example. Bilingual without redundancy. Every sentence adds necessary information; 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 output schema present and annotations, description covers core aspects: action, effects, requirements, and example. Slight omission of output details, but output schema compensates. Reasonable completeness.

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 has 100% description coverage. Description adds an example (entryId='gl_2026_q1_042', reason='Importe incorrecto...') that clarifies expected formats and usage, adding value beyond 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?

Clearly states 'Reject a General Ledger journal entry pending review', specifying the action and resource. Distinguishes from sibling tools like 'frihet_gl_entry_approve' (approve) and 'frihet_gl_entry_audit_log' (audit log).

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?

Specifies role requirement ('gestor/admin role') and mandatory reason. Implicitly contrasts with approve/audit tools by naming the action. Could explicitly state when not to use, but context is clear enough.

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

frihet_modelo_200_summaryGet Modelo 200 Summary (Corporate Tax — Annual IS)A
Read-onlyIdempotent

Get Modelo 200 summary — annual corporate income tax return (Impuesto sobre Sociedades) for Spanish SLs and SAs. Returns taxable base, deductions, tax rate, withholdings, installment payments made (M202), and net payable/refundable. Filing deadline: 25 days after 6 months from fiscal year end (typically 25 July for Dec FY). Example: year='2025'. / Resumen Modelo 200 — declaracion anual del Impuesto sobre Sociedades para SL/SA. Devuelve base imponible, deducciones, tipo, retenciones, pagos fraccionados y cuota.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFiscal year (e.g. '2025', defaults to last closed year) / Ejercicio fiscal (ej. '2025', por defecto ultimo ejercicio cerrado)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the agent knows it's safe. The description adds value by detailing the returned data fields and providing a usage example (year='2025') and deadline, enhancing transparency beyond 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 two sentences in English and two in Spanish, front-loaded with purpose and key details. Every sentence adds value (purpose, returned fields, deadline, example). No wasted words.

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 is complete for a simple read tool with one parameter and an output schema (present but not shown). It covers purpose, target users, deadline, example, and parameter meaning. No gaps.

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 schema already describes the 'year' parameter. The tool description adds an example ('year="2025"') which is helpful but not essential. 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 clearly states it 'Get Modelo 200 summary' for annual corporate income tax return, lists returned fields (taxable base, deductions, tax rate, etc.), and distinguishes from other tax summary tools via the sibling list. The verb and resource are specific.

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 identifies the target users (Spanish SLs and SAs) and gives the filing deadline, providing clear context. It does not explicitly state when not to use it, but the sibling list implies alternatives for other tax forms.

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

frihet_modelo_202_summaryGet Modelo 202 Summary (Corporate Tax — Installment Payments)A
Read-onlyIdempotent

Get Modelo 202 summary — installment payments (pagos fraccionados) for Impuesto sobre Sociedades. Three annual payments: April (1P), October (2P), December (3P). Returns each installment amount, due date, payment status, and cumulative total vs M200 projection. Example: year='2026', installment='1P'. / Resumen Modelo 202 — pagos fraccionados del Impuesto sobre Sociedades. Tres plazos: abril (1P), octubre (2P), diciembre (3P). Devuelve importes, plazos y estado de pago.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFiscal year of the installments (e.g. '2026') / Ejercicio de los pagos fraccionados (ej. '2026')
installmentNoSpecific installment (1P=April, 2P=October, 3P=December) or omit for all three / Plazo especifico (1P=abril, 2P=octubre, 3P=diciembre) u omitir para los tres

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, not destructive. Description adds specific behavioral details: returns installment amounts, due dates, payment status, and cumulative total vs M200 projection. Also explains the three payments. This goes beyond what annotations provide.

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

Conciseness4/5

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

Description is front-loaded with purpose and includes an example. The repetition in Spanish is acceptable for a bilingual context but adds length. Overall concise with no wasted words.

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

Completeness5/5

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

Given the tool's simplicity, annotations covering safety, and a complete input schema, the description fully explains the tool's behavior and output. It mentions cumulative total vs M200 projection, which is additional useful context.

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 description adds an example and explains the enum values (1P=April, etc.), but the parameter descriptions in the schema already cover what they do. The description doesn't add significant new meaning beyond the schema.

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

Purpose5/5

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

Clearly states it gets a summary for Modelo 202 installment payments, specifies the three installments (1P, 2P, 3P) and what is returned (amounts, due dates, status, cumulative total vs M200 projection). Distinguishes from other modelo summaries by naming the specific form.

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?

Provides an example and describes the tool's purpose, but does not explicitly state when to use this tool versus alternatives (e.g., other modelo summaries like 200, 180). No guidelines on prerequisites or limitations.

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

frihet_modelo_415_summaryGet Modelo 415 Summary (IGIC Annual Operations >€3,005)A
Read-onlyIdempotent

Get IGIC Modelo 415 summary — annual declaration of operations with third parties exceeding €3,005. Canary Islands equivalent of Modelo 347 (peninsular Spain). Returns counterparty list, operation totals, and filing deadline. Example: year='2025'. / Resumen del Modelo 415 IGIC — declaracion anual de operaciones con terceros > €3.005. Equivalente canario del Modelo 347. Devuelve listado de contrapartes, totales y plazo.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoTax year (e.g. '2025', defaults to previous year) / Ejercicio fiscal (ej. '2025', por defecto ejercicio anterior)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations indicate readOnlyHint, idempotentHint, and not destructiveHint. The description adds that it returns a counterparty list, operation totals, and filing deadline, which aligns with read-only behavior. However, it does not elaborate on other behaviors like data freshness or authentication requirements beyond the annotation hints.

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

Conciseness4/5

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

The description is concise, with two brief sentences in English followed by a Spanish translation. It is front-loaded with the essential information, though the bilingual duplication adds minor length without extra content.

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

Completeness5/5

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

Given the simple parameter set (1 optional param), annotations, and presence of an output schema, the description adequately covers the tool's behavior: it specifies the return types (counterparty list, totals, deadline) and includes an example. No further context is needed for a read-only summarization 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?

The sole parameter 'year' is fully described in the schema (100% coverage) with an example and default behavior. The description reiterates the example 'year='2025'' but adds no additional semantic meaning beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool retrieves an IGIC Modelo 415 summary, an annual declaration of operations with third parties over €3,005 in the Canary Islands, distinguishing it from similar models like Modelo 347 for peninsular Spain. The verb 'Get' and specified resource 'Modelo 415 Summary' provide clear purpose.

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 explicitly equates this to the Canary Islands equivalent of Modelo 347, guiding when to use this tool versus other fiscal declaration summaries. It also notes the €3,005 threshold, implying when it applies, but does not explicitly state when not to use it or list direct alternatives.

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

frihet_modelo_418_summaryGet Modelo 418 Summary (IGIC Monthly Large Enterprises)A
Read-onlyIdempotent

Get IGIC Modelo 418 summary — monthly IGIC return for large enterprises (grandes empresas) in the Canary Islands. Returns monthly IGIC collected, deductible, net due, and any carryover. Applicable when annual turnover exceeds the grandes empresas threshold. Example: period='2026-04'. / Resumen del Modelo 418 IGIC — declaracion mensual para grandes empresas en Canarias. Devuelve IGIC repercutido, soportado, cuota a ingresar y saldo a compensar.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoPeriod in YYYY-MM format (defaults to last month) / Periodo YYYY-MM (por defecto mes anterior)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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 idempotentHint=true. Description adds specific return fields (collected, deductible, net due, carryover), complementing annotations well.

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

Conciseness4/5

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

Two concise English sentences followed by Spanish translation. Core purpose front-loaded. Bilingual redundancy acceptable; no wasted words.

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-optional-param read tool with full schema coverage, annotations, and output schema. All necessary information provided.

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 covers parameter fully with 100% coverage. Description reinforces format with example period='2026-04', but adds no new semantic detail beyond 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?

Clear verb+resource+scope: 'Get IGIC Modelo 418 summary' for large enterprises in Canary Islands. Distinguishes from other tax model tools like get_modelo_303_summary.

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

Usage Guidelines4/5

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

States applicable condition: annual turnover exceeds 'grandes empresas' threshold. Provides example period. No explicit alternatives but context implies exclusive use for IGIC large enterprises.

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

frihet_modelo_425_summaryGet Modelo 425 Summary (IGIC Annual Recap)A
Read-onlyIdempotent

Get IGIC Modelo 425 summary — annual IGIC recap for Canary Islands businesses. Returns aggregated IGIC collected, deductible IGIC, net payable, and filing status. Example: year='2025'. / Resumen del Modelo 425 IGIC — resumen anual IGIC para empresas canarias. Devuelve IGIC repercutido, IGIC soportado, cuota neta y estado de presentacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoTax year (e.g. '2025', defaults to previous year) / Ejercicio fiscal (ej. '2025', por defecto ejercicio anterior)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, so the description does not need to repeat these. The description adds useful behavioral context by specifying the exact data returned (aggregated IGIC fields), which aligns with the read-only expectation and adds clarity 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.

Conciseness4/5

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

The description is concise, with two clear sentences in English followed by a Spanish translation. It is front-loaded with purpose and quickly lists outputs. The bilingual content adds length but is appropriate for the target audience.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter, output schema present, comprehensive annotations), the description fully covers the necessary context. It specifies the returned fields, providing a complete understanding of what the tool produces without gaps.

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 input schema fully documents the 'year' parameter. The description only adds an example value ('year='2025''), which is helpful but does not provide additional semantics 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 clearly states the tool's purpose: retrieving the annual IGIC Modelo 425 summary for Canary Islands businesses. It lists returned data (IGIC collected, deductible, net payable, filing status) and uses specific verbs ('Get', 'Returns'). The title and name differentiate from sibling summary tools (e.g., modelo_180, modelo_200).

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 implies usage through the title and context ('annual IGIC recap'), but it does not explicitly state when to use this tool versus other summary tools (e.g., quarterly models). No guidance on prerequisites or conditions for use is provided.

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

frihet_portal_domain_addAdd Custom Portal DomainA

Add a custom domain to the Frihet client portal for white-label branding. Returns DNS records (CNAME) that must be configured at the registrar before verification. Example: domain='portal.miempresa.com'. / Agrega un dominio personalizado al portal de clientes Frihet para marca blanca. Devuelve los registros DNS (CNAME) que deben configurarse en el registrador antes de verificar.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesCustom domain to add (e.g. 'portal.miempresa.com') / Dominio personalizado (ej. 'portal.miempresa.com')
workspaceIdNoTarget workspace ID (defaults to caller's workspace) / ID del workspace destino

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

The description discloses that the tool returns DNS records (CNAME) that must be configured before verification, which adds useful behavioral context beyond the annotations. However, it does not mention idempotency, error handling, or whether the tool can overwrite existing domains. Annotations are all false, so no contradiction.

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

Conciseness4/5

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

The description is concise with two main sentences in English plus Spanish bilingual repetition. It is front-loaded with the key purpose. The bilingual content is slightly redundant but does not detract significantly.

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 but could benefit from mentioning next steps after adding (e.g., use frihet_portal_domain_verify to complete configuration). The output schema exists, so return values are covered. The description is adequate but not fully complete regarding the workflow.

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%, so the schema already documents both parameters adequately. The description adds an example for the 'domain' parameter but does not mention 'workspaceId' or provide additional semantics beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action (add), the resource (custom domain to Frihet client portal), and the purpose (white-label branding). It also distinguishes from sibling tools like frihet_portal_domain_verify and frihet_portal_domain_remove by noting that DNS records must be configured before verification.

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 implies usage for adding a custom domain, but it does not provide explicit guidance on when to use this tool versus alternatives (e.g., frihet_portal_domain_verify, frihet_portal_domain_remove). It also does not 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.

frihet_portal_domain_removeRemove Custom Portal DomainA
DestructiveIdempotent

Remove a custom domain from the Frihet client portal. The portal will revert to the default Frihet subdomain. Example: domain='portal.miempresa.com'. / Elimina un dominio personalizado del portal de clientes Frihet. El portal volverá al subdominio predeterminado de Frihet.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesCustom domain to remove / Dominio personalizado a eliminar

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations indicate destructive and idempotent. Description adds that the portal reverts to default subdomain, providing useful behavioral context beyond annotations. No contradictions.

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?

Concise and front-loaded with key action and effect. Bilingual repetition is slightly redundant but acceptable for audience. Every sentence is purposeful.

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 1-parameter destructive tool with output schema and clear annotations, the description adequately covers the behavior and result. Example aids understanding.

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 'domain' with 100% schema description coverage. Baseline is 3; the description includes an example ('domain='portal.miempresa.com''), which adds marginal value but does not significantly enhance meaning beyond the schema.

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

Purpose5/5

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

Clearly states 'Remove a custom domain' and specifies the resource (Frihet client portal). Distinguishes from siblings like add and verify by its action and effect.

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?

No explicit when-to-use or when-not-to-use, but the verb and context make usage clear. Sibling names imply alternatives, but there is no exclusion guidance.

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

frihet_portal_domain_verifyVerify Custom Portal DomainA
Read-onlyIdempotent

Verify DNS propagation for a custom portal domain added via frihet_portal_domain_add. Returns verification status (pending/verified/failed) and any DNS errors. DNS propagation can take up to 48 hours — retry if status is 'pending'. Example: domain='portal.miempresa.com'. / Verifica la propagacion DNS de un dominio de portal personalizado. Devuelve estado (pending/verified/failed). La propagacion puede tardar hasta 48h.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesCustom domain to verify / Dominio personalizado a verificar

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds retry guidance and 48-hour propagation timing, adding value beyond annotations.

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 clear sentences plus an example, front-loaded. Bilingual text adds slight redundancy but remains concise.

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 simple verification tool: explains prerequisite, retry behavior, statuses, and propagation delay. Output schema exists, so return values are covered.

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%, description only adds an example domain. Baseline 3 is appropriate as the schema already documents the parameter.

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

Purpose5/5

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

Explicitly states 'Verify DNS propagation for a custom portal domain', specifies the resource and action, and distinguishes from sibling tool frihet_portal_domain_add by naming it as prerequisite.

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?

Clear context: use after domain_add, retry if status is pending. Provides an example. No explicit when-not-to-use, but the narrow purpose makes it obvious.

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

frihet_tax_id_vies_lookupLookup Tax ID via VIES (EU VAT Validation)A
Read-onlyIdempotent

Validate an EU VAT number (CIF intracomunitario) via the VIES (VAT Information Exchange System). Returns company name, address, and validity status from the official EU registry. Essential for intra-EU invoicing compliance — always validate before adding a EU client. Example: vatNumber='ES12345678A', countryCode='ES'. / Valida un numero de IVA intracomunitario (CIF) via el sistema VIES de la UE. Devuelve nombre, direccion y validez desde el registro oficial europeo.

ParametersJSON Schema
NameRequiredDescriptionDefault
vatNumberYesEU VAT number to validate (without country prefix) / Numero de IVA intracomunitario (sin prefijo de pais)
countryCodeYesISO 3166-1 alpha-2 country code (e.g. 'ES', 'DE', 'FR') / Codigo de pais ISO (ej. 'ES', 'DE', 'FR')

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/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. Description adds that it returns company name, address, and validity status from official EU registry, which is consistent. No contradictions; behavioral traits are 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.

Conciseness5/5

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

Two concise sentences in English followed by Spanish translation (appropriate for bilingual context). Front-loaded with purpose and key usage instruction. No superfluous content.

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 simple lookup tool with output schema implied, description covers purpose, usage, parameters, and expected output. Mentions intra-EU invoicing compliance context. No gaps given tool 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 100% with descriptions. Description adds example values and clarifies that vatNumber is without country prefix, providing additional meaning beyond schema. Lowers cognitive load for agent.

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?

Description clearly states the tool validates an EU VAT number via VIES system, with specific verb 'validate' and resource 'EU VAT number'. It distinguishes itself from siblings as the only VAT validation tool among many invoice and accounting 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?

Provides clear guidance: 'always validate before adding a EU client', essential for intra-EU invoicing compliance. Includes an example. Does not explicitly mention when not to use, but context makes usage clear; no direct alternative tool exists among siblings.

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

gestoria_aging_consolidatedConsolidated AR Aging (Gestoria)A
Read-onlyIdempotent

Get a cross-client AR aging report for a gestor — totals bucketed by current / 30-60 / 60-90 / 90+ days overdue, a per-workspace breakdown, and the top overdue invoices. Defaults to the authenticated gestor; pass ownerUid to query a specific gestor (requires elevated scope). Useful for dunning prioritisation and end-of-month chase lists. / Obtiene un informe de antiguedad de saldos cruzando todos los clientes del gestor — totales por tramo (al dia / 30-60 / 60-90 / 90+ dias), desglose por espacio y top vencidas. Util para priorizar reclamaciones y listas de cobro de fin de mes.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerUidNoGestor UID to query (defaults to authenticated caller; elevated scope required for other UIDs) / UID del gestor (por defecto el llamante)

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalsYes
topOverdueYes
byWorkspaceYes
generatedAtNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark it as read-only and idempotent. Description adds specifics like return structure (buckets, breakdown, top invoices) and scope requirement for different ownerUid. Adds context beyond annotations without contradiction.

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 bilingual sentences front-load key functionality and parameters. Every word is informative. No waste.

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

Completeness5/5

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

Given the tool's moderate complexity and existence of an output schema, the description covers purpose, parameter usage, behavioral notes, and expected output structure. Sufficient for an agent to correctly select and invoke.

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 100% for the single parameter. Description explains default behavior and scope requirement, adding significant meaning beyond the schema definition.

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 clearly states the tool retrieves a cross-client AR aging report for a gestor, with details on bucketing (current, 30-60, 60-90, 90+ days) and breakdowns (per-workspace and top invoices). It distinguishes from siblings as no other tool provides this specific report.

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

Usage Guidelines4/5

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

Explicitly states default behavior (authenticated gestor) and how to query a specific gestor via ownerUid with elevated scope. Clear when to use each mode, though no explicit mention of alternatives among siblings.

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

gestoria_message_sendSend Gestoria MessageA

Send a message in a contextual thread between a gestor (accountant) and a client. Threads attach to a document request, a filing item, or a fiscal obligation — context is preserved so both sides see what the message is about. Useful for chasing a missing document, replying to a client's question, or annotating a presentation. Example: workspaceId='ws_abc', parentType='documentRequest', parentId='dr_q3_iva', body='Falta el extracto bancario de septiembre'. / Envia un mensaje en un hilo contextual entre gestor y cliente. Los hilos se anclan a una solicitud de documento, presentacion o obligacion fiscal — ambas partes ven a que se refiere. Util para pedir documentos, responder dudas o anotar presentaciones.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body (plain text, 1-4000 chars) / Cuerpo del mensaje (texto plano)
parentIdYesID of the parent entity (document request / filing item / obligation) / ID de la entidad padre
parentTypeYesThread parent kind / Tipo de hilo: documentRequest (solicitud de documento), filingItem (presentacion fiscal), obligation (obligacion fiscal)
workspaceIdYesClient workspace ID the thread belongs to / ID del espacio de trabajo del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
createdAtNo
messageIdYes
unreadCountsNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). Description adds that the message appears in a threaded context visible to both parties. Does not disclose potential errors, permissions, or notification behaviors.

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?

Bilingual description is front-loaded with English then Spanish. Appropriate length for clarity. Could be slightly more concise by merging repeated parts, but overall efficient for bilingual users.

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?

Explains threading concept, parent types, and typical use cases. Output schema exists so return format is handled elsewhere. Missing mention that the parent entity must already exist, but otherwise complete for a message sending tool.

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?

Input schema covers all 4 parameters with descriptions. Description adds a concrete example with values, enhancing understanding. However, schema already provides clear parameter meaning, so description is supplementary rather than essential.

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?

Clearly states the tool sends a message in a contextual thread between gestor and client, with specific parent types. Distinguishes from sibling tools like gestoria_messages_list (list) and gestoria_template_bulk_send (bulk). Includes example usage.

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?

Provides specific use cases: chasing missing documents, replying to client questions, annotating presentations. Does not explicitly state when not to use or alternatives, but the context implies it's for ad-hoc individual messages as opposed to bulk or template-based sending.

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

gestoria_messages_listList Gestoria MessagesA
Read-onlyIdempotent

List messages in a contextual gestor/cliente thread, newest first. Use before (message ID or ISO timestamp) to paginate backwards through history. Returns up to limit messages plus a hasMore flag so the agent knows when to stop. / Lista los mensajes de un hilo gestor/cliente, mas recientes primero. Usa before (ID o fecha) para paginar hacia atras. Devuelve hasta limit mensajes con flag hasMore.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax messages to return (1-100, default 50) / Mensajes maximos
beforeNoCursor: messages older than this (message ID or ISO date) / Cursor: mensajes anteriores a este
parentIdYesID of the parent entity / ID de la entidad padre
parentTypeYesThread parent kind / Tipo de hilo: documentRequest (solicitud de documento), filingItem (presentacion fiscal), obligation (obligacion fiscal)
workspaceIdYesClient workspace ID / ID del espacio de trabajo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hasMoreYes
messagesYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. The description adds behavioral details: returns messages newest first, supports cursor-based pagination, and includes a `hasMore` flag. No contradictions.

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 in English followed by a Spanish translation. No wasted words; purpose, ordering, and pagination are front-loaded. Efficient.

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

Completeness5/5

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

Given the output schema exists, the description adequately covers purpose, ordering, pagination, and the `hasMore` flag. All required parameters are explained in schema, and the description adds the necessary usage context for a list tool.

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 parameters are well-documented. The description adds semantic value by explaining `before` accept both message ID and ISO timestamp, and by clarifying the pagination behavior with `limit` and `hasMore`.

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 clearly states the verb (List), resource (messages), and scope (contextual gestor/cliente thread). It specifies ordering (newest first) and distinguishes from sibling tools like gestoria_message_send.

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

Usage Guidelines4/5

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

The description explains when to use (listing messages in a thread) and provides pagination guidance with `before` and `hasMore`. It doesn't explicitly mention alternatives, but the context is clear.

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

gestoria_template_bulk_sendBulk Send Gestoria TemplateA

Send the same document request template to up to 500 client workspaces in one call. Each spawned request triggers the per-client notification handler (email + in-app). Honours allowGestoriaCommunications=false on the client user doc (opt-out). Uses periodOverrides to plug runtime values (quarter/year/month) into template variables. Returns a per-client outcome with success count, failures, and total wall-clock duration. Trust Area: RGPD — recipients must already have granted accountant access. Example: templateId='tpl_iva_q', clientWorkspaceIds=['ws_a','ws_b','ws_c'], periodOverrides={quarter:3, year:2026}. / Envia la misma plantilla a hasta 500 espacios cliente en una sola operacion. Respeta opt-out allowGestoriaCommunications=false.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateIdYesTemplate ID (from `gestoria_template_create`) / ID de la plantilla
periodOverridesNoOverride template period variables in the bulk send / Sobrescribir variables de periodo (trimestre, ano, mes)
clientWorkspaceIdsYesTarget client workspace IDs (1-500) / IDs de espacios cliente destino

Output Schema

ParametersJSON Schema
NameRequiredDescription
failedYes
successYes
totalDurationNoWall-clock duration in ms

TDQS

A4.3/5.0
Behavior4/5

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

Discloses notification handler trigger, opt-out respect, period variable plugging, and per-client outcome return. Annotations are minimal (not read-only, not destructive), so description carries burden and adds value with RGPD trust area mention.

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?

Efficiently structured with clear front-loading. Bilingual (English/Spanish) adds length but serves dual audience. Each sentence contributes useful information; 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?

Covers main aspects: target, limits, opt-out, period overrides, notification, return type, and RGPD. Output schema exists so return value detail is not required. Adequate for its 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 covers 100% of parameters with descriptions. Description adds context: periodOverrides used for runtime values, example provided, and max 500 limit for clientWorkspaceIds. Enhances understanding beyond 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?

Clearly states it sends the same document request template to up to 500 client workspaces in one call. Distinguishes from siblings like gestoria_message_send (individual message) and gestoria_template_create (creation).

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?

Describes when to use (bulk sending) and mentions opt-out handling, period overrides, and notifications. Does not explicitly list alternatives or when-not-to-use, but sibling context provides implicit guidance.

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

gestoria_template_createCreate Gestoria TemplateA

Create a reusable document request template that the gestor can bulk-send to many client workspaces. Template body supports plain-text variable interpolation (e.g. {{quarter}}, {{year}}). dueDateOffsetDays sets when the request is due relative to the bulk-send date. attachmentRequired=true enforces clients to upload a file before marking complete. Example: name='IVA trimestral', title='Documentacion IVA {{quarter}}/{{year}}', description='Adjunta extractos bancarios y facturas emitidas del {{quarter}}', dueDateOffsetDays=14, attachmentRequired=true. / Crea una plantilla de solicitud de documento reutilizable que el gestor puede enviar en masa a varios espacios cliente.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesInternal template name (shown to gestor only) / Nombre interno
titleYesTitle rendered to the client (supports {{variables}}) / Titulo visible al cliente
variablesNoVariable definitions for interpolation / Definiciones de variables
descriptionYesDescription / instructions for the client (supports {{variables}}) / Descripcion e instrucciones
dueDateOffsetDaysYesDays from send until due (0-365) / Dias desde envio hasta vencimiento
attachmentRequiredNoRequire an uploaded file before completion (default: false) / Requiere archivo

Output Schema

ParametersJSON Schema
NameRequiredDescription
templateIdYes

TDQS

A4.7/5.0
Behavior5/5

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

The description adds significant behavioral context: variable interpolation, due date offset behavior, attachment requirement, and an example. Annotations are minimal, so the description carries the burden and does it well.

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

Conciseness4/5

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

The description is concise with two sentences and an example, but the example is inline and could be more structured. Still efficient and informative.

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?

Despite having an output schema, the description is complete for a create tool: it covers core functionality, usage, parameters, and behavioral details. No gaps.

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 100%, but the description adds value by explaining parameters in context (e.g., dueDateOffsetDays meaning, attachmentRequired default) and provides an example that ties all parameters together.

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 clearly states 'Create a reusable document request template that the gestor can bulk-send to many client workspaces,' specifying the verb and resource, and distinguishes from siblings like gestoria_template_bulk_send.

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

Usage Guidelines4/5

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

The description explains when to use the tool (creating templates for bulk-sending) and provides an example, but does not explicitly state when not to use or list alternatives beyond implying the send tool.

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

get_bank_accountGet Bank AccountA
Read-onlyIdempotent

Get a single connected bank account by ID. Returns alias, IBAN (last 4 digits), currency, current balance, and last sync timestamp. / Obtiene una cuenta bancaria conectada por su ID. Devuelve alias, IBAN (ultimos 4 digitos), divisa, saldo actual y ultima sincronizacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBank account ID / ID de la cuenta bancaria

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
aliasNo
balanceNo
currencyNo
createdAtNo
ibanLast4NoLast 4 digits of IBAN (security masked)
updatedAtNo
lastSyncedAtNo

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 destructiveHint=false, indicating a safe read operation. The description adds useful context by specifying the exact return fields (alias, IBAN last 4, currency, balance, sync timestamp), enhancing transparency beyond the annotations.

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

Conciseness5/5

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

The description is concise, consists of two sentences (English and Spanish), front-loads the action, and includes only essential information. Every sentence is informative and there is no redundancy.

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 tool is simple with one required parameter and an output schema exists. The description provides a list of return fields, further aiding understanding. Despite the presence of many sibling tools, the description is complete for its straightforward purpose.

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 description coverage, the parameter 'id' is already well-documented in the schema. The description does not add additional semantic meaning beyond what is in the schema, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'single connected bank account by ID', and lists the return fields, distinguishing it from siblings like list_bank_accounts which retrieves all accounts.

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 the tool is for retrieving a specific account by ID, which implicitly differentiates it from list_bank_accounts, but it does not explicitly state when to use this tool versus alternatives or provide context for exclusion.

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

get_clientGet ClientA
Read-onlyIdempotent

Get a single client by their ID. Returns full contact details. / Obtiene un cliente por su ID. Devuelve todos los datos de contacto.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
emailNo
phoneNo
taxIdNo
addressNo
createdAtNo
updatedAtNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's addition of 'Returns full contact details' adds some context but not critical behavioral traits.

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 concise with two sentences, bilingual, and front-loaded with the core purpose, no wasted words.

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

Completeness5/5

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

Given the tool's simplicity (1 parameter, output schema present), the description is complete enough for an AI agent to use 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 coverage is 100% for the single parameter 'id', and the description does not add extra meaning beyond what the schema provides, meeting the baseline.

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 clearly states it retrieves a single client by ID and returns full contact details, distinguishing it from sibling tools like list_clients or update_client.

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 name and description, but there is no explicit guidance on when to use or not use this tool versus alternatives.

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

get_depositGet DepositA
Read-onlyIdempotent

Get a single deposit by its ID. / Obtiene un deposito por su ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeposit ID / ID del deposito

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
notesNo
amountYes
statusNo
clientIdYes
currencyNo
createdAtNo
referenceNo
updatedAtNo
clientNameNo
descriptionNo
paymentMethodNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clear. The description adds 'Get' which is consistent, but provides no further behavioral details (e.g., authorization requirements, rate limits). With annotations covering the safety aspects, a score of 3 is appropriate.

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

Conciseness4/5

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

The description is very short (two sentences in two languages) and gets straight to the point. It could be slightly more efficient by dropping the Spanish duplicate, but it remains clear and front-loaded.

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 that an output schema exists (not shown but indicated true), the description does not need to explain return values. For a simple retrieval tool, the description covers the essential purpose. No mention of edge cases or prerequisites, but the tool's simplicity makes this acceptable.

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 input schema has 100% coverage with a bilingual description for the single required parameter 'id'. The description merely restates 'by its ID', adding no extra meaning. Baseline 3 is correct when schema coverage is high.

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 clearly states 'Get a single deposit by its ID', using a specific verb and resource. It distinguishes from sibling tools like list_deposits (which retrieves multiple) and create/update/delete_deposit.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., list_deposits for multiple deposits, get_invoice for invoices). Context is implied by the tool name, but explicit usage conditions are missing.

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

get_einvoice_statusGet E-Invoice StatusA
Read-onlyIdempotent

Poll the status of an e-invoice dispatch workflow. Returns current step, ack ID (network confirmation), and download URLs once complete. Poll every 5–10 seconds until status is 'succeeded', 'failed', or 'cancelled'.

If the status backend is not deployed for this workspace, returns an honest 'unavailable' response — never a fabricated status. / Consulta el estado de un flujo de envio de factura electronica.

ParametersJSON Schema
NameRequiredDescriptionDefault
workflowRunIdYesHatchet workflow run ID returned by send_einvoice / ID del run de workflow

Output Schema

ParametersJSON Schema
NameRequiredDescription
stepYesCurrent or last workflow step name
ackIdNoNetwork acknowledgement ID (PEPPOL SBDH / SDI protocol ID / etc.)
errorNoError message if status is 'failed'
statusYes
xmlUrlNoSigned URL to download the raw XML file
pdfA3UrlNoSigned URL to download the PDF/A-3 envelope (Factur-X only)

TDQS

A4.3/5.0
Behavior5/5

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

Description adds significant context beyond annotations (read-only, idempotent, non-destructive): polling behavior, honest unavailability, and return fields. No contradictions with annotations.

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

Conciseness4/5

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

The English portion is concise and front-loaded with key purpose and behavior. The Spanish duplicate adds no value for English agents and could be omitted, but overall the description is efficient.

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 existence of an output schema, the description covers polling behavior, expected response fields, and honest error handling. Missing details on invalid workflowRunId or rate limits, but generally sufficient for a polling 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 the single parameter (workflowRunId) is well-described in the schema. The description does not add new parameter semantics beyond contextualizing the polling process. Baseline score 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 clearly states the tool polls the status of an e-invoice dispatch workflow, specifying what is returned (current step, ack ID, download URLs). This verb+resource combination distinguishes it from sibling tools like send_einvoice and other status endpoints.

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?

Provides explicit polling interval (5-10 seconds) and termination conditions ('succeeded', 'failed', 'cancelled'). Also notes honest 'unavailable' response. Lacks explicit alternatives or when-not-to-use, but given context of e-invoice, usage is clear.

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

get_invoiceGet InvoiceA
Read-onlyIdempotent

Get a single invoice by its ID. Returns the full invoice including line items, totals, and status. / Obtiene una factura por su ID. Devuelve la factura completa con conceptos, totales y estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
dueDateNo
taxRateNo
createdAtNo
issueDateNo
updatedAtNo
clientNameNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior. The description adds that it returns full invoice including line items, totals, and status, providing useful context beyond 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 two sentences in English and Spanish, front-loaded with the key action, and contains no unnecessary words.

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

Completeness5/5

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

With an output schema present, the description adequately explains the return value (full invoice with line items, totals, status). It is complete for a get-by-ID 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 the parameter 'id' is well-described. The description does not add additional meaning beyond what the schema provides, 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 clearly states 'Get a single invoice by its ID', specifying the action and resource. It distinguishes from sibling tools like list_invoices (multiple invoices) and get_invoice_pdf (returns PDF).

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 use when needing a single invoice by ID, but does not explicitly mention when not to use or alternatives. Given the simplicity and name, it's clear enough.

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

get_invoice_pdfGet Invoice PDFA
Read-onlyIdempotent

Get the PDF for an invoice. Returns a URL to download the PDF or binary info. / Obtiene el PDF de una factura. Devuelve una URL de descarga o informacion del binario.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNo
contentTypeNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive). Description adds that it returns URL or binary info, but no additional behavioral context (e.g., size limits, auth needs).

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 (bilingual) with no unnecessary words. Front-loaded with the core action. Every sentence provides 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?

Simple tool with one parameter and existing output schema; description sufficiently conveys function and output. Minor lack of error handling mention but not critical.

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 parameter 'id' is documented in schema with description 'Invoice ID / ID de la factura'. Description does not add extra meaning beyond schema, so baseline 3 applies due to 100% schema coverage.

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?

Clearly states that the tool retrieves the PDF for an invoice, specifying the output as a URL or binary info. Distinguishes from sibling 'get_invoice' which returns invoice data, not PDF.

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?

No explicit 'when to use' or alternatives, but the context of siblings (only tool to get PDF) and description implying PDF retrieval makes usage clear enough.

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

get_kitchen_ticketGet Kitchen TicketA
Read-onlyIdempotent

Get a single kitchen ticket by ID. Returns full ticket details including all items, their individual statuses, station assignment, and table reference. / Obtiene un ticket de cocina por ID. Devuelve todos los detalles: items, estados individuales, estacion asignada y referencia de mesa.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTicket ID / ID del ticket

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
statusNoqueued | preparing | ready | served | cancelled
tableRefNo
createdAtNo
stationIdNo
updatedAtNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering the safety profile. The description adds context about the return content (items, statuses, station, table) but no additional behavioral traits. This is adequate but not exceptional.

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 efficiently convey the purpose and return content, including a Spanish translation. No wasted words; front-loaded with key 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?

Given the low complexity (one parameter, output schema exists) and rich annotations, the description covers all necessary context: what the ticket includes, and the fact it's a single retrieval. The output schema handles detailed structure, so this is 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?

The input schema has 100% description coverage for the single 'id' parameter, which is clearly described. The overall description adds meaning about what the tool returns, but does not enhance the parameter semantics 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 clearly states it gets a single kitchen ticket by ID and returns full details including items, statuses, station, and table reference. This distinguishes it from sibling tools like list_kitchen_tickets and update_kitchen_ticket.

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 does not provide explicit guidance on when to use this tool versus alternatives like list_kitchen_tickets. While the operation is straightforward, no when-not or alternative usage is mentioned.

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

get_modelo_130_summaryGet Modelo 130 Summary (IRPF Estimated Payment)A
Read-onlyIdempotent

Get IRPF estimated payment summary for Modelo 130 filing (freelancers/self-employed in Spain). Returns quarterly net income, deductible expenses, previous payments, and amount due. Example: period='2026-Q1' / Obtiene el resumen del pago fraccionado IRPF para el Modelo 130 (autonomos). Devuelve rendimiento neto, gastos deducibles, pagos previos y cuota a ingresar.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoPeriod in format YYYY-QN (e.g. '2026-Q1') / Periodo en formato YYYY-QN

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
modelNo
monthsNoMonths covered by the period (YYYY-MM)
periodNoYYYY-QN (303/130) or YYYY (390)
summaryNo
deadlineNo
readonlyNoMarks the payload as an informational summary, never filed to AEAT
totalDueNo
modelo130No
modelo303No
modelo390No
modeloCodeNo
totalsByRateNo
totalDeductibleNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, nondestructive. Description adds specific return fields (net income, expenses, payments, amount due) and an example, enhancing understanding of behavior without contradicting annotations.

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

Conciseness4/5

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

Two concise sentences plus example; front-loaded with purpose. Bilingual content is justified for context. No filler, but example could be integrated more tightly.

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

Completeness5/5

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

Given simple tool (1 param, no required) and existence of output schema, description sufficiently explains purpose, return values, and usage context. No gaps for agent to select and invoke.

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 already describes the single parameter with format and example. Description repeats the example but adds no new meaning beyond schema. Baseline 3 due to 100% schema coverage.

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?

Explicitly states verb 'Get' and resource 'IRPF estimated payment summary for Modelo 130 filing' with target users and returned fields. Distinguishes from sibling tax form tools by naming specific tax and audience.

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?

Provides clear context (quarterly IRPF for Spanish freelancers) but lacks explicit when-to-use, when-not-to-use, or alternatives guidance. Implied differentiation from other tax models via name, but no direct comparison.

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

get_modelo_180_summaryGet Modelo 180 Summary (IRPF Rentals Annual)A
Read-onlyIdempotent

Get IRPF annual informative summary for rental income withholdings (Modelo 180, Spain). Returns total retentions per tenant, property, and annual aggregate. Example: period='2025' / Obtiene el resumen anual de retenciones sobre alquileres para el Modelo 180. Devuelve retenciones totales por inquilino, inmueble y agregado anual.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoYear in format YYYY (e.g. '2025') / Ejercicio en formato YYYY

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
modelNo
monthsNoMonths covered by the period (YYYY-MM)
periodNoYYYY-QN (303/130) or YYYY (390)
summaryNo
deadlineNo
readonlyNoMarks the payload as an informational summary, never filed to AEAT
totalDueNo
modelo130No
modelo303No
modelo390No
modeloCodeNo
totalsByRateNo
totalDeductibleNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, so the description's role is lighter. It adds value by describing what data is returned (retentions per tenant, property, annual aggregate) and includes an example, fully aligning with annotations.

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

Conciseness5/5

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

The description is concise (two sentences plus an example) and front-loaded with the essential purpose. Every sentence contributes meaning, and the bilingual format is a minor addition that does not harm conciseness.

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 simple tool with one parameter, full annotation coverage, and an output schema, the description provides complete context: what the tool does, what it returns, and an example. No gaps remain.

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 describes the parameter 'period' as 'Year in format YYYY'. The description adds an example ('period='2025'') but does not provide significant additional semantics beyond the schema, meeting the baseline.

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 clearly states it retrieves the IRPF annual summary for rental income withholdings (Modelo 180 in Spain), specifying it returns retentions per tenant, property, and annual aggregate. This distinguishes it from sibling tools like get_modelo_130_summary which target different tax forms.

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 indicates this tool is for rental income withholdings under Modelo 180, providing clear context. However, it does not explicitly state when to use it versus other modelo summaries, though the naming and context make the distinction apparent.

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

get_modelo_303_summaryGet Modelo 303 Summary (IVA Quarterly)A
Read-onlyIdempotent

Get IVA (VAT) quarterly summary for Modelo 303 filing in Spain. Returns aggregated totals by tax rate, deductible IVA, net amount due, and filing deadline. Example: period='2026-Q1' / Obtiene el resumen trimestral del IVA para el Modelo 303 en Espana. Devuelve totales por tipo impositivo, IVA deducible, cuota a ingresar y plazo.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoPeriod in format YYYY-QN (e.g. '2026-Q1') or YYYY for annual / Periodo en formato YYYY-QN o YYYY

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
modelNo
monthsNoMonths covered by the period (YYYY-MM)
periodNoYYYY-QN (303/130) or YYYY (390)
summaryNo
deadlineNo
readonlyNoMarks the payload as an informational summary, never filed to AEAT
totalDueNo
modelo130No
modelo303No
modelo390No
modeloCodeNo
totalsByRateNo
totalDeductibleNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows it's a safe read operation. The description adds value by specifying return fields (totals by tax rate, deductible IVA, net amount due, filing deadline) and providing an example period.

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 concise with two sentences in English and a Spanish translation, plus an example. It is front-loaded with essential information, though the Spanish repetition adds minor 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?

Given the tool is simple (one parameter, read-only, output schema exists), the description covers the main purpose, return fields, and example input. It does not mention whether the period parameter is optional (required: 0), but overall it is complete enough.

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 single parameter 'period' is fully described in the schema (format YYYY-QN or YYYY) and the description gives an example value ('2026-Q1'). Since schema coverage is 100%, the description adds marginal 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 clearly states 'Get IVA (VAT) quarterly summary for Modelo 303 filing in Spain', providing a specific verb and resource. It distinguishes from sibling tools like get_modelo_130_summary by explicitly naming the form number and country.

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 guidance on when to use this tool over alternatives (e.g., other tax summary tools like get_modelo_130_summary). The context signals show many similar tools, but the description does not differentiate usage scenarios.

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

get_modelo_347_summaryGet Modelo 347 Summary (Operations >€3,005 Annual Recap)A
Read-onlyIdempotent

Get annual informative summary of operations exceeding €3,005 per counterparty (Modelo 347, Spain). Returns per-party totals for clients and vendors above the threshold. Example: period='2025' / Obtiene el resumen anual de operaciones con terceros superiores a 3.005€ (Modelo 347). Devuelve totales por cliente/proveedor que superen el umbral.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoYear in format YYYY (e.g. '2025') / Ejercicio en formato YYYY

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
modelNo
monthsNoMonths covered by the period (YYYY-MM)
periodNoYYYY-QN (303/130) or YYYY (390)
summaryNo
deadlineNo
readonlyNoMarks the payload as an informational summary, never filed to AEAT
totalDueNo
modelo130No
modelo303No
modelo390No
modeloCodeNo
totalsByRateNo
totalDeductibleNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds that it returns per-party totals, but does not clarify the default behavior if the optional 'period' parameter is omitted, leaving ambiguity.

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 concise and front-loaded with key details, but it repeats the same information in Spanish, increasing length unnecessarily. Still efficient overall.

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 read-only summary with one optional parameter and an output schema, the description covers purpose, threshold, return content, and an example. Missing default behavior for 'period' is a minor gap, but overall adequate.

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% with the 'period' parameter already described as a year in YYYY format. The description repeats the example but adds no additional meaning 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 clearly states the tool retrieves an annual summary of operations exceeding €3,005 per counterparty (Modelo 347, Spain), specifying it returns per-party totals for clients and vendors. The title reinforces the threshold and annual nature, distinguishing it from other Modelo summaries.

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 implies use for Spanish annual operations reporting but does not explicitly compare to sibling Modelo summaries (e.g., 303, 130) or provide when-not-to-use guidance. No exclusions or alternatives are mentioned.

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

get_modelo_390_summaryGet Modelo 390 Summary (IVA Annual Recap)A
Read-onlyIdempotent

Get IVA annual summary for Modelo 390 filing in Spain. Returns full-year totals by rate, total deductible IVA, and annual balance. Example: period='2025' / Obtiene el resumen anual del IVA para el Modelo 390. Devuelve totales anuales por tipo, IVA deducible total y resultado anual.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoYear in format YYYY (e.g. '2025') / Ejercicio en formato YYYY

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
modelNo
monthsNoMonths covered by the period (YYYY-MM)
periodNoYYYY-QN (303/130) or YYYY (390)
summaryNo
deadlineNo
readonlyNoMarks the payload as an informational summary, never filed to AEAT
totalDueNo
modelo130No
modelo303No
modelo390No
modeloCodeNo
totalsByRateNo
totalDeductibleNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true, so the description adds minimal behavioral context beyond confirming it returns totals. It does not mention potential error conditions, authentication needs, or rate limits. The description adds value by describing return content but not behavioral traits beyond what annotations provide.

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

Conciseness5/5

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

The description is two concise sentences in English followed by a bilingual Spanish repetition. Every sentence serves a purpose: defining the tool, specifying outputs, and providing an example. No superfluous words. The most important information comes first.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter, no enums, output schema exists) and the richness of annotations and schema, the description covers the essential aspects. It explains the purpose, return values, and parameter usage. No significant gaps; the example aids understanding. The presence of an output schema compensates for any missing detail on return format.

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 input schema already covers the 'period' parameter with a description and format. The description adds an explicit example ('period='2025'') and repeats the format in Spanish. This provides concrete usage guidance, raising the score above baseline 3. No other parameters 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?

The description clearly states the tool's function: getting the IVA annual summary for Modelo 390 filing in Spain. It specifies the returned data (full-year totals by rate, deductible IVA, annual balance) and includes an example with 'period'. This distinguishes it from similar annual models (like Modelo 180, 347, etc.) by naming 'Modelo 390' and 'annual'.

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 use for annual IVA summary through the term 'annual recap' and the example with a year. However, it does not explicitly state when to use this tool versus other modelo summaries (e.g., quarterly). No exclusion criteria or alternatives are mentioned, but the context of 'annual' provides sufficient guidance for a knowledgeable user.

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

get_monthly_summaryGet Monthly SummaryA
Read-onlyIdempotent

Get complete monthly financial summary — revenue, expenses, profit, tax liability, invoice stats, expense breakdown by category. Defaults to current month. Use this to answer questions about financial performance, cash flow, or monthly P&L. / Resumen financiero mensual completo — ingresos, gastos, beneficio, impuestos, estadisticas de facturas, desglose de gastos por categoria. Por defecto el mes actual.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth in YYYY-MM format (defaults to current month). Example: '2026-03' / Mes en formato YYYY-MM (por defecto el mes actual)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds that it defaults to the current month, which is useful but not extensive. No behavioral contradictions.

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 concise and front-loaded with the primary purpose. It includes bilingual text (English and Spanish) which, while doubling length, is justified for a multilingual audience. Every sentence adds 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?

Given the output schema exists and annotations provide safety traits, the description adequately covers the tool's inputs and outputs. It lists the summary contents and default behavior. No major gaps.

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 single parameter 'month' has a description in the schema with format and default note. The description adds minimal extra meaning beyond the schema, just the mention of current month default. Schema coverage is 100%.

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 clearly states it provides a complete monthly financial summary with specific items (revenue, expenses, profit, etc.). The verb 'Get' and resource 'monthly summary' are specific, and the tool is distinct from siblings like get_modelo_303_summary.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this to answer questions about financial performance, cash flow, or monthly P&L.' This provides clear context. However, it does not mention when not to use it or list alternative tools for more granular queries.

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

get_productGet ProductA
Read-onlyIdempotent

Get a single product/service by its ID. / Obtiene un producto/servicio por su ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProduct ID / ID del producto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
taxRateNo
createdAtNo
unitPriceYes
updatedAtNo
descriptionNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false. Description adds no extra behavioral context (e.g., auth requirements, rate limits). The annotations sufficiently cover safety and idempotency, so a score of 3 is appropriate.

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

Conciseness4/5

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

Two sentences, one in English and one in Spanish. Concise and front-loaded with the core action. Could be slightly tighter (e.g., drop Spanish if not needed), but overall efficient.

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 a complete output schema and minimal required input, the description is sufficient for a simple get-by-id operation. It is complete enough given the tool's low complexity and existing metadata.

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% with one parameter (id). Description says 'by its ID' which merely repeats the schema description. No additional meaning or constraints are added 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?

Description clearly states 'Get a single product/service by its ID', specifying a specific verb (Get) and resource (product/service). It distinguishes from siblings like list_products (which lists all) and create_product (which creates).

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 guidance provided on when to use this tool vs alternatives (e.g., list_products for multiple products). The description does not mention any prerequisites or exclusions.

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

get_quoteGet QuoteA
Read-onlyIdempotent

Get a single quote/estimate by its ID. Returns the full quote with line items and totals. / Obtiene un presupuesto por su ID. Devuelve el presupuesto completo con conceptos y totales.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesQuote ID / ID del presupuesto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
createdAtNo
updatedAtNo
clientNameNo
validUntilNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, destructiveHint. Description adds that it returns full quote with line items and totals, which is beyond what annotations cover.

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 concise sentences in English, then Spanish repetition. Slightly redundant but front-loaded and clear.

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?

Simple tool with single parameter, output schema present, and description clearly states what is returned. Fully adequate for retrieval 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% (id parameter described). Description adds no additional meaning or examples beyond the schema field description.

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

Purpose5/5

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

Clear verb ('Get'), specific resource ('quote/estimate by its ID'), and distinguishes from siblings like list_quotes or create_quote. Also specifies what is returned (full quote with line items and totals).

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?

No explicit guidance on when to use this vs alternatives (e.g., list_quotes). It's implied but not stated. Lacks when-not or prerequisites.

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

get_recurring_invoiceGet Recurring InvoiceA
Read-onlyIdempotent

Get full details of a recurring invoice template by ID. Returns template name, frequency, next run date, recipient, line items, and active/paused status. / Obtiene los detalles completos de una plantilla de factura recurrente por ID. Devuelve nombre, frecuencia, proxima ejecucion, destinatario, lineas y estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecurring invoice template ID / ID de la plantilla de factura recurrente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
statusNo
nextRunNo
createdAtNo
frequencyNo
lineItemsNo
recipientNo
updatedAtNo
templateNameNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering safety and idempotency. The description adds no new behavioral traits beyond stating it returns details, which is consistent. Since annotations carry the burden, a score of 3 is appropriate; no contradiction.

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

Conciseness4/5

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

The description is concise: two sentences (English then Spanish), each adding value. The front-loaded English sentence states purpose and list of returned fields. The Spanish translation is helpful for bilingual users but does not add redundancy. Slight length increase is justified by clarity.

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

Completeness5/5

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

Given the tool's simplicity (single parameter, read-only, with output schema), the description provides sufficient context: it lists the key return fields, and annotations cover behavioral traits. No missing information about permissions, rate limits, or errors is necessary for this straightforward get operation.

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% with a single required 'id' parameter. The description does not add any additional meaning or syntax beyond what the schema provides (e.g., 'by ID' is redundant). Baseline 3 is correct as the schema already documents the parameter adequately.

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 'Get' and clearly identifies the resource 'recurring invoice template by ID', listing the returned fields (name, frequency, next run date, recipient, line items, status). This distinguishes it well from sibling tools like list_recurring_invoices (which lists templates) and create/update/delete/pause/resume 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?

Although no explicit when-not-to-use or alternatives are given, the context is clear: use this tool when you need full details of a specific recurring invoice template by ID. The sibling list_recurring_invoices is for listing all templates, so the usage complement is implied. No misleading guidance.

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

get_reservationGet ReservationA
Read-onlyIdempotent

Get a single reservation by ID. Returns full booking details: guest, property, dates, channel, payment status, and notes. / Obtiene una reserva por ID. Devuelve todos los detalles de la reserva.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesReservation ID / ID de reserva

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
notesNo
nightsNo
statusYes
checkInYes
guestIdNo
checkOutYes
currencyNo
channelIdNo
createdAtNo
updatedAtNo
guestCountYes
propertyIdYes
totalAmountNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds that it returns booking details, but does not disclose other behaviors like auth requirements or rate limits. Given annotations cover the safety profile, description adds minimal extra behavioral context.

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

Conciseness4/5

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

Two clear English sentences with a Spanish translation that is redundant. Concise and front-loaded, but the bilingual duplication slightly reduces conciseness.

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?

Description lists return fields, which is sufficient given the existence of an output schema. The tool is simple with one parameter and clear purpose, so the description is complete enough for an agent.

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% with a single 'id' parameter described as 'Reservation ID / ID de reserva.' Description mentions 'by ID' but adds no further semantic meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

Description clearly states action: 'Get a single reservation by ID.' It specifies verb and resource, and lists return fields. It distinguishes from siblings like list_reservations (list) and create_reservation (create).

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?

Description implies usage context: use when you have a reservation ID and need details. No explicit when-not or alternatives, but the purpose is clear enough for an agent to decide.

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

get_saleGet POS SaleA
Read-onlyIdempotent

Get a single POS sale by ID. Returns full sale details: terminal, items, payment method, amounts, and status. / Obtiene una venta POS por ID. Devuelve todos los detalles: terminal, articulos, metodo de pago, importes y estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSale ID / ID de venta

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
statusNo
currencyNo
createdAtNo
updatedAtNo
terminalIdNo
amountCentsNo
paymentMethodNo
refundedAmountCentsNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context about the content of the response (full sale details), which is valuable 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 in English, followed by a Spanish translation. No unnecessary words, and the key information is front-loaded.

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

Completeness5/5

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

For a simple retrieval tool with one parameter and an output schema (as indicated), the description sufficiently covers what the agent needs to know: the resource, the identifying parameter, and the key fields returned.

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 schema already describes the parameter 'id' with a bilingual description. The description adds no new semantic information about the parameter beyond stating 'by ID'.

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 clearly states the tool gets a single POS sale by ID and lists the key fields returned (terminal, items, payment method, amounts, status). It distinguishes itself from sibling tools like list_sales (which lists many) and refund_sale (which modifies).

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 implicitly tells the agent to use this tool when needing full details of a specific sale, but does not explicitly mention alternatives or when not to use it. Given the simplicity of the operation, this is adequate.

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

get_time_entryGet Time EntryA
Read-onlyIdempotent

Get full details of a single time tracking entry by ID. Returns project, user, hours, description, billable flag, date and status. / Obtiene los detalles completos de una entrada de tiempo por su ID. Devuelve proyecto, usuario, horas, descripcion, facturabilidad, fecha y estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTime entry ID / ID de la entrada de tiempo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
hoursYes
statusNo
userIdNo
billableNo
createdAtNo
projectIdNo
updatedAtNo
descriptionNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds return field details but no further behavioral context beyond what annotations provide.

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

Conciseness5/5

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

Two sentences (English and Spanish), front-loaded with purpose, and no wasted words. Efficient and clear.

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 simple retrieval tool with output schema, annotations, and single parameter. No gaps in explaining what the tool does and returns.

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% for the single 'id' parameter, and description does not add additional meaning beyond the schema's description.

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

Purpose5/5

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

Clearly states it gets full details of a single time tracking entry by ID and lists the returned fields (project, user, hours, etc.). Distinguishes from sibling tools like list_time_entries.

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?

Implicitly suggests use for retrieving one entry, but does not explicitly mention alternatives or when not to use. Could be improved by referencing list_time_entries for multiple entries.

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

get_time_summaryGet Time SummaryA
Read-onlyIdempotent

Get aggregated time tracking summary for a workspace or specific team member. Returns total hours, billable hours, non-billable hours, and estimated cost for the period. Filter by date range and optionally by user ID for per-member breakdowns. / Obtiene el resumen agregado de seguimiento de tiempo para el espacio de trabajo o un miembro. Devuelve horas totales, facturables, no facturables y coste estimado del periodo. Filtra por rango de fechas y opcionalmente por usuario para desglose por miembro.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesEnd date ISO 8601 (YYYY-MM-DD) / Fecha fin
fromYesStart date ISO 8601 (YYYY-MM-DD) / Fecha inicio
userIdNoFilter to a specific member (omit for workspace total) / Filtrar a un miembro concreto (omitir para total workspace)
groupByNoGroup results by user, project, or day (default: no grouping) / Agrupar resultados por usuario, proyecto o dia
projectIdNoFilter to a specific project / Filtrar a un proyecto concreto

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYes
fromYes
groupsNo
totalHoursYes
billableHoursYes
estimatedCostEurNo
nonBillableHoursYes

TDQS

A4/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. Description adds details about returned fields (hours, costs) and filtering behavior, providing useful context beyond 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?

Description is two terse sentences in English followed by Spanish translation. No extraneous words; front-loads purpose and key details.

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 output schema present and 100% parameter coverage, description covers core functionality. Missing explicit mention of grouping option, but overall sufficient.

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%, so baseline is 3. Description adds context about 'date range' (from/to) and 'user ID for per-member breakdowns', but does not cover groupBy or projectId beyond 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?

Description clearly states verb 'get', resource 'aggregated time tracking summary', and scope 'workspace or specific team member'. Distinguishes from sibling 'list_time_entries' which returns raw entries.

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

Usage Guidelines3/5

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

Description implies usage for aggregated data with date filtering and optional user filter, but does not explicitly contrast with alternatives like 'list_time_entries' or state when not to use.

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

get_vendorGet VendorA
Read-onlyIdempotent

Get a single vendor/supplier by their ID. Returns full contact details. / Obtiene un proveedor por su ID. Devuelve todos los datos de contacto.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVendor ID / ID del proveedor

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
emailNo
phoneNo
taxIdNo
addressNo
createdAtNo
updatedAtNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. Description adds that it returns contact details, which is beyond annotations but not rich behavioral context. No mention of auth, rate limits, or side effects.

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

Conciseness5/5

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

Two short sentences in English and Spanish, front-loaded with purpose and return info. No superfluous content.

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 simple get-by-ID tool with an output schema (present), the description adequately covers purpose, parameter, and return value hint. No gaps.

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% with the 'id' parameter described. Description adds no additional meaning beyond the schema's description of 'Vendor ID'. Baseline of 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?

Description clearly states the tool retrieves a single vendor/supplier by ID and returns full contact details. Verb 'Get' and resource 'vendor/supplier' are specific. Differentiates from sibling tools like list_vendors, create_vendor, etc.

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?

Does not explicitly state when to use this tool versus alternatives (e.g., list_vendors for multiple vendors). Usage is implied by the tool's simple nature, but no explicit guidance is provided.

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

get_webhookGet WebhookA
Read-onlyIdempotent

Get a single webhook configuration by its ID. / Obtiene la configuracion de un webhook por su ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID / ID del webhook

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYes
activeNo
eventsYes
secretNo
createdAtNo
updatedAtNo

TDQS

A3.7/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds no behavioral traits beyond these, missing opportunities to mention output format or that it returns a single object.

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 (English and Spanish) with zero unnecessary words. Front-loaded and efficient.

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 simple get-by-id tool with full annotations and output schema, the description is complete. No missing context.

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% with clear parameter description. The description only restates 'by its ID', adding no new meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the action (Get), the resource (webhook configuration), and the method (by its ID). It effectively distinguishes from the sibling tool list_webhooks.

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?

No explicit guidance on when to use this tool versus alternatives like list_webhooks. Usage is implied (when you know the ID), but no context or exclusions provided.

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

invite_team_memberInvite Team MemberA

Invite a new member to the workspace by email address. An invitation email is sent — the member must accept before gaining access. Roles: owner (full access), admin (manage account, no billing), member (operational access), viewer (read-only). Example: email='ana@example.com', role='member' / Invita a un nuevo miembro al espacio de trabajo por correo electronico. Se envia un email de invitacion — el miembro debe aceptar antes de acceder. Roles: owner (acceso total), admin (gestion sin facturacion), member (acceso operativo), viewer (solo lectura).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name for the invitation (optional) / Nombre para la invitacion (opcional)
roleYesRole to assign (owner cannot be invited, must be transferred) / Rol a asignar (owner no se puede invitar, debe transferirse)
emailYesEmail address of the invitee / Email del invitado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameNo
roleNo
emailYes
statusNo
joinedAtNo
createdAtNo
invitedAtNo
updatedAtNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations indicate a mutation (readOnlyHint=false) and no destructiveness. The description adds behavioral details: an invitation email is sent and the member must accept before gaining access. No contradictions.

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 relatively concise but includes bilingual content (English and Spanish), which may be redundant for a single-language agent. Overall, it is well-structured with clear sections.

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 description covers purpose, flow, and roles, but lacks details on edge cases (e.g., duplicate invitations, invalid emails) and does not mention the output schema exists. Given the presence of an output schema, this is a minor gap.

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%, so baseline is 3. The description adds a usage example and role descriptions, but these largely overlap with schema descriptions. No significant new semantics 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 clearly states the action ('Invite a new member to the workspace by email address') and identifies the resource (team member). It distinguishes from sibling tools like remove_team_member and update_team_member_role by specifying the invitation flow.

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 provides context about the invitation process (email sent, acceptance required) and lists roles with descriptions, but does not explicitly state when to use this tool versus alternatives (e.g., update_team_member_role for role changes).

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

kitchen_flow_summaryKitchen Flow SummaryA
Read-onlyIdempotent

Slow-station detection: aggregates open kitchen tickets per station and flags the bottleneck (station with the highest open-ticket count). Returns per-station openTickets count, oldest wait time in seconds, and an isBottleneck flag. Call this first to diagnose kitchen throughput issues before drilling into individual tickets. / Deteccion de cuello de botella: agrega tickets abiertos por estacion y marca la mas saturada. Devuelve openTickets, tiempo de espera mas antiguo y flag isBottleneck por estacion. Llamar primero para diagnosticar problemas de rendimiento de cocina.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
stationsYes
generatedAtYes
totalOpenTicketsYes
bottleneckStationIdNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context: it aggregates data, returns a bottleneck flag, and provides wait times. No contradictions.

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 English portion is concise and front-loaded. However, the Spanish duplicate makes the description longer than necessary. It's still readable and efficient enough for a simple tool.

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

Completeness5/5

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

Given no parameters, a relatively simple output, and comprehensive annotations, the description fully explains the tool's purpose, usage, and return values, making it complete for an AI agent.

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?

No parameters exist, so the schema fully covers them. The description adds no parameter information, but none is needed. Baseline for 0 params is 4, but the description's clarity on output compensates for the lack of param details.

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 clearly states the tool aggregates open kitchen tickets per station and flags the bottleneck. It specifies the returned fields (openTickets, oldest wait, isBottleneck). This distinguishes it from siblings like list_kitchen_tickets or get_kitchen_ticket.

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 instruction: 'Call this first to diagnose kitchen throughput issues before drilling into individual tickets.' Provides a clear when-to-use and implies not to use for other purposes.

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

ksef_submitSubmit to KSeF (Poland)A

Submit an invoice to the Polish KSeF (Krajowy System e-Faktur) national e-invoicing system. Poland requires e-invoicing for B2B transactions (mandatory phase rolling out 2025).

Modes: • mock — local simulation (no network call, safe for dev/test) • sandbox — KSeF test environment (demo.ksef.mf.gov.pl) • production — live KSeF endpoint (ksef.mf.gov.pl)

NOTE: This tool is a forward-compatible stub. The KSeF transport is infra-ready in Frihet-ERP but not yet exposed as a live public endpoint (production gated on KSeF cert issuance). Until activated, all calls return a NotImplementedYet error with guidance. / NOTA: Este tool es un stub anticipatorio. El transporte KSeF está infra-ready en Frihet-ERP pero aún no expuesto como endpoint público (producción pendiente del certificado KSeF). Hasta su activación, todas las llamadas devuelven un error NotImplementedYet con instrucciones.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoSubmission mode: mock (local sim), sandbox (KSeF test), production (live KSeF). Default: production. / Modo de envío: mock (simulación), sandbox (test KSeF), production (KSeF real).
invoiceIdYesFrihet invoice ID to submit to KSeF / ID de la factura a enviar a KSeF

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNo
_noteNoGuidance on when the tool activates
invoiceIdNo
_notImplementedNoAlways true — KSeF endpoint not yet exposed as a live API
_plannedEndpointNoPlanned REST endpoint path

TDQS

A4.4/5.0
Behavior5/5

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

Beyond annotations (which show non-readonly, non-destructive), description reveals the tool is a forward-compatible stub that returns NotImplementedYet until certificates are issued, plus mode behaviors. This fully prepares the agent for expected behavior.

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?

Well-structured with clear sections, but includes redundant bilingual content (English and Spanish) which nearly doubles length. Front-loaded with purpose, but the duplication could be trimmed without loss of clarity.

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

Completeness5/5

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

With output schema present and only 2 parameters, the description fully covers tool behavior, current limitations, and mode environments. No gaps in information needed for correct agent invocation.

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

Parameters3/5

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

Schema coverage is 100% with detailed descriptions for both parameters (mode enum, invoiceId). Description repeats mode explanations already present in schema, adding no new semantic value beyond what the schema already 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?

Clearly states the tool submits invoices to Polish KSeF system, with explicit modes (mock, sandbox, production). Distinguishes from generic einvoice tools by specifying the national system.

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?

Provides clear usage context for each mode and discloses that the production endpoint is not yet active, guiding agents to use mock/sandbox for testing. Lacks explicit alternatives for other e-invoicing systems, but the tool name implies Poland-specific usage.

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

leave_approveApprove Leave RequestA
Idempotent

TRUST AREA — HR DECISION. Approve a pending leave request. Logs decision with timestamp and approver. Idempotent: re-approving an already approved leave is a no-op. / AREA DE CONFIANZA — DECISION RRHH. Aprueba una solicitud de permiso pendiente. Registra la decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoOptional approval note / Nota de aprobacion opcional
leaveIdYesLeave request ID / ID de la solicitud

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNoLeave type slug (vacation, sick, personal, etc.)
reasonNo
statusNo
endDateNo
createdAtNo
decidedAtNo
decidedByNo
startDateNo
updatedAtNo
employeeIdNo
durationDaysNo
decisionReasonNo

TDQS

A4.5/5.0
Behavior5/5

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

Description adds context beyond annotations: logs decision with timestamp and approver, states idempotency (aligns with idempotentHint). No contradiction with annotations.

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

Conciseness5/5

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

Two sentences front-load key info and include Spanish translation without extra fluff. Every sentence is relevant.

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

Completeness5/5

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

Given output schema exists, description covers purpose, side effects, preconditions (pending), and idempotency. Complete for a simple approval 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% with bilingual descriptions, so description adds no extra parameter meaning; 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 specific verb 'Approve' and resource 'pending leave request', clearly distinguishing from sibling tools like leave_reject and leave_cancel.

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?

While no explicit when-not/alternatives are stated, the name and description implicitly guide an AI agent to use this for approving pending leaves, and the sibling set provides clear contrasts.

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

leave_cancelCancel Leave RequestA
Idempotent

Cancel a leave request. Typically used by the requesting employee before approval, or by HR after approval (which may trigger schedule rollback). / Cancela una solicitud de permiso (por el empleado o RRHH).

ParametersJSON Schema
NameRequiredDescriptionDefault
leaveIdYesLeave request ID / ID de la solicitud

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNoLeave type slug (vacation, sick, personal, etc.)
reasonNo
statusNo
endDateNo
createdAtNo
decidedAtNo
decidedByNo
startDateNo
updatedAtNo
employeeIdNo
durationDaysNo
decisionReasonNo

TDQS

A3.7/5.0
Behavior4/5

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

Adds value beyond annotations by noting that HR cancellation may trigger schedule rollback. Annotations already indicate non-destructive, but description gives helpful behavioral nuance.

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 clearly state the purpose and usage. The Spanish translation is redundant but harmless. Well-structured and front-loaded.

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 tool with one parameter and an output schema (not shown), the description covers typical usage and side effects. Adequate without being overly detailed.

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%, so the parameter leaveId is fully described in the schema. Description adds no additional meaning or example beyond 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?

The description clearly states the action (cancel) and resource (leave request), and distinguishes use by employee vs HR. However, it does not explicitly contrast with siblings like leave_approve or leave_reject, missing a chance to differentiate.

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?

Provides context: used by employee before approval or by HR after approval, with possible schedule rollback. But lacks explicit when-not-to-use or alternative tools, leaving some ambiguity.

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

leave_listList Leave RequestsA
Read-onlyIdempotent

List leave/PTO requests with optional filters. Filter by employee, status (pending/approved/rejected/cancelled), or period (date range). Useful for HR dashboards, calendar views, balance tracking. / Lista solicitudes de permisos con filtros opcionales (empleado, estado, periodo).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoPeriod end ISO 8601 (YYYY-MM-DD) / Fin periodo
fromNoPeriod start ISO 8601 (YYYY-MM-DD) / Inicio periodo
afterNoCursor for cursor-based pagination / Cursor
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
statusNoFilter by status / Filtrar por estado
employeeIdNoFilter by employee ID / Filtrar por empleado

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the description doesn't need to add behavioral safety info. It adds context about filters but no additional behavioral traits beyond what annotations provide.

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

Conciseness5/5

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

The description is two sentences in English plus a Spanish translation, with no wasted words. It is front-loaded with the core action and filters.

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

Completeness5/5

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

Given the comprehensive annotations, full schema coverage, and existence of an output schema, the description provides sufficient context for an AI agent to understand the tool's purpose and usage.

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%, so baseline 3. The description mentions filter options (employee, status, period) but does not add new semantics beyond what the schema already describes for each parameter.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'leave/PTO requests', and specifies optional filters. It distinguishes from sibling tools like leave_approve, leave_cancel, etc., which have different purposes.

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 usage context ('Useful for HR dashboards, calendar views, balance tracking'), implying when to use it. It does not explicitly exclude alternatives, but the sibling tools clearly cover other actions.

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

leave_rejectReject Leave RequestA
Idempotent

TRUST AREA — HR DECISION. Reject a pending leave request with a required reason. Reason is mandatory for transparency and labor-law compliance. / AREA DE CONFIANZA — DECISION RRHH. Rechaza una solicitud con motivo obligatorio.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesRequired rejection reason / Motivo obligatorio de rechazo
leaveIdYesLeave request ID / ID de la solicitud

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNoLeave type slug (vacation, sick, personal, etc.)
reasonNo
statusNo
endDateNo
createdAtNo
decidedAtNo
decidedByNo
startDateNo
updatedAtNo
employeeIdNo
durationDaysNo
decisionReasonNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations (idempotentHint=true, destructiveHint=false) already indicate safe, idempotent operation. Description adds 'TRUST AREA — HR DECISION' and reason compliance context, but no additional behavioral details beyond annotations.

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 plus bilingual repetition, front-loaded with purpose. The Spanish translation is redundant but does not significantly bloat. Could be slightly more concise but effective.

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 rejection tool with two params and existing output schema, description adequately covers purpose and key constraint. No need to detail output as schema handles it.

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

Parameters4/5

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

Schema covers 100% of parameters with basic descriptions. Description adds semantic value by explaining reason is mandatory for 'transparency and labor-law compliance' and flags as trust area, enhancing parameter meaning beyond 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?

Description clearly states 'Reject a pending leave request with a required reason,' specifying the verb, resource, and constraint. Distinct from sibling tools like leave_approve and leave_cancel.

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?

Provides context for rejection (pending leave request) and reason requirement, implicitly distinguishing from approval/cancellation. Lacks explicit when-not guidance but context is clear.

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

leave_request_createCreate Leave RequestA

Create a new leave/PTO request for an employee. Types: 'vacation', 'sick', 'personal', 'parental', 'unpaid', 'training'. Dates must be ISO 8601 (YYYY-MM-DD). Status starts as 'pending' awaiting manager approval. / Crea una nueva solicitud de vacaciones/permiso. Estado inicial 'pending' pendiente aprobacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesLeave type slug (vacation, sick, personal, parental, unpaid, training) / Tipo de permiso
reasonNoOptional reason / Motivo opcional
endDateYesEnd date ISO 8601 (YYYY-MM-DD) / Fecha fin
startDateYesStart date ISO 8601 (YYYY-MM-DD) / Fecha inicio
employeeIdYesEmployee ID / ID del empleado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNoLeave type slug (vacation, sick, personal, etc.)
reasonNo
statusNo
endDateNo
createdAtNo
decidedAtNo
decidedByNo
startDateNo
updatedAtNo
employeeIdNo
durationDaysNo
decisionReasonNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate a mutation (readOnlyHint=false) and non-destructive behavior. The description adds value by specifying that the created request starts as 'pending,' which informs the agent about the post-creation state.

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 English sentences (plus Spanish translation) that convey all essential information without redundancy. Every sentence serves a purpose.

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 create tool with an output schema, the description adequately covers input behavior (types, dates, initial status). No missing critical information 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 100% with descriptions for all parameters. The description adds extra meaning by listing the allowed types for 'type' and specifying ISO 8601 format for dates, which is not fully detailed in the schema.

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

Purpose5/5

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

The description clearly states 'Create a new leave/PTO request for an employee' and distinguishes from sibling tools like leave_approve, leave_cancel, etc. It lists leave types and mentions initial status, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description explains that status starts as 'pending' awaiting approval, implying this is the creation step. It does not explicitly state when not to use it, but the context of sibling tools provides adequate guidance.

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

list_bank_accountsList Bank AccountsA
Read-onlyIdempotent

List all connected bank accounts for the workspace. Returns alias, IBAN (last 4 digits only for security), currency, balance, and last sync timestamp. / Lista todas las cuentas bancarias conectadas al espacio de trabajo. Devuelve alias, IBAN (solo ultimos 4 digitos por seguridad), divisa, saldo y ultima sincronizacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds behavioral details such as security masking of IBAN and the specific fields returned, which is useful beyond annotations.

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 concise with two sentences in English followed by the same in Spanish. While efficient, the bilingual repetition may be unnecessary for an AI agent, but it remains clear and front-loaded.

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 presence of a full output schema (implied) and complete annotation coverage, the description adequately rounds out the tool's behavior. It mentions returned fields and security, but does not cover potential edge cases like empty results or rate limits.

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 input schema provides full coverage (100%) with descriptions for both 'limit' and 'offset'. The description does not add additional semantic meaning or usage guidance for these parameters beyond what the schema already offers.

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 clearly states that the tool lists all connected bank accounts for the workspace, specifying the exact fields returned (alias, IBAN with masking, currency, balance, timestamp). This distinguishes it from the sibling tool 'get_bank_account', which likely retrieves a single account.

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 clearly indicates usage for listing all bank accounts, but does not mention when not to use it or provide alternatives like 'get_bank_account' for single account retrieval. No explicit guidance on prerequisites or context.

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

list_client_activitiesList Client ActivitiesA
Read-onlyIdempotent

List all CRM activities for a client with optional pagination. Returns calls, emails, meetings, and tasks logged against the client. / Lista todas las actividades CRM de un cliente con paginacion opcional.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
clientIdYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint, idempotentHint, etc.), the description adds that pagination is optional and details what is returned (calls, emails, etc.). However, it omits potential constraints like date range or sorting.

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 English sentences with a Spanish translation. No fluff, front-loaded with the primary action. Every sentence adds 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?

Given the presence of an output schema, the description adequately covers purpose, resource, and pagination. Missing details like ordering or error scenarios, but overall sufficient for a list 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% with descriptions for each parameter. The description only adds context about optional pagination, which is already implied by limit and offset, so little extra value.

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 clearly states the verb 'List', the resource 'all CRM activities for a client', and specifies the types of activities returned (calls, emails, meetings, tasks). It distinguishes from siblings like log_client_activity (create) and list_client_notes (notes).

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 provides the general use case (listing CRM activities) but lacks explicit guidance on when to use this tool versus alternatives, no when-not-to-use or context-specific instructions.

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

list_client_contactsList Client ContactsA
Read-onlyIdempotent

List all contacts for a client with optional pagination. Returns name, email, phone, role, and primary flag. / Lista todos los contactos de un cliente con paginacion opcional.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
clientIdYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4/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. The description adds value by mentioning optional pagination and the fields returned, which is consistent and helpful but not extensive.

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

Conciseness5/5

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

Two sentences in English and Spanish, no wasted words, front-loaded with key information. Highly concise and well-structured.

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 existence of an output schema (expected to cover return format), the description sufficiently mentions returned fields. Missing ordering info, but overall adequate for a list 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%, so all parameters are described. The description adds 'optional pagination' but does not provide new details beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'contacts for a client', and specifies the returned fields. It distinguishes well from siblings like list_clients or list_invoices.

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?

Implied usage is clear (when you need contacts for a client), but no explicit guidance on when not to use this tool or alternatives. Siblings include delete_client_contact but no creation/update tool, so no direct alternative is mentioned.

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

list_client_notesList Client NotesB
Read-onlyIdempotent

List all notes for a client with optional pagination. / Lista todas las notas de un cliente con paginacion opcional.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
clientIdYesClient ID / ID del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

B3.4/5.0
Behavior2/5

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

Description adds no behavioral traits beyond annotations (readOnlyHint, destructiveHint). No mention of auth, rate limits, or response format.

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?

Two languages (English and Spanish) repeat the same content, making it slightly redundant. Could be more concise but still short.

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 list tool with pagination, annotations cover safety, and output schema exists. The description is adequate; no major gaps.

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 describes parameters. The description adds 'optional pagination', which aligns with limit/offset, but no extra meaning beyond 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?

Clearly states verb 'list', resource 'notes for a client', and scope 'all notes with optional pagination'. Distinguishes from sibling tools like create_client_note and delete_client_note.

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?

No explicit when/when-not or alternatives. Implied usage is clear (list notes for a client), but no guidance on ordering or filtering beyond pagination.

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

list_clientsList ClientsA
Read-onlyIdempotent

List all clients/customers with optional pagination. Returns contact info, tax IDs, and addresses. / Lista todos los clientes con paginacion opcional. Devuelve informacion de contacto, NIF/CIF y direcciones.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch by name or email / Buscar por nombre o email
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results (1-100) / Resultados maximos
stageNoFilter by CRM stage / Filtrar por etapa del CRM
fieldsNoComma-separated field names to return (e.g. 'id,name,email') / Campos a devolver
offsetNoOffset / Desplazamiento

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.1/5.0
Behavior4/5

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

Description aligns with annotations (readOnly, idempotent, non-destructive) and adds value by specifying return content (contact info, tax IDs, addresses). No contradictions.

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 in English and Spanish, no wasted words, front-loaded with key information.

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?

Lacks mention of field selection ('fields' parameter) and filtering ('stage'), which are important for agent to know. Output schema exists but description could be more comprehensive.

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%, so baseline is 3. Description does not add significant insight beyond schema, e.g., omitting mention of 'fields' or 'stage' parameters.

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?

Description clearly states verb 'List', resource 'clients/customers', and scope 'all with optional pagination', distinguishing it from sibling tools like get_client.

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?

Mentions optional pagination and return fields, but lacks explicit guidance on when to use this vs. get_client for a single client or other list tools.

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

list_depositsList DepositsA
Read-onlyIdempotent

List all deposits with optional pagination and date range filters. Returns deposits sorted by date (newest first). Example: from='2026-01-01', to='2026-03-31', clientId='abc', limit=50 / Lista todos los depositos con paginacion y filtros de fecha opcionales.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter (YYYY-MM-DD) / Fecha fin
fromNoStart date filter (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results (1-100) / Resultados maximos
fieldsNoComma-separated field names to return (e.g. 'id,amount,status') / Campos a devolver
offsetNoOffset / Desplazamiento
statusNoFilter by status (e.g. 'pending', 'applied', 'refunded') / Filtrar por estado
clientIdNoFilter by client ID / Filtrar por ID de cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

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 and destructiveHint=false. The description adds sorting order (newest first) and pagination methods (cursor/offset), going beyond annotations.

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 with an example, front-loaded. Bilingual text adds length but is acceptable. No extraneous 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?

With output schema present, return values are covered. Description covers purpose, pagination, sorting, and filters. Adequate for an 8-parameter list 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% with good descriptions for all parameters. The description adds an example but no new semantic meaning 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 clearly states "List all deposits" with verb and resource, specifies sorting order (newest first), and distinguishes from sibling tools like get_deposit or create_deposit.

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?

Provides example usage and mentions optional pagination/date filters, but does not explicitly compare to sibling tools. However, as the only list tool for deposits, context is clear.

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

list_expensesList ExpensesA
Read-onlyIdempotent

List all expenses with optional pagination and date range filters. Returns expenses sorted by date (newest first). Example: from='2026-01-01', to='2026-03-31', limit=50 / Lista todos los gastos con paginacion y filtros de fecha opcionales.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter (YYYY-MM-DD) / Fecha fin
fromNoStart date filter (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results (1-100) / Resultados maximos
fieldsNoComma-separated field names to return (e.g. 'id,description,amount') / Campos a devolver
offsetNoOffset / Desplazamiento
categoryNoFilter by expense category (e.g. 'office', 'travel') / Filtrar por categoria
vendorIdNoFilter by vendor ID / Filtrar por ID de proveedor

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds that results are sorted newest first and provides an example, which is useful but doesn't conflict with annotations.

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

Conciseness5/5

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

Extremely concise: two sentences with core functionality, an example, and bilingual information. No redundant content, key information is front-loaded.

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

Completeness4/5

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

Covers major features (pagination, date range, sorting). Output schema exists, so return values are documented. Missing mention of category/vendor filters, but they are in schema. Adequate for a read-only list 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?

All parameters have descriptions in the schema (100% coverage). The description adds an example showing common parameter usage, but no additional semantic meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool lists expenses with optional pagination and date range filters, and returns results sorted by date. It is specific to expenses and distinguishes from sibling list tools like list_invoices.

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 guidance on when to use this tool versus alternatives (e.g., search for expenses, other expense actions). Users must infer from the name and context.

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

list_invoicesList InvoicesB
Read-onlyIdempotent

List all invoices with optional pagination and filters. Returns a paginated list sorted by issue date (newest first). Supports filtering by status (draft/sent/paid/overdue/cancelled) and date range. Example: status='paid', from='2026-01-01', to='2026-03-31', limit=20 / Lista facturas con paginacion y filtros opcionales. Soporta filtrado por estado y rango de fechas.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter in ISO 8601 (YYYY-MM-DD) / Fecha fin
fromNoStart date filter in ISO 8601 (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results per page (1-100, default 50) / Resultados por pagina
fieldsNoComma-separated field names to return (e.g. 'id,clientName,total') / Campos a devolver
offsetNoNumber of results to skip / Resultados a saltar
statusNoFilter by invoice status / Filtrar por estado
clientIdNoFilter by client ID / Filtrar por ID de cliente
seriesIdNoFilter by invoice series ID / Filtrar por ID de serie

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds pagination behavior, sorting order, and filter support. Does not disclose limitations (e.g., global vs scoped) or pagination interaction. Adequate but not rich.

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

Conciseness4/5

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

Two concise English sentences front-loaded with purpose, then details and example. Bilingual addition is redundant but not harmful. No wasted words.

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?

With 9 parameters, description only highlights status and date range, ignoring clientId, seriesId, after, offset, fields. Missing key filter capabilities despite output schema existing. Incomplete for complexity.

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% with detailed parameter descriptions. Description redundantly mentions status and date range filters but introduces no new semantics. Baseline of 3 is appropriate.

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?

Clearly states 'List all invoices with optional pagination and filters' and mentions sorting by issue date. Distinguishes from sibling search_invoices implicitly by being a broad listing, but does not explicitly differentiate. Example adds clarity.

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 guidance on when to use this vs alternatives like search_invoices. Does not specify scope (e.g., user/workspace limitations) or when not to use. The example shows usage but no context for decision.

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

list_kitchen_stationsList Kitchen StationsA
Read-onlyIdempotent

List all kitchen stations. Returns station id, name, and active status. Use kitchen_flow_summary to see per-station ticket load and bottlenecks. / Lista todas las estaciones de cocina. Devuelve id, nombre y estado activo. Usa kitchen_flow_summary para ver carga por estacion y cuellos de botella.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100)
offsetNoOffset / Desplazamiento

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so safety is covered. Description adds no additional behavioral traits beyond what annotations provide, which is adequate but not enhanced.

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

Conciseness4/5

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

Two effective sentences in English, front-loaded with purpose and usage. However, the entire description is duplicated in Spanish, which adds unnecessary length for English-speaking agents. Still, the structure is clean.

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 list tool, the description covers purpose, return fields, and alternative usage. Annotations cover safety, schema covers params, and output schema exists. No critical gaps.

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 has 2 parameters (limit, offset) with 100% description coverage. The tool description does not add any additional meaning or context about parameters beyond what the schema already 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?

Clearly states 'List all kitchen stations' and specifies returned fields (id, name, active status). Explicitly distinguishes from sibling tool kitchen_flow_summary by directing users there for ticket load and bottlenecks.

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 tells when to use this tool for listing stations, and when to use kitchen_flow_summary instead for per-station load/bottlenecks. Provides clear alternative guidance.

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

list_kitchen_ticketsList Kitchen TicketsA
Read-onlyIdempotent

List all kitchen order tickets for the live order board, with optional filters by status or station. Returns ticket id, station, status, table ref, and items. / Lista todos los tickets de cocina del panel en vivo, con filtros opcionales por estado o estacion. Devuelve id, estacion, estado, mesa e items.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoCursor for cursor-based pagination / Cursor de paginacion
limitNoMax results (1-100)
offsetNoOffset / Desplazamiento
statusNoFilter by ticket status: on_hold, queued, preparing, ready, served, voided. / Filtrar por estado: on_hold, queued, preparing, ready, served, voided.
stationIdNoFilter by station ID / Filtrar por ID de estacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. Description adds value by specifying returned fields (id, station, status, table ref, items), providing clarity beyond annotations without contradiction.

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, bilingual, front-loaded with main action. No redundant information; every sentence serves a purpose.

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?

Tool has 5 optional parameters, output schema exists, annotations present. Description covers purpose, filters, and return fields; pagination parameters are adequately documented in schema.

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%, so each parameter has full description. The description reiterates optional filters by status/station but does not add new semantic information 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?

Descriptions states 'List all kitchen order tickets for the live order board', clearly specifying verb and resource. It distinguishes from siblings like get_kitchen_ticket (single ticket), update_kitchen_ticket (mutation), and list_kitchen_stations (different entity).

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?

Description implies usage for viewing live board tickets with optional filters. It does not explicitly state when not to use or suggest alternatives, but the context of filters and the sibling tools list provides enough differentiation.

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

list_menu_itemsList Menu ItemsA
Read-onlyIdempotent

List the kitchen menu catalog. Supports free-text search and active/inactive filter. Returns item id, name, description, price, category, and active status. / Lista el catálogo de menu de cocina. Admite búsqueda de texto y filtro activo/inactivo. Devuelve id, nombre, descripcion, precio, categoria y estado activo.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search by name or description / Busqueda por nombre o descripcion
afterNoCursor for cursor-based pagination / Cursor de paginacion
limitNoMax results (1-100)
offsetNoOffset / Desplazamiento
isActiveNoFilter by active status / Filtrar por activos

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds value by specifying the returned fields and filtering capabilities. It does not contradict annotations and provides useful behavioral context beyond the structured data.

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 extremely concise: two sentences in English and the same in Spanish. It is front-loaded with the core purpose, features, and return fields. Every sentence earns its place with no redundancy.

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

Completeness4/5

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

Given the presence of an output schema and full annotation, the description covers the main aspects: purpose, search/filter support, and return fields. It does not mention pagination or ordering, but those are detailed in the schema. Slightly lacking in completeness but still solid.

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 parameters are already well-documented. The description mentions free-text search and active/inactive filter, aligning with params 'q' and 'isActive', but adds no new meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool lists the kitchen menu catalog, with specific features like free-text search and active/inactive filtering, and explicitly lists return fields. It distinguishes from sibling list tools (e.g., list_products) by targeting the kitchen menu catalog.

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 does not explicitly state when to use this tool vs alternatives, nor does it provide when-not-to-use guidance. While the purpose is clear, the lack of comparative or contextual usage instructions limits its helpfulness.

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

list_productsList ProductsA
Read-onlyIdempotent

List all products/services with optional pagination. Products are reusable items that can be added to invoices and quotes. / Lista todos los productos/servicios con paginacion opcional. Los productos son conceptos reutilizables para facturas y presupuestos.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch by product name / Buscar por nombre de producto
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results (1-100) / Resultados maximos
fieldsNoComma-separated field names to return (e.g. 'id,name,unitPrice') / Campos a devolver
offsetNoOffset / Desplazamiento
isActiveNoFilter by active status / Filtrar por estado activo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds minimal extra behavioral context (optional pagination, product reusability). Annotations carry the transparency burden.

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 per language, front-loaded with English. Efficient but bilingual repetition slightly reduces conciseness. No wasted words.

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?

Output schema exists to document return values. Description covers purpose and core behavior. Missing details like default ordering or full response structure, but adequate for a list tool with good annotations.

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%, so baseline is 3. Description mentions 'optional pagination' but does not add specific parameter details beyond what 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?

Description clearly states it lists all products/services with optional pagination, and defines products as reusable items for invoices/quotes. This distinguishes it from sibling tools like get_product (single) and create_product.

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?

No explicit guidance on when to use this tool vs alternatives like search_invoices or get_product. The purpose is clear but lacks when-not or alternative recommendations.

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

list_propertiesList PropertiesB
Read-onlyIdempotent

List all rental properties for the workspace. Returns name, address, capacity, owner info, and license number. / Lista todas las propiedades de alquiler vacacional. Devuelve nombre, direccion, capacidad, datos del propietario y numero de licencia.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch by name or address / Buscar por nombre o direccion
afterNoCursor for cursor-based pagination / Cursor de paginacion
limitNoMax results (1-100)
fieldsNoComma-separated fields to return / Campos a devolver
offsetNoOffset / Desplazamiento
isActiveNoFilter by active status / Filtrar por activas

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds the returned fields (capacity, owner info, license number), which provides some context beyond annotations but no additional behavioral traits like rate limits or state changes.

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 short (two sentences) and front-loaded with purpose. The bilingual text adds length but is not excessive. Could be more concise by dropping one language, but still efficient.

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 output schema exists, the description adequately covers the tool's purpose and main returned fields. For a read-only list tool with annotations, it provides sufficient context.

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%, so the schema already describes all 6 parameters. The description does not add any meaning beyond the schema; it only mentions returned fields, not parameter details. Baseline 3 is appropriate.

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?

Clearly states it lists rental properties with specific fields (name, address, etc.). The verb 'list' and resource 'properties' are explicit. However, it does not differentiate from sibling list tools (e.g., list_invoices) other than by name, which is acceptable but not exemplary.

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 guidance on when to use this tool vs alternatives, nor when not to use it. The description only states what it does, leaving the agent to infer usage context.

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-onlyIdempotent

List all quotes/estimates with optional pagination and filters. Quotes are proposals sent to clients before they become invoices. Supports filtering by status (draft/sent/accepted/rejected/expired) and date range. Example: status='sent', from='2026-01-01', limit=20 / Lista todos los presupuestos con paginacion y filtros opcionales. Soporta filtrado por estado y rango de fechas.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter (YYYY-MM-DD) / Fecha fin
fromNoStart date filter (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor
limitNoMax results (1-100) / Resultados maximos
fieldsNoComma-separated field names to return (e.g. 'id,clientName,total') / Campos a devolver
offsetNoOffset / Desplazamiento
statusNoFilter by quote status / Filtrar por estado
clientIdNoFilter by client ID / Filtrar por ID de cliente
seriesIdNoFilter by quote series ID / Filtrar por ID de serie

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that quotes are 'proposals sent to clients before they become invoices' and lists supported statuses. No contradictions; description complements annotations well.

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

Conciseness4/5

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

The description is brief and front-loaded with purpose. It includes both English and Spanish, which adds length but provides clarity for multilingual users. No wasted sentences, though the bilingual repetition could be slightly trimmed for English-only agents.

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 listing tool with 9 optional parameters and an output schema, the description explains the business context (quotes are proposals), supported filters, and pagination. It is complete enough for an AI agent to select and use the tool correctly.

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

Parameters4/5

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

Schema coverage is 100% with bilingual descriptions. The description adds value by grouping functionality ('optional pagination and filters') and providing a concrete example (status='sent', from='2026-01-01', limit=20). The example helps clarify usage beyond schema alone.

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 clearly states 'list all quotes/estimates' with optional pagination and filters. It distinguishes quotes as proposals before invoices, differentiating from sibling tools like list_invoices and get_quote. The verb 'list' and resource 'quotes' are specific and 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 explains when to use the tool (to list quotes with filters and pagination) and gives an example. It does not explicitly state when not to use or mention alternatives, but the context of sibling tools and the detailed description make usage clear.

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

list_recurring_invoicesList Recurring InvoicesA
Read-onlyIdempotent

List all recurring invoice templates. Returns template name, frequency, next scheduled run date, recipient, line items, and active/paused status. / Lista todas las plantillas de facturas recurrentes. Devuelve nombre de la plantilla, frecuencia, proxima fecha de ejecucion, destinatario, lineas y estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
statusNoFilter by status / Filtrar por estado

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnly and non-destructive. Description adds no behavioral traits beyond listing fields. No contradiction but also no added value beyond annotations.

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 concise English sentences then bilingual repeat. Front-loaded with key info. Minimal waste, but the translation adds 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?

Given output schema exists, description adequately covers return fields and pagination. No gaps for this simple list 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% with parameter descriptions. Description does not add additional meaning beyond what schema provides; baseline score 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?

Clearly states 'List all recurring invoice templates' with specific verb and resource, and enumerates returned fields. Distinguishes from sibling tools like get_recurring_invoice and create_recurring_invoice.

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 by describing what it lists, but does not explicitly state when to use it over get_recurring_invoice or other listing tools. No when-not or alternative guidance.

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

list_reservationsList ReservationsA
Read-onlyIdempotent

List all reservations for the workspace, with optional filters by property, status, or date range. Returns guest, dates, channel, and total. / Lista todas las reservas del espacio de trabajo, con filtros opcionales por propiedad, estado o rango de fechas.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoCursor for cursor-based pagination / Cursor de paginacion
limitNoMax results (1-100)
fieldsNoComma-separated fields to return / Campos a devolver
offsetNoOffset for pagination / Desplazamiento
statusNoFilter by reservation status / Filtrar por estado
checkInToNoCheck-in to date YYYY-MM-DD / Entrada hasta (YYYY-MM-DD)
propertyIdNoFilter by property ID / Filtrar por propiedad
checkInFromNoCheck-in from date YYYY-MM-DD / Entrada desde (YYYY-MM-DD)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to restate those. The description adds the return fields (guest, dates, channel, total) but does not disclose pagination behavior, defaults, or other side effects. It provides adequate but minimal behavioral context beyond 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 a single concise sentence in English and Spanish. It is front-loaded with the main purpose and uses no filler. Every part adds 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?

Given the presence of an output schema and 8 parameters, the description covers the most common use cases and return fields. It lacks explicit mention of pagination or field selection, but the schema fills those gaps. Slightly above adequate for a list tool with comprehensive structured documentation.

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%, so parameters are already documented. The description groups filters (property, status, date range) which adds some semantic grouping, but does not explain pagination parameters (after, limit, offset) or fields. Baseline 3 is appropriate given high schema coverage.

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 clearly states the action ('List all reservations'), the resource ('for the workspace'), and the scope with optional filters. It also mentions the returned fields (guest, dates, channel, total). This sets it apart from sibling tools like get_reservation or list_properties.

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 what the tool does and lists optional filters, but it does not explicitly indicate when to use this tool versus alternatives like get_reservation for a single reservation. Usage is implied but not contrasted with siblings.

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

list_salesList POS SalesA
Read-onlyIdempotent

List POS sales with optional filters by date range, terminal, or status. / Lista las ventas POS con filtros opcionales por fecha, terminal o estado.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD / Fecha de fin
fromNoStart date YYYY-MM-DD / Fecha de inicio
afterNoCursor for cursor-based pagination / Cursor de paginacion
limitNoMax results (1-100)
offsetNoOffset / Desplazamiento
statusNoFilter by sale status / Filtrar por estado
terminalIdNoFilter by terminal ID / Filtrar por terminal

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true, so the tool is safe and idempotent. The description adds only that it lists sales with filters, which is obvious from the tool name, and does not provide additional behavioral context beyond 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 a single sentence (plus Spanish translation) that is concise, front-loaded, and contains no extraneous 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?

Given the presence of a complete output schema, full annotation coverage, and 100% schema description coverage, the description is adequate. It mentions the filter types but does not explain pagination behavior, which is partially covered in schema.

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%, so baseline is 3. The description mentions filters by date range, terminal, or status, which adds some context beyond the parameter descriptions in the schema, but not significantly more.

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 clearly states the action 'List' and the resource 'POS sales', and mentions optional filters by date range, terminal, or status, which distinguishes it from related tools like get_sale.

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 implies usage for listing sales with filters but does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention when not to use it.

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

list_team_membersList Team MembersA
Read-onlyIdempotent

List all members in the workspace. Returns member ID, name, email, role, and invite status (pending/active). Useful for access management and auditing who has access to the account. / Lista todos los miembros del espacio de trabajo. Devuelve ID, nombre, email, rol y estado de invitacion (pendiente/activo). Util para gestion de accesos y auditoria de quien tiene acceso a la cuenta.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoFilter by role / Filtrar por rol
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
statusNoFilter by invite status / Filtrar por estado de invitacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

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, idempotentHint=true, destructiveHint=false. The description adds value by listing the specific fields returned and the invite status values, beyond what annotations provide. It does not contradict annotations.

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

Conciseness4/5

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

The description is concise in English (two sentences) and includes a bilingual version, which adds length but is still clear. Every sentence contributes to purpose, output, and use case. No superfluous content.

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 annotations and output schema exist, the description covers purpose, output, and use cases. It does not explain pagination behavior or default sorting, but for a simple list tool, it is fairly 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 100%, so parameters are fully described in the schema. The description does not add extra meaning or usage examples for role, limit, offset, or status. Baseline of 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 clearly states the tool lists all members in the workspace and specifies the returned fields (ID, name, email, role, invite status). It also notes use cases (access management, auditing). It is distinct from sibling tools like invite_team_member or remove_team_member.

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 implies usage for access management and auditing but does not explicitly state when to use this tool versus alternatives. No exclusions or alternative tool references are provided. Context is clear but guidance is limited.

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

list_terminalsList POS TerminalsA
Read-onlyIdempotent

List all configured POS terminals (Stripe Terminal readers) for the workspace. Returns terminal label, device type, location, and connection status. / Lista todos los terminales de punto de venta (lectores Stripe Terminal). Devuelve etiqueta, tipo de dispositivo, ubicacion y estado de conexion.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100)
offsetNoOffset / Desplazamiento
locationIdNoFilter by location ID / Filtrar por ubicacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds the returned data fields (label, device type, location, connection status), which is useful context.

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

Conciseness5/5

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

Two concise sentences (English and Spanish), no wasted words. Front-loaded with key purpose.

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 output schema and annotations, description is adequate. Could mention pagination behavior but not necessary given schema.

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% with descriptions for all 3 parameters. Description does not add additional meaning to parameters beyond 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 'list all configured POS terminals (Stripe Terminal readers) for the workspace' with specific fields returned. Clearly differentiates from sibling tools like list_invoices.

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?

No explicit guidance on when to use vs alternatives, but the tool's function is straightforward and implied by the name and description.

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

list_time_entriesList Time EntriesA
Read-onlyIdempotent

List time tracking entries with optional filters. Filter by user, project, date range, or billable status. Useful for generating timesheets, billing reports, and project cost analysis. / Lista entradas de tiempo con filtros opcionales. Filtra por usuario, proyecto, rango de fechas o facturabilidad. Util para partes de trabajo, informes de facturacion y analisis de costes por proyecto.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date ISO 8601 (YYYY-MM-DD) / Fecha fin
fromNoStart date ISO 8601 (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination / Cursor para paginacion
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
userIdNoFilter by user ID / Filtrar por ID de usuario
billableNoFilter by billable flag / Filtrar por facturabilidad
projectIdNoFilter by project ID / Filtrar por ID de proyecto

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, fully covering safety and idempotency. The description adds filter context but does not reveal additional behavioral traits (e.g., pagination behavior, sorting defaults). With strong annotations, a score of 3 is appropriate.

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

Conciseness3/5

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

The description is bilingual (English and Spanish), which doubles its length but is a common pattern for multilingual tools. It is front-loaded with the English purpose and use cases, then repeats in Spanish. While not excessively long, it could be more concise by omitting the Spanish if a single language suffices for the agent.

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

Completeness4/5

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

Given an output schema exists (as indicated by context), the description does not need to explain return values. It covers purpose, filters, and use cases adequately. For a simple list tool with strong annotations, it provides sufficient context to use the tool effectively.

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?

All 8 parameters have descriptions in the input schema (100% coverage), so the tool description does not need to add parameter-level details. The description merely mentions filter categories, which aligns with the schema. 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 clearly states the verb 'List' and resource 'time tracking entries', specifies optional filters (user, project, date range, billable status), and lists use cases (timesheets, billing, cost analysis). This differentiates it from sibling tools like get_time_entry and get_time_summary.

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

Usage Guidelines4/5

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

The description provides context on when to use the tool (generating timesheets, billing reports, project cost analysis) but does not explicitly state when not to use it or mention alternative tools. However, the purpose is clear enough for an agent to decide.

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

list_transactionsList Bank TransactionsA
Read-onlyIdempotent

List bank transactions with optional filters. Filter by account, date range, status (pending/posted/excluded), or category. Useful for reconciliation, expense matching, and cash flow analysis. / Lista movimientos bancarios con filtros opcionales. Filtra por cuenta, rango de fechas, estado (pendiente/contabilizado/excluido) o categoria. Util para conciliacion, asignacion de gastos y analisis de flujo de caja.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date ISO 8601 (YYYY-MM-DD) / Fecha fin
fromNoStart date ISO 8601 (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination / Cursor para paginacion
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento
statusNoFilter by transaction status / Filtrar por estado
categoryNoFilter by category slug / Filtrar por categoria
accountIdNoFilter by bank account ID / Filtrar por ID de cuenta

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

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, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, non-destructive read operation. The description adds no behavioral information beyond what annotations provide. It does not contradict annotations.

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

Conciseness2/5

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

The description is duplicated in English and Spanish, making it twice as long as necessary. While it is front-loaded with English, the bilingual content is inefficient and reduces conciseness.

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 description adequately covers the tool's purpose and common filters. Given that an output schema exists and schema coverage is 100%, the description does not need to explain return values. However, it lacks details about pagination behavior (cursor vs offset) and ordering.

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 all parameters have descriptions in the schema. The description mentions filter types but does not add semantic meaning beyond what the schema already provides. It is appropriate to give a baseline score of 3.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'List bank transactions with optional filters.' It specifies the resource (bank transactions) and the action (list), and mentions the available filter dimensions. It distinguishes from sibling tools like categorize_transaction or match_transaction_to_invoice which perform different operations.

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 provides context by listing use cases: 'useful for reconciliation, expense matching, and cash flow analysis.' However, it does not explicitly state when not to use this tool or contrast it with alternatives such as search_invoices or list_expenses, which could also be used for financial analysis.

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

list_vendorsList VendorsA
Read-onlyIdempotent

List all vendors/suppliers with optional pagination and search. Returns contact info, tax IDs, and addresses. / Lista todos los proveedores con paginacion y busqueda opcional. Devuelve informacion de contacto, NIF/CIF y direcciones.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch query (name, email, etc.) / Busqueda por texto
afterNoCursor for pagination / Cursor de paginacion
limitNoMax results (1-100) / Resultados maximos
fieldsNoComma-separated fields to return / Campos a devolver separados por coma
offsetNoOffset / Desplazamiento

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. The description adds value by specifying that it returns contact info, tax IDs, and addresses, and mentions optional pagination and search, providing context beyond 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 concise, front-loaded with key information, and provides bilingual support (English/Spanish) 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 the presence of an output schema and 5 optional parameters, the description covers the main purpose and return fields. It could be more complete by mentioning that pagination uses cursor or offset, but overall adequate.

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% with each parameter described. The description adds no new information about parameters beyond stating 'optional pagination and search'; it does not explain how to use parameters like 'after' vs 'offset' for pagination.

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 clearly states 'List all vendors/suppliers with optional pagination and search' and specifies return fields (contact info, tax IDs, addresses). This distinguishes it from sibling tools like get_vendor (single vendor) and other list tools.

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?

No explicit guidance on when to use this tool versus alternatives such as get_vendor for a single vendor or search_invoices. The description only implies usage for listing with optional filters.

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

list_webhooksList WebhooksB
Read-onlyIdempotent

List all configured webhooks. Webhooks send HTTP POST notifications when events occur in Frihet. / Lista todos los webhooks configurados. Los webhooks envian notificaciones HTTP POST cuando ocurren eventos en Frihet.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (1-100) / Resultados maximos
offsetNoOffset / Desplazamiento

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the tool's safety profile is clear. The description adds general context about webhooks (HTTP POST notifications) but does not disclose additional behavioral traits like pagination or ordering. This adds minimal value beyond annotations.

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 concise with two sentences per language. It front-loads the main action. The bilingual text is slightly redundant but not excessive. Overall efficient.

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?

The tool has an output schema, so return values are documented externally. The description covers the tool's purpose and basic context. It does not mention pagination or filtering, but given the schema covers those, it is adequate for a simple list operation.

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%, meaning all parameters have descriptions in the schema. The tool description adds no further explanation of parameters beyond what the schema provides. Baseline score of 3 is appropriate.

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 action ('List all configured webhooks') and the resource. It is a specific verb+resource. Although there are sibling tools like get_webhook, create_webhook, etc., the description does not explicitly differentiate from them, but the intent is clear.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., get_webhook). It simply states what it does. There is no mention of context or exclusions.

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

log_client_activityLog Client ActivityB

Log a CRM activity against a client. Use to track calls, emails, meetings, or tasks. Example: clientId='abc123', type='call', title='Discussed Q2 proposal', description='Client interested in upgrade' / Registra una actividad CRM para un cliente. Usa para rastrear llamadas, emails, reuniones o tareas.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoActivity date (ISO 8601, defaults to now) / Fecha de la actividad
typeYesActivity type / Tipo de actividad
titleYesActivity title / Titulo de la actividad
clientIdYesClient ID / ID del cliente
descriptionNoDetailed description / Descripcion detallada

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
typeYes
titleYes
createdAtNo
updatedAtNo
descriptionNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false (write operation) and destructiveHint=false (non-destructive). The description adds context that it logs CRM activities, which is consistent. No additional behavioral details like permissions or side effects are provided, but annotations cover the basics.

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

Conciseness3/5

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

The description is two sentences plus a repeated bilingual version. It is reasonably concise but includes Spanish repetition, making it slightly longer than necessary. Front-loading is good with a clear action statement.

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 has 5 parameters (3 required) and an output schema (not shown). The description doesn't explain return values, but the output schema covers that. For a logging tool, the description is adequate but could mention response behavior (e.g., returns created activity ID).

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%, so all parameters are documented in the schema. The description provides an example that demonstrates parameter usage (clientId, type, title, description) but does not add meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

The description uses specific verb 'Log' and resource 'CRM activity against a client', making the purpose clear. It provides examples of activity types (calls, emails, meetings, tasks) and distinguishes from siblings like list_client_activities (listing vs creating) and create_client_note (notes vs activities). However, it does not explicitly differentiate from all similar tools.

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 states 'Use to track calls, emails, meetings, or tasks', which implies when to use. It gives an example but lacks explicit guidance on when not to use or alternatives. Among siblings, create_client_note is a related alternative, but not mentioned.

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

match_transaction_to_invoiceMatch Transaction to InvoiceA
Idempotent

TRUST AREA — RECONCILIATION. Link a bank transaction to an invoice or expense document. This affects fiscal reconciliation records. Requires confirm=true to proceed. Idempotent: re-matching to same document is a no-op. Example: transactionId='tx_abc', documentId='inv_xyz', documentType='invoice', confirm=true / AREA DE CONFIANZA — CONCILIACION. Vincula un movimiento bancario a una factura o gasto. Afecta registros de conciliacion fiscal. Requiere confirm=true para ejecutar.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional reconciliation notes / Notas de conciliacion opcionales
confirmYesMust be true to confirm fiscal reconciliation / Debe ser true para confirmar conciliacion fiscal
documentIdYesInvoice or expense ID to link / ID de la factura o gasto a vincular
documentTypeYesType of document being matched / Tipo de documento
transactionIdYesBank transaction ID / ID del movimiento bancario

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
amountYes
statusNo
categoryNo
currencyNo
postedAtNo
accountIdNo
createdAtNo
updatedAtNo
descriptionNo
matchedDocIdNo

TDQS

A4.1/5.0
Behavior4/5

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

The description adds context beyond annotations: it affects fiscal reconciliation records and is idempotent (re-matching same document is a no-op). Annotations already provide idempotentHint=true, so this reinforces it. No contradictions.

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

Conciseness4/5

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

The description is front-loaded with key information and is reasonably concise. The bilingual content adds length but does not hinder clarity. Could be slightly more compact.

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 tool with 5 parameters (100% schema coverage), annotations, and an output schema, the description adequately covers its purpose, requirement (confirm=true), and idempotency. No major gaps.

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%, so all parameters have descriptions. The description provides an example but does not add significant new semantic meaning beyond what the schema already conveys.

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 clearly states 'Link a bank transaction to an invoice or expense document.' This is a specific verb+resource pairing that distinguishes it from sibling tools like categorize_transaction which serves a different purpose.

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 indicates this tool is for reconciliation ('TRUST AREA — RECONCILIATION') and explicitly requires 'confirm=true' to proceed. However, it does not explicitly state when not to use it or mention alternative tools, which would provide stronger guidance.

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

onboarding_persona_setSet Onboarding PersonaA
Idempotent

Set the workspace persona. Drives module visibility, default chart-of-accounts, and onboarding checklist. Personas:

  • 'autonomo' — self-employed (autonomo Spain)

  • 'empresa' — small/medium business

  • 'agencia' — agency / consultancy

  • 'gestoria' — accounting firm (manages multiple client workspaces)

Idempotent: setting the same persona again is a no-op. / Define la persona del workspace. Determina modulos visibles, plan contable y checklist.

ParametersJSON Schema
NameRequiredDescriptionDefault
personaYesWorkspace persona / Persona del workspace

Output Schema

ParametersJSON Schema
NameRequiredDescription
personaYes
updatedAtNo
workspaceIdNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate idempotency. The description adds behavioral context by explaining the effects of each persona and that setting the same persona is a no-op, which goes beyond the structured 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 concise, front-loaded with purpose, and structured with a clear list. Every sentence adds value. The Spanish translation is redundant but not harmful.

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 simple tool with one parameter and an output schema, the description covers purpose, parameter semantics, idempotency, and effects. No significant gaps remain.

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?

With 100% schema coverage, the baseline is 3, but the description enriches the single enum parameter by providing clear meanings for each persona value ('autonomo', 'empresa', etc.), which the schema only labels as 'Workspace persona'.

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 clearly states the verb 'Set' and resource 'workspace persona', and explains what it drives (module visibility, chart-of-accounts, checklist). It distinguishes itself from sibling tools like 'onboarding_status'.

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 does not provide explicit guidance on when to use this tool versus alternatives. No when-not-to-use or alternative recommendations are given. Usage is implied by the purpose.

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

onboarding_statusOnboarding StatusA
Read-onlyIdempotent

Return the current workspace onboarding state — persona, completed steps, pending steps, percent complete. Useful to drive in-app guidance, sales follow-up triggers, and partner program tracking. / Devuelve el estado actual del onboarding del workspace (persona, pasos completados/pendientes).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
personaNo
startedAtNo
completedAtNo
workspaceIdNo
pendingStepsNo
completedStepsNo
percentCompleteNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds no behavioral traits beyond what's in annotations. No contradiction, but description doesn't enhance 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?

Two English sentences plus a Spanish translation. Purpose is front-loaded. Could omit Spanish for brevity but overall efficient.

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?

Tool has no parameters and a known output schema. Description covers what it returns and why it's useful. Fully complete for its 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?

No parameters exist; schema coverage is 100%. Baseline per rules is 4. Description adds no param info, which is acceptable given absence.

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 tool 'return's the current workspace onboarding state and lists specific data fields (persona, steps, percent). It is specific about its resource and action, but does not explicitly distinguish from sibling tools like onboarding_persona_set, though context implies it.

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?

Provides explicit use cases: 'drive in-app guidance, sales follow-up triggers, and partner program tracking.' Lacks exclusion criteria or alternatives but offers clear contextual usage.

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

overtime_reportOvertime ReportA
Read-onlyIdempotent

Generate an overtime report for a period. Aggregates regular vs overtime hours per employee + total estimated cost in EUR. Useful for payroll prep and labor-law audits. Period format: 'YYYY-MM' (monthly) or 'YYYY-QN' (quarterly) or 'YYYY' (annual). / Informe de horas extra por periodo. Agrega horas regulares vs extra por empleado + coste estimado.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodYesPeriod (YYYY-MM, YYYY-QN, or YYYY) / Periodo
employeeIdNoOptional filter by employee / Filtrar por empleado opcional

Output Schema

ParametersJSON Schema
NameRequiredDescription
periodYes
byEmployeeNo
generatedAtNo
estimatedCostEurNo
totalRegularHoursNo
totalOvertimeHoursNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds no new behavioral insights beyond stating the output content (aggregation of hours and cost). It does not contradict annotations.

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

Conciseness5/5

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

The description is two concise sentences in English plus a Spanish translation. Every sentence adds information: purpose, output, usage context, and format. No redundancy or fluff.

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

Completeness5/5

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

Given the presence of output schema, annotations, and clear parameter descriptions, the description fully covers the tool's purpose, output, and usage hints. It is complete for a read-only report generation tool.

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%. The description adds value by explicitly stating period formats ('YYYY-MM', 'YYYY-QN', 'YYYY') and reinforces that employeeId is optional. This clarifies usage beyond the schema's brief 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 clearly states the verb 'generate', resource 'overtime report', and scope: 'aggregates regular vs overtime hours per employee + total estimated cost in EUR.' It distinguishes from siblings like get_time_summary by focusing specifically on overtime and payroll/labor-law use.

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 indicates usage context: 'useful for payroll prep and labor-law audits.' It provides period format examples but does not explicitly contrast with alternative tools or state when not to use it.

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

pause_recurring_invoicePause Recurring InvoiceA
Idempotent

Pause an active recurring invoice template. No new invoices are generated while paused. The template is preserved — use resume_recurring_invoice to restart. / Pausa una plantilla de factura recurrente activa. No se generan nuevas facturas mientras esta pausada. Usa resume_recurring_invoice para reanudarla.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecurring invoice template ID / ID de la plantilla de factura recurrente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate idempotent and non-destructive. Description adds that no new invoices are generated while paused and the template is preserved, aligning with annotations. No contradictions.

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 core action, then effect and reversion. No wasted words; bilingual version is fine.

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

Completeness5/5

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

With an output schema present, the description covers the purpose, effect, and how to undo. Complete for a state-change 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?

Parameter 'id' is fully described in the schema (100% coverage). The description does not add extra meaning; baseline of 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 clearly states 'Pause an active recurring invoice template', with a specific verb and resource. It distinguishes from siblings like 'resume_recurring_invoice' by mentioning the resume action.

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?

Provides context for when to use (to stop generation temporarily) and explicitly mentions resume_recurring_invoice for restarting. Could be improved by noting when not to use, but sufficient guidance is given.

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

payroll_checklistPayroll Readiness ChecklistA
Read-onlyIdempotent

List all employees for a given month with their payroll readiness status. Status values:

  • 'ready' — all required data present, ready to export

  • 'missing_data' — some required fields missing (see missingFields[])

  • 'blocked' — manually blocked or data inconsistency detected

Use BEFORE payroll_export to identify gaps. Month format: 'YYYY-MM'. / Lista empleados con estado de preparacion para nomina. Usar antes de payroll_export.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthYesMonth in 'YYYY-MM' format / Mes formato 'YYYY-MM'

Output Schema

ParametersJSON Schema
NameRequiredDescription
monthYes
employeesNo
generatedAtNo
readyEmployeesNo
totalEmployeesNo
missingEmployeesNo

TDQS

A4.7/5.0
Behavior5/5

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

The description reveals the tool is a read-only, idempotent operation (consistent with annotations) and adds context about the status values and the missingFields array. No contradictions.

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 concise, with two front-loaded English sentences plus a Spanish translation. The status list is structured and every sentence adds value.

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

Completeness5/5

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

Given the single parameter with full schema coverage, annotations, and straightforward purpose, the description is complete. It tells what it returns, when to use it, and the status schema.

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 only parameter 'month' is fully described in the schema (pattern). The description adds the format example and usage context but does not provide additional parameter-specific semantics beyond what the schema offers.

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 clearly states the tool lists employees for a month with payroll readiness status. It distinguishes itself from siblings by specifying use before payroll_export, and explains status values in detail.

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 guidance to use before payroll_export to identify gaps, along with month format specification. This tells the agent when and in what order to use the tool relative to siblings.

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

payroll_exportExport Payroll (Gestoria Format)A
Read-onlyIdempotent

Export payroll data for a month in gestoria-compatible format. Supported formats:

  • 'a3' — Wolters Kluwer A3 (CSV with Spanish payroll columns)

  • 'contasol' — Sage Contasol

  • 'sage' — Sage 50/200

  • 'holded' — Holded import format

  • 'siltra' — SILTRA Seguridad Social XML

Frihet does NOT calculate payroll — it exports staged data for the gestoria. Month format: 'YYYY-MM'. / Exporta datos de nominas en formato compatible con gestoria. Mes en formato 'YYYY-MM'.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthYesMonth in 'YYYY-MM' format / Mes formato 'YYYY-MM'
formatYesGestoria payroll software format / Formato del software de gestoria

Output Schema

ParametersJSON Schema
NameRequiredDescription
monthYes
formatYes
fileUrlNo
filenameNo
rowCountNo
generatedAtNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds critical context: 'expo ts staged data for the gestoria' and explicitly states no payroll calculation, which is valuable beyond 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 paragraphs: first explains purpose and formats, second adds an essential behavioral note. Every sentence adds value, no redundancy.

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 simple export tool with a defined input schema and existing output schema, the description covers purpose, formats, behavioral nuance, and required parameter format. No gaps.

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 100%, and description adds further meaning by listing the five enum values explicitly and specifying the month format with an example. The bilingual note reinforces the format.

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?

Clearly states 'Export payroll data for a month in gestoria-compatible format' with a list of five specific formats. Distinguishes itself from export tools like export_datev through the context of gestoria compatibility.

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

Usage Guidelines4/5

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

Explicitly states when to use ('to export staged data for the gestoria') and when not ('Frihet does NOT calculate payroll'). Provides month format specification. Lacks direct comparison to sibling exports like export_datev, but the purpose is clear enough.

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

period_closeClose Accounting PeriodA
DestructiveIdempotent

TRUST AREA — FISCAL CLOSE. Close a monthly or quarterly accounting period. Freezes invoices, expenses, journal entries and bank reconciliations for the period. Requires confirm=true. Idempotent: re-closing an already closed period is a no-op. Closed periods can be reopened with period_reopen + audit reason. / AREA DE CONFIANZA — CIERRE FISCAL. Cierra un periodo contable mensual o trimestral. Congela facturas, gastos, asientos. Requiere confirm=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesPeriod type: monthly or quarterly / Tipo: mensual o trimestral
confirmYesMust be true to perform the close / Debe ser true para ejecutar el cierre

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNo
statusNo
endDateNo
closedAtNo
closedByNo
createdAtNo
startDateNo
updatedAtNo
reopenedAtNo
reopenReasonNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already show destructiveHint and idempotentHint. Description adds specific freezes and no-op behavior, enhancing transparency beyond annotations.

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 concise English sentences with key info; Spanish duplication adds length but still effective. Front-loaded with critical details.

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?

Adequate for a 2-param tool with output schema. Covers purpose, usage conditions, behavioral traits, and alternatives. No gaps.

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% with descriptions for both parameters. Description reinforces confirm=true which is already in schema. Minimal addition but consistent.

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?

Clearly states verb 'close', resource 'accounting period', and specific actions: freezes invoices, expenses, journal entries, bank reconciliations. Distinguishes from siblings like period_close_status (status check) and period_reopen (reopening).

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 requires confirm=true, notes idempotency, and mentions reopening via period_reopen with audit reason. Gives clear when-to-use and alternative.

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

period_close_statusPeriod Close StatusA
Read-onlyIdempotent

Get the current accounting period state (open / closing / closed / reopened). Without periodId returns the current open or most recently closed period. / Devuelve el estado del periodo contable actual (abierto/cerrando/cerrado/reabierto).

ParametersJSON Schema
NameRequiredDescriptionDefault
periodIdNoSpecific period ID (default: current) / ID periodo especifico

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNo
statusNo
endDateNo
closedAtNo
closedByNo
createdAtNo
startDateNo
updatedAtNo
reopenedAtNo
reopenReasonNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds the default period selection logic and enumerates possible states, providing useful behavioral context beyond 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?

Description is two sentences: one English, one Spanish. No wasted words, front-loaded with core purpose, and includes essential details.

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

Completeness5/5

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

Given the presence of an output schema and rich annotations, the description covers all needed context: purpose, states, default behavior. No gaps.

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% (periodId with bilingual description). Description adds value by explaining the behavior when periodId is omitted, which is not in the schema description.

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

Purpose5/5

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

Description clearly states 'Get the current accounting period state' and lists possible states (open/closing/closed/reopened). Distinguishes from sibling tools like period_close and period_reopen by being a read-only status check.

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?

Implicitly indicates when to use: to check the state of an accounting period. Specifies default behavior when periodId is omitted, which is a helpful usage note. Could be more explicit about when not to use (e.g., not for changing state).

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

period_reopenReopen Accounting PeriodA
Destructive

TRUST AREA — FISCAL REOPEN. Reopen a closed accounting period. Requires a compliance reason (audit log) and confirm=true. Reopening allows backdated edits to invoices/expenses — use with extreme caution. / AREA DE CONFIANZA — REAPERTURA FISCAL. Reabre un periodo cerrado. Requiere motivo (auditoria) y confirm=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesRequired audit reason (logged) / Motivo obligatorio (auditoria)
confirmYesMust be true to reopen / Debe ser true para reabrir
periodIdYesClosed period ID to reopen / ID del periodo cerrado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeNo
statusNo
endDateNo
closedAtNo
closedByNo
createdAtNo
startDateNo
updatedAtNo
reopenedAtNo
reopenReasonNo

TDQS

A4.4/5.0
Behavior5/5

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

Adds value beyond annotations by explaining that reopening allows backdated edits to invoices/expenses, which is critical behavioral context. Aligns with destructiveHint=true.

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 in each language, front-loaded with action and warnings. Bilingual nature adds length but remains efficient. Could be slightly more concise.

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?

Covers all key aspects: required inputs, consequence (backdated edits), and caution. Output schema exists, so return values are not needed. Completeness is high for a sensitive operation.

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% with descriptions for each parameter. Description only restates schema info without adding new semantic details. Baseline score of 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?

The description clearly states the action 'Reopen a closed accounting period' with specific verb and resource. It distinguishes from sibling tools like 'period_close' by being the inverse 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?

Specifies required inputs (reason, confirm=true) and warns about extreme caution. Does not explicitly compare to alternatives, but the context is clear given sibling names.

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

permissions_matrixPermissions MatrixA
Read-onlyIdempotent

Return the full role-to-permission matrix for the workspace. Lists every role with the permissions it grants and every protected resource. Useful for security audits, role design, and compliance reporting. / Devuelve la matriz completa de roles y permisos del workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
rolesNo
resourcesNo
generatedAtNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds detail about the output (full matrix, roles, permissions, resources) without contradiction. 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.

Conciseness5/5

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

Two brief sentences (plus Spanish translation) that front-load the action and result. No superfluous words.

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 zero-parameter, read-only tool with an output schema. Description covers purpose, output content, and use cases adequately.

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?

No parameters exist (schema coverage 100%). Description does not need to add parameter info. Baseline 4 for zero-parameter tools.

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?

Clearly states 'Return the full role-to-permission matrix for the workspace' with specific verb and resource. Distinguishes from sibling tools like 'permissions_me' which is singular. Mentions listing roles, permissions, and protected resources.

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?

Provides explicit use cases: 'security audits, role design, and compliance reporting'. Does not specify when not to use or list alternatives, but the context is clear enough for an agent to decide.

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

permissions_meMy PermissionsA
Read-onlyIdempotent

Return the caller's effective role + permissions in the current workspace. Useful for client-side UI gating, debugging access errors, and capability discovery. / Devuelve el rol efectivo y los permisos del llamante en el workspace actual.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
roleNo
userIdNo
permissionsNo
workspaceIdNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds value by specifying that it returns 'effective role + permissions' and is scoped to the 'current workspace,' providing behavioral context beyond 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 English portion is two sentences: first sentence defines purpose, second provides usage guidance. No wasted words. The Spanish translation is additional but not detrimental. Front-loaded and efficient.

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

Completeness5/5

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

Given the tool's simplicity (no parameters, read-only, output schema present), the description fully covers purpose, usage, and return value. Annotations and output schema handle the rest. No gaps.

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 0 parameters and 100% schema coverage, the description need not add parameter info. It implicitly covers the absence of input by focusing on output. Baseline score of 4 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 explicitly states 'Return the caller's effective role + permissions in the current workspace,' clearly identifying the verb (return), resource (role + permissions), and scope (current workspace). This distinguishes it from sibling 'permissions_matrix' which likely returns a broader matrix.

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 provides concrete use cases: 'client-side UI gating, debugging access errors, and capability discovery.' While it doesn't explicitly state when not to use it, the use cases are clear and imply the tool's appropriate context.

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

refund_depositRefund DepositB
Idempotent

Refund a deposit back to the client. Transitions the deposit status to 'refunded'. Example: id='dep_abc123', reason='Project cancelled' / Devuelve un deposito al cliente.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeposit ID / ID del deposito
notesNoRefund notes / Notas de la devolucion
reasonNoReason for the refund / Motivo de la devolucion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate idempotent and non-destructive. Description adds status transition detail. No mention of permissions, reversibility, or side effects, but consistent with annotations.

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

Conciseness4/5

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

Short, includes essential information. Spanish translation adds length but not excessive. Could be slightly tighter.

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?

Covers action and status change. Lacks error scenarios, prerequisites, or return value explanation, but output schema exists.

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 has 100% coverage with bilingual descriptions. Description references id and reason in example but adds minimal meaning beyond 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 clearly states the action ('Refund a deposit'), the target resource ('the client'), and the effect ('transitions status to refunded'). It distinguishes from sibling tools like delete_deposit or create_deposit.

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 explicit guidance on when to use this tool vs alternatives like delete_deposit or create_deposit. The example gives context but not decision rules.

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

refund_saleRefund POS SaleA
DestructiveIdempotent

Refund a POS sale in full or partially. This action is irreversible — the customer will receive a refund to their original payment method. You MUST pass confirm=true to proceed. Optionally specify amountCents for a partial refund (defaults to full refund). / Reembolsa una venta POS total o parcialmente. Accion irreversible. Debes pasar confirm=true. Pasa amountCents para reembolso parcial.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSale ID to refund / ID de venta a reembolsar
reasonNoRefund reason / Motivo del reembolso
confirmYesMust be true to proceed. Safety gate for destructive action. / Debe ser true para continuar. Confirmacion obligatoria.
amountCentsNoPartial refund amount in cents. Omit for full refund. / Importe parcial en centimos. Omitir para reembolso completo.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
reasonNo
saleIdYes
statusYes
currencyYes
createdAtYes
amountCentsYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond annotations (destructiveHint=true), the description adds key behavioral details: the action is irreversible, funds return to the original payment method, and confirm is a mandatory safety check. This fully informs the agent of consequences.

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 concise with two clear sentences in English and a Spanish translation. It front-loads the core action and key requirements. The bilingual content is necessary but adds length; still efficient overall.

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 destructive action, the description covers irreversibility, payment method, confirm requirement, and partial refund. It does not detail return values, but an output schema exists. Sibling differentiation (e.g., refund_deposit) is missing but the tool name and description sufficiently narrow context.

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%, so baseline is 3. The description reiterates the purpose of 'confirm' and 'amountCents' but adds no new meaning beyond the schema. The 'reason' parameter is not mentioned, though its enum values are clear in the schema.

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

Purpose5/5

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

The description clearly states the action ('Refund a POS sale'), resource ('POS sale'), and scope ('in full or partially'), distinguishing it from sibling tools like refund_deposit. The verb 'refund' and resource 'POS sale' are precise.

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 specifies when to use this tool (for refunding POS sales) and includes a critical prerequisite ('MUST pass confirm=true'). However, it does not explicitly contrast with alternatives like refund_deposit or state when not to use, leaving room for ambiguity.

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

remove_team_memberRemove Team MemberA
DestructiveIdempotent

Remove a member from the workspace. The member immediately loses access. Their created records (invoices, expenses) are preserved. Cannot remove the workspace owner — transfer ownership first. Requires confirm=true to prevent accidental removal. / Elimina un miembro del espacio de trabajo. El miembro pierde acceso inmediatamente. Sus registros creados (facturas, gastos) se conservan. No se puede eliminar al propietario — transfiere la propiedad primero. Requiere confirm=true para evitar eliminaciones accidentales.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true to confirm removal / Debe ser true para confirmar la eliminacion
memberIdYesTeam member ID / ID del miembro del equipo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.6/5.0
Behavior5/5

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

Adds critical behavioral details beyond annotations: member immediately loses access, created records are preserved, and special rule about workspace owner. Complements destructiveHint and readOnlyHint annotations with concrete effects.

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?

Concise sentences with front-loaded main action. Bilingual repetition (Spanish and English) adds length but is appropriate for multi-language context. Every sentence conveys unique information without fluff.

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?

Fully covers the tool's destructive nature, side effects (record preservation), edge case (owner), and parameter requirement (confirm). With existing output schema and clear sibling list, agent has sufficient information to decide and invoke correctly.

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

Parameters4/5

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

Schema already describes both parameters (memberId and confirm) with 100% coverage. Description adds value by explaining why confirm is required (prevent accidental removal) and that it must be true, enhancing the schema's basic description.

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

Purpose5/5

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

Clearly states 'Remove a member from the workspace' with specific verb (remove) and resource (team member). Distinguishes from sibling tools like invite_team_member, update_team_member_role, and list_team_members.

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?

Provides explicit context: when to use (removing a member), when not to use (cannot remove workspace owner), and prerequisite (transfer ownership first). Also specifies required confirm parameter to prevent accidental removal. Could explicitly name alternatives but current guidance is sufficient.

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

resume_recurring_invoiceResume Recurring InvoiceA
Idempotent

Resume a paused recurring invoice template. The next invoice will be generated on the next scheduled cycle date after resumption. / Reanuda una plantilla de factura recurrente pausada. La proxima factura se generara en el siguiente ciclo programado tras la reanudacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecurring invoice template ID / ID de la plantilla de factura recurrente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds behavioral context beyond annotations: 'The next invoice will be generated on the next scheduled cycle date after resumption.' Annotations provide idempotentHint=true, and description confirms non-destructive, non-readOnly 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?

Extremely concise: two short sentences (English and Spanish) that front-load the key action and effect. No wasted words.

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 tool's simplicity (1 required param, high schema coverage, annotations present), the description adequately explains the effect. It could mention prerequisites (e.g., template must be paused) but is still sufficient.

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 covers the single parameter 'id' 100% (with bilingual explanation). The description does not add new meaning beyond what the schema provides, so baseline 3 applies.

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

Purpose5/5

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

The description clearly states the action ('Resume a paused recurring invoice template') and the resource ('recurring invoice template'), with a specific verb. It distinguishes from siblings like 'pause_recurring_invoice' and 'create_recurring_invoice'.

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 implicitly tells when to use (when a template is paused), but does not explicitly mention when not to use or provide alternative tools. However, the context from the name and sibling tools makes it clear.

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

run_recurring_nowRun Recurring Invoice NowA

Manually trigger immediate generation of the next invoice instance from a recurring template. Useful for billing ahead of schedule or recovering from a missed automated run. The generated invoice is created as a draft; review and send separately. Example: templateId='rec_abc123' / Genera manualmente la siguiente instancia de una factura recurrente. Util para facturar antes de lo programado o recuperar un ciclo perdido. La factura generada se crea como borrador; revisar y enviar por separado.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftOnlyNoIf true, create as draft only (default true). Set false to create and mark as sent immediately. / Si true, crea como borrador. Set false para crear y marcar como enviada.
templateIdYesRecurring invoice template ID / ID de la plantilla de factura recurrente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate non-read and non-destructive behavior. The description adds that the generated invoice is a draft unless draftOnly=false. However, it does not clarify whether the recurring schedule is affected (e.g., skipped next run). This ambiguity prevents a higher score.

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 concise with two English sentences (plus a Spanish translation). The structure is clear, but the bilingual approach adds length. Given the tool's simplicity, the conciseness is good but could be trimmed by removing the Spanish version.

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 an output schema present, the description need not explain return values. It adequately covers the mutation behavior and the draft invoice outcome. The tool is simple with two params, so completeness is sufficient.

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%, so parameters are well-documented in the schema. The description only mentions templateId in an example and does not add additional meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action: 'Manually trigger immediate generation of the next invoice instance from a recurring template.' It provides a specific verb and resource, distinguishes from sibling tools like create_recurring_invoice (which creates templates) and pause/resume (which control automation), and includes an example.

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 context: 'Useful for billing ahead of schedule or recovering from a missed automated run.' It also explains the outcome (draft invoice) that requires separate sending. However, it does not explicitly state when not to use this tool or mention alternatives like create_invoice for manual modifications.

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

search_invoicesSearch InvoicesA
Read-onlyIdempotent

Search and filter invoices. Supports filtering by status and date range. The query parameter searches across client names and invoice content. Example: query='Acme', status='paid', from='2026-01-01', to='2026-03-31' / Busca y filtra facturas. Soporta filtrado por estado y rango de fechas. El parametro query busca en nombres de clientes y contenido de facturas.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter (YYYY-MM-DD) / Fecha fin
fromNoStart date filter (YYYY-MM-DD) / Fecha inicio
afterNoCursor for cursor-based pagination (document ID) / Cursor para paginacion
limitNoMax results (1-100) / Resultados maximos
queryNoSearch text (client name, etc.) / Texto de busqueda
fieldsNoComma-separated field names to return / Campos a devolver
offsetNoOffset / Desplazamiento
statusNoFilter by status / Filtrar por estado

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
limitYes
totalYes
offsetYes
nextCursorNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that it supports filtering and search across content, and gives an example. No contradictions. The description provides useful context beyond annotations.

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 concise and front-loaded with purpose. The example is helpful. The bilingual text adds length but is not excessive. Could be slightly tighter.

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 presence of an output schema and detailed annotations, the description covers the main capabilities and provides an example. It does not explicitly mention pagination, but the schema handles that. Overall adequate for a search tool.

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%, but the description adds meaning for the 'query' parameter (searches across client names and invoice content) and provides a concrete example. Other parameters are adequately described in the schema 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?

The description clearly states it searches and filters invoices, with specific capabilities like status and date range filtering, and the query parameter searches across client names and content. However, it doesn't explicitly differentiate from sibling 'list_invoices', which may cause confusion.

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 provides an example but does not specify when to use this tool vs alternatives like 'list_invoices' or 'get_invoice'. No guidance on when not to use it.

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

send_einvoiceSend E-InvoiceA

Dispatch an e-invoice to the recipient via the selected transport channel. Returns immediately with a workflowRunId — use get_einvoice_status to poll until completion.

Supported formats (11 total): • xrechnung-cii — XRechnung CII syntax (Germany B2G mandatory) • xrechnung-ubl — XRechnung UBL 2.1 syntax (Germany B2G alternative) • facturx-en16931 — Factur-X EN16931 PDF/A-3 (France, EU) • facturx-extended — Factur-X Extended with trade/logistics fields (France, EU) • facturx-basic — Factur-X Basic reduced field set (France, EU) • facturx-minimum — Factur-X Minimum for summary invoices (France, EU) • fatturapa — FatturaPA XML via SDI hub (Italy mandatory) • ubl — Generic UBL 2.1 XML (EU/global) • cii — Generic CII Cross Industry Invoice (EU/global) • peppol-bis-3 — PEPPOL BIS Billing 3.0 network (EU/Nordic/AU/SG) • facturae — Facturae 3.2.x (Spain B2G via FACe/AEAT mandatory)

Dispatch modes: • email — attach XML/PDF and send via Resend to client email on file • chorus_pro — submit to French Chorus Pro portal (facturx-* only) • sdi — submit to Italian SDI hub (fatturapa only) • peppol — transmit via PEPPOL access point (peppol-bis-3 only) • download — generate and return a signed download URL only

If the dispatch backend is not deployed for this workspace, returns an honest 'unavailable' response — never fabricated workflow data. / Envia una factura electronica al destinatario mediante el canal de transporte seleccionado. Devuelve de forma asincrona — consultar get_einvoice_status para seguimiento.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatYesE-invoice format. Choose based on recipient country and channel: DE→xrechnung-cii/ubl, FR→facturx-*, IT→fatturapa, ES B2G→facturae, EU PEPPOL→peppol-bis-3, generic→ubl or cii / Formato de factura electronica.
invoiceIdYesFrihet invoice ID to dispatch / ID de la factura a enviar
dispatchModeYesTransport channel: email=send via Resend, chorus_pro=French portal, sdi=Italian SDI hub, peppol=PEPPOL network, download=generate URL only / Canal de transporte.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesAlways 'queued' for async dispatch
workflowRunIdYesHatchet workflow run ID for polling status
estimatedCompletionSecYesEstimated seconds until the workflow completes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, aligning with the dispatch action. The description reveals key behavior: returns immediately with a workflowRunId, async nature requiring polling, and honest 'unavailable' response. This adds value beyond the minimal annotation.

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 well-structured with bullet points for formats and modes, making it scannable. The bilingual text adds length but serves dual-language users. The first sentence is clear and action-oriented. Minor redundancy in the Spanish section but overall efficient.

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

Completeness4/5

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

Covers async behavior, format mapping, dispatch mode constraints, and error handling. An output schema exists but is not shown; the description does not explain return values, but the emphasis is on the workflowRunId. Given the tool's complexity (3 required params, many enums), the description is sufficiently complete.

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%, but the description adds context for format enums (e.g., which format for which country) and dispatch modes (e.g., 'chorus_pro=French portal'). This helps the agent choose appropriate values, going beyond 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?

Clearly states the action ('Dispatch an e-invoice') and resource ('e-invoice'). Distinguishes from sibling tools like send_invoice (sends a regular invoice) and get_einvoice_status (polls for completion). The description includes specific formats and dispatch modes, making the purpose precise.

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?

Provides guidance on when to use (dispatching e-invoices with specific formats) and mentions async polling via get_einvoice_status. It also notes the 'unavailable' response if the backend is not deployed. However, it does not explicitly contrast with send_invoice or other invoice-related tools.

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

send_invoiceSend InvoiceA
Idempotent

Send an invoice to the client via email. Optionally override the recipient email address. The invoice must exist and should not already be cancelled. / Envia una factura al cliente por email. Opcionalmente se puede cambiar el email destinatario.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID / ID de la factura
toNoOverride recipient email / Email destinatario alternativo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate idempotent and non-destructive nature. Description adds minimal behavioral context beyond stating the email action. No additional traits 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?

Two clear English sentences followed by Spanish translation. Could be more concise by dropping the duplicate translation, but not excessively long.

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

Completeness4/5

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

Covers main action and precondition. Output schema exists, so return values are covered. Could mention error cases like invoice not found, but overall sufficient.

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% with descriptions for both parameters. The description's mention of optional recipient override repeats the schema. Baseline 3 maintained.

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 clearly states the action ('Send'), resource ('invoice'), and method ('via email'). It distinguishes from siblings like get_invoice and update_invoice.

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?

Provides precondition: 'The invoice must exist and should not already be cancelled.' Does not explicitly mention when not to use, but the precondition implies avoidance for cancelled invoices.

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

send_quoteSend QuoteA
Idempotent

Send a quote/estimate to the client via email. Optionally override the recipient email address. The quote must exist and should not already be expired or rejected. / Envia un presupuesto al cliente por email. Opcionalmente se puede cambiar el email destinatario.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesQuote ID / ID del presupuesto
toNoOverride recipient email / Email destinatario alternativo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.4/5.0
Behavior4/5

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

Beyond annotations (idempotentHint=true, destructiveHint=false), the description adds prerequisites and optional behavior. It does not explicitly confirm idempotency but the annotation covers that. The mention of prerequisites adds value.

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 two sentences in English and Spanish, front-loaded with the core purpose, and contains no fluff.

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 tool's simplicity (2 params, output schema exists), the description covers prerequisites and optional parameters. It does not explain the output, but that is handled by the output schema.

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

Parameters4/5

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

With 100% schema coverage, the description adds meaning by explaining the 'to' parameter as an optional override and the 'id' parameter's constraints (must exist, not expired/rejected), which are not fully captured in the schema.

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

Purpose5/5

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

The description clearly states the action (send), the resource (quote/estimate), and the method (via email). It distinguishes itself from siblings like send_invoice by targeting quotes specifically.

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 provides clear context for usage: the quote must exist and not be expired/rejected. It also mentions the optional recipient override, but does not explicitly exclude alternatives like send_invoice.

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

sync_channelSync ChannelA
Idempotent

Trigger a manual sync of a booking channel (Airbnb, Booking.com, etc.). Pulls new reservations and/or pushes calendar updates. Returns sync status and counts. / Dispara sincronizacion manual de un canal de reservas. Importa reservas nuevas y/o envia actualizaciones de calendario.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelIdYesChannel ID / ID de canal
directionNoSync direction: pull (import reservations), push (export calendar), or both (default). / Direccion: pull (importar), push (exportar) o both (ambas, por defecto).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsNo
statusYes
channelIdYes
lastSyncAtYes
pulledCountYes
pushedCountYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate idempotentHint=true and destructiveHint=false. The description adds that it triggers a sync, with direction (pull/push/both) and returns sync status/counts. This goes beyond annotations by clarifying the effect on data (pulls reservations, pushes calendar). No contradiction.

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

Conciseness5/5

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

The description is two sentences in English and then Spanish, no fluff. It is front-loaded with the key purpose and actions. Every sentence adds 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?

The tool has two params, output schema exists, and the description explains sync direction and return values (status/counts). No critical gaps; it covers purpose, parameters, and output well. Could mention that sync may take time or that it is an async operation, but not required.

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%: channelId and direction are described in the schema. The description mentions pulling and pushing, which aligns with the direction parameter but adds no new details beyond the schema. With full schema coverage, 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 clearly states the tool triggers a manual sync of a booking channel, specifying it pulls new reservations and/or pushes calendar updates. This distinguishes it from sibling tools (no other sync tool exists), so it is a specific verb+resource pair.

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 implicitly communicates when to use: when you need to manually sync a channel (pull/push). There are no alternative sync tools among siblings, so explicit when-not or alternatives are not necessary, but it could briefly mention that automatic syncs exist or that this is for manual triggers.

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

test_webhookTest WebhookA

Fire a synthetic test event to the webhook endpoint and return the delivery result. Useful to verify endpoint reachability, signature validation, and TLS configuration. Optionally specify the eventType to simulate (default: 'webhook.test'). Example: id='wh_abc', eventType='invoice.paid' / Envia un evento de prueba sintetico al endpoint del webhook. Util para verificar accesibilidad, validacion de firma y configuracion TLS.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID / ID del webhook
eventTypeNoEvent type to simulate (default: 'webhook.test') / Tipo de evento a simular

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
deliveredYes
eventTypeNo
webhookIdYes
statusCodeNo
attemptedAtNo
responseTimeMsNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already cover safety profile. Description adds default eventType and example, but doesn't explicitly state the test event is actually sent to endpoint or discuss permissions/errors.

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 efficient sentences (plus translation) that front-load action and purpose with zero wasted words.

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?

Output schema exists, so return values are covered. Description provides sufficient context for a simple test tool, including parameter details and use case.

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 covers both params with descriptions. Description adds value with example usage and default for eventType, exceeding baseline for high schema coverage.

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?

Description uses specific verb 'fire' and resource 'webhook endpoint', clearly distinguishing from other webhook tools (get, create, update, delete) by being a test action.

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?

Describes usefulness for verifying reachability, signature, TLS. Lacks explicit when-not-to-use or prerequisites (webhook must exist), but context is clear.

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

ticketbai_statusGet TicketBAI Submission StatusA
Read-onlyIdempotent

Poll the hacienda acknowledgement status for a TicketBAI submission. Returns the TBAI identifier, territory, and hacienda's confirmation or rejection state.

Common status values: • submitted — sent, awaiting hacienda response (check again in 30-60s) • accepted — hacienda confirmed the submission (AEAT/foral treasury received) • rejected — hacienda rejected (check rejectionReason for correction guidance) • error — internal processing error (see error field)

/ Consulta el estado de acuse de recibo de la hacienda foral para un envío TicketBAI. Devuelve el identificador TBAI, territorio y estado de confirmación o rechazo.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoiceIdYesFrihet invoice ID (same as used in ticketbai_submit) / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvYesCSV (Código Seguro de Verificación) for the submission
qrUrlYesQR code URL to print on the invoice (null if not yet available)
errorsYesHacienda error messages if rejected (null if none)
estadoYesCurrent submission status stored server-side (e.g. 'accepted', 'rejected')
acceptedYesWhether the submission has been accepted by the hacienda foral
submittedAtYesISO 8601 timestamp the submission was recorded (null if unknown)
tbaiIdentifierYesTicketBAI identifier

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by detailing status values and their meanings, especially the polling recommendation for 'submitted' state, which goes beyond basic annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose and status list. The bilingual Spanish section is redundant but not excessively long. It is generally efficient, though a single language would improve conciseness.

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 one parameter, 100% schema coverage, and existence of an output schema, the description covers the key behaviors (polling, status values). It doesn't need to explain return values as the output schema exists. Adequate for a polling status 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?

Only one parameter (invoiceId) with schema description already explaining it's the Frihet invoice ID. The description adds that it's the same ID used in ticketbai_submit, providing helpful cross-reference. Baseline 3 is appropriate as schema coverage is 100%.

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 clearly states it polls the hacienda acknowledgment status for a TicketBAI submission, returning the TBAI identifier, territory, and confirmation/rejection state. It uses specific verbs and resource, and distinguishes from related tools like ticketbai_submit.

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 usage after submission and provides polling intervals for the 'submitted' status. While it doesn't explicitly state when not to use, the context is clear. It could mention alternatives like get_einvoice_status but isn't required.

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

ticketbai_submitSubmit TicketBAI (Basque Country)A

Submit an invoice to the Basque Country TicketBAI e-invoicing system. Territory is auto-detected from the workspace address (Bizkaia → BATUZ/LROE, Gipuzkoa → Gipuzkoa TicketBAI, Araba → Araba TicketBAI). Returns the submission TicketBAI ID (TBAI identifier) and QR code URL for printing on the invoice.

Use sandbox=true for test submissions against the hacienda test endpoints. Production submissions require a valid TicketBAI certificate configured in workspace settings.

/ Envía una factura al sistema TicketBAI del País Vasco. El territorio se detecta automáticamente (Bizkaia→BATUZ/LROE, Gipuzkoa, Álava). Devuelve el identificador TBAI y URL del código QR para imprimir en la factura.

ParametersJSON Schema
NameRequiredDescriptionDefault
sandboxNoIf true, submits to the hacienda test endpoint instead of production. Default: false. / Si true, envía al entorno de pruebas de la hacienda. Por defecto: false.
invoiceIdYesFrihet invoice ID to submit / ID de la factura a enviar

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvYesCSV (Código Seguro de Verificación) returned by the hacienda foral
qrUrlYesQR code URL to print on the invoice (TBAI compliance)
acceptedYesWhether the hacienda foral accepted the submission
idempotentNoTrue if this echoes a prior already-accepted submission (no resubmission occurred)
tbaiIdentifierYesTicketBAI identifier (TBAI-XXXXX) returned by the hacienda foral

TDQS

A4.6/5.0
Behavior5/5

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

Beyond annotations (which only show non-readOnly, non-destructive), the description adds key behaviors: territory auto-detection from workspace address, return of TBAI ID and QR code URL, and sandbox vs production distinction.

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?

Description is efficient with two short paragraphs (English and Spanish). It front-loads key actions and outputs. The bilingual repetition costs some conciseness but is justified for the region.

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

Completeness5/5

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

Given the tool's complexity (territory detection, sandbox, production requirements, output fields), the description covers all critical aspects. It mentions return values (TBAI ID, QR URL) even though output schema exists.

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 has 100% coverage with basic descriptions. The description adds meaning: sandbox is for test endpoints, invoiceId is a Frihet invoice ID. It also notes territory auto-detection, which is not in schema but is relevant context.

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 clearly states the tool submits an invoice to the Basque Country TicketBAI system, a specific verb+resource. It distinguishes from siblings like 'ticketbai_status' and other e-invoicing tools by naming the system and territory.

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?

Description explains when to use sandbox=true for tests and notes production requires a valid certificate. It implies usage context (Basque Country invoicing) but does not explicitly state when not to use or compare with alternatives like 'ksef_submit'.

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

update_clientUpdate ClientA
Idempotent

Update an existing client using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', email='new@acme.com', phone='+34600123456' / Actualiza un cliente existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesClient ID / ID del cliente
nameNoName / Nombre
emailNoEmail / Correo
phoneNoPhone / Telefono
taxIdNoTax ID / NIF/CIF
addressNoClient address / Direccion del cliente

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
emailNo
phoneNo
taxIdNo
addressNo
createdAtNo
updatedAtNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate idempotentHint=true and destructiveHint=false. The description adds that PATCH semantics are used and only provided fields change, aligning with idempotency. No contradictions, and it adds context beyond annotations.

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

Conciseness4/5

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

The description is front-loaded with key information in two English sentences, followed by a Spanish repetition. While efficient, the bilingual aspect adds length; each sentence earns its place.

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

Completeness4/5

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

Given the tool's complexity (nested address object), output schema existence, and annotation coverage, the description is reasonably complete. It explains the update semantics and provides an example, though it does not detail nested parameter behavior.

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. The description includes an example (id, email, phone) and bilingual notes about modifying only provided fields, adding practical guidance 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 clearly states the verb 'Update' and the resource 'client,' specifying PATCH semantics and that only provided fields change. This distinguishes it from sibling tools like create_client or delete_client.

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 implies usage for updating existing clients but does not explicitly state when to use versus alternatives like create_client or get_client. No when-not conditions or alternative tool names are provided.

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

update_depositUpdate DepositA
Idempotent

Update an existing deposit using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', amount=750, notes='Updated retainer amount' / Actualiza un deposito existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeposit ID / ID del deposito
dateNoDate (YYYY-MM-DD) / Fecha
notesNoNotes / Notas
amountNoAmount / Importe
statusNoStatus / Estado
clientIdNoClient ID / ID del cliente
currencyNoCurrency code / Moneda
referenceNoReference / Referencia
clientNameNoClient name / Nombre del cliente
descriptionNoDescription / Descripcion
paymentMethodNoPayment method / Metodo de pago

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
notesNo
amountYes
statusNo
clientIdYes
currencyNo
createdAtNo
referenceNo
updatedAtNo
clientNameNo
descriptionNo
paymentMethodNo

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already provide readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds 'PATCH semantics' and 'Only the provided fields will be changed', which is consistent but does not significantly expand on behavioral aspects like permissions, side effects, or response behavior.

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

Conciseness4/5

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

The description is relatively concise with two sentences in English and a Spanish translation. It is front-loaded with the key purpose and behavior. Could be slightly shorter without the redundant Spanish text.

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 update tool with an output schema present, the description covers the essential update behavior and provides an example. It does not explain return values, but the output schema likely covers that. Adequate for the complexity.

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 input schema has 100% description coverage, so the baseline is 3. The description only adds an example ('id='abc123', amount=750, notes='Updated retainer amount') but does not provide additional semantics beyond what the schema already describes.

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 clearly states the verb 'Update' and the resource 'deposit', and specifies 'PATCH semantics' and 'Only the provided fields will be changed', which distinguishes it from other tools like delete_deposit or refund_deposit.

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 gives an example but does not explicitly state when to use this tool versus alternatives (e.g., create_deposit, delete_deposit). The guidance is minimal, only indicating that only provided fields are changed.

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

update_expenseUpdate ExpenseA
Idempotent

Update an existing expense using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', amount=75.00, category='travel' / Actualiza un gasto existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID / ID del gasto
dateNoDate (YYYY-MM-DD) / Fecha
amountNoAmount in EUR / Importe
vendorNoVendor / Proveedor
categoryNoCategory / Categoria
descriptionNoDescription / Descripcion
taxDeductibleNoTax deductible / Deducible

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
amountYes
vendorNo
categoryNo
createdAtNo
updatedAtNo
descriptionYes
taxDeductibleNo

TDQS

A4.1/5.0
Behavior4/5

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

Given that annotations already indicate idempotentHint=true and non-destructive, the description adds value by specifying PATCH semantics and partial update behavior ('Only the provided fields will be changed'). No contradiction with annotations.

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

Conciseness4/5

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

The description is concise with two sentences and an example, but includes redundant bilingual text. It is front-loaded with clear purpose.

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 tool with 7 parameters (1 required) and an output schema, the description covers essential behavior (partial update) and usage. It does not detail error handling or validation, but given the output schema exists, it is sufficiently complete.

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 schema already describes all parameters. The description adds an example of usage (id, amount, category) and clarifies that only provided fields are changed, adding meaning beyond the schema.

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

Purpose5/5

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

The description clearly states 'Update an existing expense using PATCH semantics' and provides an example with id, amount, and category. It distinguishes from sibling tools like list_expenses, delete_expense, etc.

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 implies usage for updating an expense but does not explicitly state when to use this tool vs alternatives (e.g., other update tools). No when-not-to-use guidance is provided.

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

update_invoiceUpdate InvoiceA
Idempotent

Update an existing invoice using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', status='paid' to mark an invoice as paid. / Actualiza una factura existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID / ID de la factura
itemsNoLine items / Conceptos
notesNoNotes / Notas
statusNoInvoice status / Estado
dueDateNoDue date (YYYY-MM-DD) / Fecha de vencimiento
taxRateNoTax rate % / IVA %
clientIdNoExisting client ID — server back-fills taxId/address / ID de cliente existente
irpfRateNoIRPF withholding % (retencion autonomo ES, e.g. 15 or 7) / Retencion IRPF %
poNumberNoClient purchase-order reference / Numero de pedido del cliente
seriesIdNoInvoice numbering series ID / ID de serie de numeracion
issueDateNoIssue date (YYYY-MM-DD) / Fecha de emision
clientNameNoClient name / Nombre del cliente
prepaymentNoPrepaid/advance amount already collected in EUR / Anticipo cobrado en EUR
clientTaxIdNoClient tax ID (NIF/CIF/VAT) shown on the invoice / NIF/CIF del cliente
discountRateNoGlobal discount % applied to the invoice / Descuento global %
clientAddressNoClient billing address shown on the invoice / Direccion fiscal del cliente
operationTypeNoOperation type (service or goods) / Tipo de operacion
clientLocationNoFiscal zone driving IVA vs IGIC vs exempt / Zona fiscal (IVA/IGIC/exento)
documentNumberNoExternally-issued number for import (honored verbatim) / Numero externo para importacion
equivalenceSurchargeRateNoRecargo de equivalencia % (ES retail regime) / Recargo de equivalencia %

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
dueDateNo
taxRateNo
createdAtNo
issueDateNo
updatedAtNo
clientNameNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) cover the key behavioral traits; the description reinforces PATCH semantics but adds no major new insights beyond what annotations provide.

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

Conciseness4/5

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

The description is concise with two clear sentences and an example; the bilingual duplication slightly impacts conciseness but is acceptable.

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 high parameter count and full schema/ output schema, the description provides sufficient context for an update tool, though it could mention any field-specific constraints (e.g., status transitions).

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%, so parameters are fully documented. The description adds an example and general PATCH behavior but does not elaborate on individual parameters.

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 clearly states 'Update an existing invoice using PATCH semantics' and provides a concrete example, distinguishing it from create or delete invoice 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?

The description explains partial update behavior ('Only the provided fields will be changed') and gives an example, but does not explicitly state when not to use it or list alternatives.

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

update_kitchen_ticketUpdate Kitchen TicketA
Idempotent

Advance a kitchen ticket through the workflow — update its status (e.g. queued → preparing → ready → served) or reassign it to a different station. / Avanza un ticket de cocina en el flujo: actualiza estado (queued → preparing → ready → served) o reasigna a otra estacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTicket ID to update / ID del ticket a actualizar
statusNoNew ticket status: on_hold, queued, preparing, ready, served, voided. / Nuevo estado: on_hold, queued, preparing, ready, served, voided.
stationIdNoReassign to station ID / Reasignar a estacion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
statusNoqueued | preparing | ready | served | cancelled
tableRefNo
createdAtNo
stationIdNo
updatedAtNo

TDQS

A4.3/5.0
Behavior4/5

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

With annotations already indicating non-destructive and idempotent behavior, the description adds value by specifying the workflow status progression (queued → preparing → ready → served) and listing the exact statuses and station reassignment, which goes beyond the annotation fields. No contradiction with annotations.

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

Conciseness5/5

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

The description is highly concise: two sentences in English and Spanish, front-loading the key action and purpose, with zero wasted words.

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

Completeness5/5

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

Given the tool's moderate complexity (3 params, 1 required), an output schema exists, and the description covers the essential purpose and usage. There is no missing information that would hinder correct invocation.

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

Parameters3/5

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

Schema coverage is 100% with bilingual descriptions for each parameter. The description adds marginal value by listing the status progression examples, but the meaning is already fully conveyed by the schema. 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 clearly specifies the verb 'Advance' and the resource 'kitchen ticket', and distinguishes it from sibling tools like get_kitchen_ticket and list_kitchen_tickets by stating the key actions: updating status and reassigning station.

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 provides clear context on when to use the tool (to advance a ticket through the workflow) and lists specific use cases (status change or reassignment). It doesn't explicitly mention when not to use it, but the purpose is unambiguous and no alternative tool exists among siblings for the same action.

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

update_productUpdate ProductA
Idempotent

Update an existing product using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', unitPrice=2000, taxRate=21 / Actualiza un producto existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProduct ID / ID del producto
nameNoName / Nombre
taxRateNoTax rate % / IVA %
unitPriceNoUnit price / Precio unitario
descriptionNoDescription / Descripcion

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
taxRateNo
createdAtNo
unitPriceYes
updatedAtNo
descriptionNo

TDQS

A4.5/5.0
Behavior5/5

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

Describes PATCH semantics and partial update behavior, adding value beyond annotations. Aligns with idempotentHint=true and destructiveHint=false.

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

Conciseness4/5

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

Two concise sentences with front-loaded key info. Bilingual content is a minor overhead but does not hinder clarity.

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?

Adequately covers partial update semantics. Output schema (present but not shown) would handle return values, so no gap.

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

Parameters4/5

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

Schema covers all 5 parameters (100% coverage). Description includes an example that adds concrete usage context, elevating above baseline 3.

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

Purpose5/5

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

The description clearly states the action (update), resource (product), and method (PATCH semantics), distinguishing it from create and delete 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?

Explicitly states that only provided fields are changed, giving a clear usage pattern. However, it does not explicitly compare with alternatives like create_product or delete_product.

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

update_quoteUpdate QuoteA
Idempotent

Update an existing quote using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', status='accepted' to mark a quote as accepted. / Actualiza un presupuesto existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesQuote ID / ID del presupuesto
itemsNoLine items / Conceptos
notesNoNotes / Notas
statusNoStatus / Estado
dueDateNoDue date in ISO 8601 (YYYY-MM-DD) / Fecha de vencimiento
taxRateNoTax rate % (e.g. 21 IVA, 7 IGIC) / Porcentaje de impuesto
clientIdNoExisting client ID — server back-fills taxId/address / ID de cliente existente
irpfRateNoIRPF withholding % (retencion autonomo ES) / Retencion IRPF %
issueDateNoIssue date in ISO 8601 (YYYY-MM-DD), defaults to today / Fecha de emision
clientNameNoClient name / Nombre del cliente
validUntilNoExpiry date (YYYY-MM-DD) / Fecha de validez
clientTaxIdNoClient tax ID (NIF/CIF/VAT) / NIF/CIF del cliente
clientAddressNoClient billing address / Direccion fiscal del cliente
clientLocationNoFiscal zone driving IVA vs IGIC vs exempt / Zona fiscal
equivalenceSurchargeRateNoRecargo de equivalencia % / Recargo de equivalencia %

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsNo
notesNo
totalNo
statusNo
createdAtNo
updatedAtNo
clientNameNo
validUntilNo

TDQS

A3.7/5.0
Behavior3/5

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

The description adds that only provided fields change (PATCH semantics) and gives an example, consistent with idempotentHint annotation. However, it does not disclose potential side effects like triggers upon status change or validation constraints.

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 very concise, with two clear sentences in English (plus a Spanish translation that doesn't harm). The example is front-loaded, making the purpose immediately clear.

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?

Given the high parameter count and presence of an output schema, the description is somewhat complete but lacks details on behavioral nuances like updating nested objects or side effects. The relationship to sibling tools is not explained.

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%, so the schema already describes all parameters. The description only adds an example for id and status, providing marginal 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 clearly states the verb 'Update' and resource 'existing quote' with 'PATCH semantics', and provides an example. It distinguishes from sibling tools like create_quote and delete_quote by specifying the update method and behavior.

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 implies usage for modifying existing quotes but does not explicitly state when to use this tool versus others or provide exclusions. The example gives a common use case but lacks direct guidance.

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

update_recurring_invoiceUpdate Recurring InvoiceA
Idempotent

Update an existing recurring invoice template using PATCH semantics. Only provided fields are changed. Changing lineItems or taxRate affects future generated invoices only, not already-created ones. / Actualiza una plantilla de factura recurrente existente. Solo se modifican los campos proporcionados. Cambiar lineas o tipo impositivo afecta solo a futuras facturas generadas.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecurring invoice template ID / ID de la plantilla
notesNoUpdated notes / Notas actualizadas
taxRateNoUpdated tax rate percentage / Tipo impositivo actualizado
frequencyNoUpdated frequency / Frecuencia actualizada
lineItemsNoUpdated line items (replaces all) / Lineas actualizadas (reemplaza todas)
templateNameNoUpdated template name / Nombre actualizado

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
statusNo
nextRunNo
createdAtNo
frequencyNo
lineItemsNo
recipientNo
updatedAtNo
templateNameNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate idempotentHint=true, but description adds key behavioral context: PATCH semantics, only provided fields change, and that modifying lineItems or taxRate affects only future generated invoices. No contradiction with annotations.

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

Conciseness5/5

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

The description is very concise, using two short sentences (plus Spanish translation) that front-load the essential information. No wasted words.

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 tool has 6 parameters, PATCH semantics, and future-only effects, the description covers the key nuance. The output schema is present but not relied upon. Missing prerequisites (e.g., existence of template) but overall sufficient.

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% with descriptions for all parameters. The description adds value by explaining that changes to lineItems and taxRate only affect future invoices, which goes beyond the schema's documentation.

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 clearly states 'Update an existing recurring invoice template using PATCH semantics.' It specifies the verb 'update' and the resource 'recurring invoice template,' distinguishing it from create, delete, pause, resume, and run operations.

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 says 'Only provided fields are changed' and explains the future-only effect of certain fields, guiding when to use the tool. However, it does not mention alternatives or when not to use it.

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

update_team_member_roleUpdate Team Member RoleA
Idempotent

Change the role of an existing team member. Only workspace admins or owners can change roles. Cannot change the owner's role — use a dedicated ownership transfer flow. Example: memberId='mbr_abc123', role='admin' / Cambia el rol de un miembro existente del espacio de trabajo. Solo administradores o propietarios pueden cambiar roles. No se puede cambiar el rol del propietario — usa el flujo de transferencia de propiedad.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleYesNew role to assign / Nuevo rol a asignar
memberIdYesTeam member ID / ID del miembro del equipo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
dataNo
metaNo
messageNo
successNo

TDQS

A4.5/5.0
Behavior4/5

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

Beyond annotations (idempotentHint, destructiveHint), description adds permissions and owner limitation. No contradiction noted.

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 in each language, front-loaded with purpose. Bilingual repetition is slightly redundant but not detrimental.

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

Completeness4/5

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

Covers prerequisites, limitations, and includes an example. Output schema exists, so return values are documented elsewhere.

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 covers 100% parameters; description adds an example with ID format and bilingual role enum explanation, providing extra clarity.

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?

Clearly states verb ('Change'), resource ('role of an existing team member'), and distinguishes from ownership transfer flow. No ambiguity.

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 states who can use (admins/owners) and when not to use (owner role change) with a specific alternative flow.

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

update_time_entryUpdate Time EntryA
Idempotent

Update an existing time entry using PATCH semantics. Only provided fields are changed. Example: id='te_abc123', hours=3.0, description='Frontend review + testing' / Actualiza una entrada de tiempo existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTime entry ID / ID de la entrada de tiempo
dateNoUpdated date ISO 8601 / Fecha actualizada
hoursNoUpdated hours / Horas actualizadas
billableNoUpdated billable flag / Facturabilidad actualizada
projectIdNoReassign to different project / Reasignar a otro proyecto
descriptionNoUpdated description / Descripcion actualizada

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
dateNo
hoursYes
statusNo
userIdNo
billableNo
createdAtNo
projectIdNo
updatedAtNo
descriptionNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already mark idempotentHint=true and destructiveHint=false. The description adds PATCH behavior and an example but no further behavioral context (e.g., permissions, error states). Annotations cover the safety profile, so a mid-range score is appropriate.

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

Conciseness4/5

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

The description is concise with two sentences plus an example. The bilingual duplication slightly reduces efficiency, but the key information is front-loaded.

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 presence of an output schema and 100% parameter coverage, the description adequately explains the tool's partial update behavior. It could mention error handling or prerequisites, but it is complete enough for typical use.

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 description adds marginal value. The example illustrates usage of id, hours, description, but does not clarify parameter syntax 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 clearly states 'Update an existing time entry using PATCH semantics' and provides a concrete example. This distinguishes it from sibling tools like create_time_entry, delete_time_entry, and list_time_entries.

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

Usage Guidelines4/5

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

The description explains PATCH semantics ('Only provided fields are changed'), which informs when to use this tool for partial updates. It does not explicitly exclude scenarios or name alternatives, but the context is clear for this resource.

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

update_vendorUpdate VendorA
Idempotent

Update an existing vendor using PATCH semantics. Only the provided fields will be changed. Example: id='abc123', email='new@supplier.com', phone='+34600123456' / Actualiza un proveedor existente. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVendor ID / ID del proveedor
nameNoName / Nombre
emailNoEmail / Correo
phoneNoPhone / Telefono
taxIdNoTax ID / NIF/CIF
addressNoVendor address / Direccion del proveedor

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
emailNo
phoneNo
taxIdNo
addressNo
createdAtNo
updatedAtNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already provide idempotentHint=true. The description adds useful context: PATCH semantics, only provided fields change, and an example. This goes beyond annotations to clarify non-destructive, partial update behavior.

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 short and includes an example, but the bilingual text (English and Spanish) adds length. Still, every sentence serves a purpose and the example is valuable.

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 tool's complexity (6 params, nested object, output schema present), the description covers the core operation. It does not detail return values or error cases, but the output schema likely covers that.

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% with individual parameter descriptions. The description adds an example and clarifies that only submitted fields are updated, which enhances understanding of how parameters behave together.

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 clearly states 'Update an existing vendor using PATCH semantics' with a specific verb and resource. It distinguishes from sibling tools like create_vendor or delete_vendor by emphasizing that only provided fields change.

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 guidance on when to use this tool versus alternatives like get_vendor (to read first) or create_vendor (if vendor doesn't exist). The description does not state prerequisites or scenarios where this tool is appropriate.

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

update_webhookUpdate WebhookA
Idempotent

Update an existing webhook configuration using PATCH semantics. Only provided fields change. Example: id='abc123', active=false to disable a webhook. / Actualiza la configuracion de un webhook. Solo se modifican los campos proporcionados.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID / ID del webhook
urlNoEndpoint URL / URL
activeNoActive / Activo
eventsNoEvents / Eventos
secretNoSigning secret / Secreto

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYes
activeNo
eventsYes
secretNo
createdAtNo
updatedAtNo

TDQS

A4.3/5.0
Behavior4/5

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

Discloses PATCH semantics and partial update behavior, aligning with idempotentHint; no contradictions with annotations.

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

Conciseness5/5

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

Two concise sentences (plus Spanish translation) front-load the key behavior.

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 given 5 params, output schema present, and simple semantics; example aids understanding.

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 covers all parameters at 100%, description adds an example using id and active but no further meaning.

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

Purpose5/5

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

Clearly states 'update an existing webhook configuration using PATCH semantics', distinguishing it from create, delete, and test webhook 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?

Provides clear context for updating and gives an example (disabling a webhook), but lacks explicit when-not-to-use guidance.

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

validate_einvoice_xmlValidate E-Invoice XMLA
Read-onlyIdempotent

Validate an e-invoice XML document against the specified format's schema and schematron rules. Returns a list of errors with severity, XPath location, message, and rule ID. Runs KOSIT validator (XRechnung), Mustang (EN16931), XSD, or Schematron depending on format.

Use before dispatch to catch errors early without incurring network transmission costs. A valid=true response means the document passes all schema + business rule checks.

If the validation backend is not deployed for this workspace, returns an honest 'unavailable' response — never a fabricated valid=true. / Valida un documento XML de factura electronica contra el esquema y reglas schematron del formato especificado.

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlYesRaw XML string of the e-invoice document to validate / Contenido XML de la factura electronica
formatYesFormat to validate against. Determines which validator and ruleset to apply. / Formato a validar. Determina el validador y conjunto de reglas a aplicar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesWhether the XML passes all validation rules
errorsYesList of validation findings (empty if valid)
validatorYesValidation engine used
durationMsYesValidation duration in milliseconds

TDQS

A4.6/5.0
Behavior5/5

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

The description adds specific behavioral details beyond annotations: the validators used (KOSIT, Mustang, etc.) and the return format (errors with severity, XPath, message, rule ID). It also clarifies the honesty policy for unavailable backends. Annotations already indicate read-only and idempotent, but the description enriches 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?

The description is efficient and front-loaded with the core purpose. However, it includes bilingual content (English and Spanish) which adds length; while not excessive, it could be streamlined for an AI agent. Overall, it remains concise and well-structured.

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

Completeness5/5

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

Given the tool's complexity (2 parameters, output schema exists), the description is fully adequate. It covers the purpose, usage timing, edge cases (unavailable backend), and validation process. With output schema present, return values need no further explanation. No gaps remain.

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 input schema has 100% description coverage, so each parameter is already explained. The tool description adds extra context for the 'format' parameter, stating it 'determines which validator and ruleset to apply', which aids understanding beyond the enum list. This incremental value merits a score above the baseline of 3.

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

Purpose5/5

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

The description clearly states the tool validates e-invoice XML against schema and schematron rules, specifying the verb 'validate' and resource 'e-invoice XML'. It distinguishes from sibling tools like 'send_einvoice' and 'get_einvoice_status' by focusing on pre-dispatch validation, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description explicitly advises using the tool 'before dispatch to catch errors early', providing a clear use case. It also warns about the 'unavailable' response when the backend is not deployed, setting expectations. Although it does not compare with alternatives, the guidance is sufficient for the agent.

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

verifactu_resubmitRe-submit VeriFactu SubmissionA
Idempotent

TRUST AREA — COMPLIANCE. Re-submit a failed or rejected VeriFactu submission to AEAT. Idempotent: uses the same hash chain; AEAT deduplicates by hash. Creates an audit trail entry for every resubmission attempt. Requires confirm=true. Only use on invoices with status='failed'. / AREA DE CONFIANZA — COMPLIANCE. Reenvio de una factura VeriFactu fallida a AEAT. Idempotente: misma cadena hash. Registra entrada de auditoria en cada intento. Requiere confirm=true. Solo para facturas con status='failed'.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true to confirm VeriFactu resubmission / Debe ser true para confirmar el reenvio
invoiceIdYesInvoice ID to resubmit / ID de la factura a reenviar

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
hashNo
qrUrlNo
statusNo
sandboxNo
acceptedNo
invoiceIdYes
lastErrorNo
retryCountNo
submittedAtNo
aeatResponseNo
lastSubmissionAtNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide idempotentHint=true and destructiveHint=false. Description adds that it creates an audit trail entry per attempt and requires confirm=true, which is useful beyond annotations. No contradictions.

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?

Description is bilingual (English and Spanish), doubling length but serving a multilingual user base. Key info is front-loaded: purpose, idempotency, audit trail, requirement. Could be more concise by dropping the trust area tag, but still efficient.

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 annotations (idempotentHint) and required params, the description covers the essential behavioral points: idempotency, audit trail, confirm requirement, and invoice status condition. Lacks error scenarios or response details, but output schema may cover return values.

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. Description adds the constraint that confirm must be true and that invoiceId must belong to a failed invoice. This provides meaningful behavioral context beyond 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?

Clearly states the tool re-submits a failed or rejected VeriFactu submission to AEAT. The phrase 'TRUST AREA — COMPLIANCE' sets domain context. Distinguishes from siblings like 'send_invoice' (new submission) and 'verifactu_status' (status check).

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

Usage Guidelines4/5

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

Explicitly states 'Only use on invoices with status="failed".' and 'Requires confirm=true.' Provides clear when-to-use context. Lacks explicit when-not-to-use or alternatives, but condition is precise enough for correct selection.

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

verifactu_statusGet VeriFactu Submission StatusA
Read-onlyIdempotent

Get the VeriFactu (AEAT Spanish e-invoice chain) submission status for a specific invoice. Returns last submission timestamp, hash, AEAT response code, and QR verification URL. / Obtiene el estado de envio VeriFactu (AEAT) para una factura especifica. Devuelve timestamp del ultimo envio, hash, respuesta AEAT y URL del codigo QR.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoiceIdYesInvoice ID / ID de la factura

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
hashNo
qrUrlNo
statusNo
sandboxNo
acceptedNo
invoiceIdYes
lastErrorNo
retryCountNo
submittedAtNo
aeatResponseNo
lastSubmissionAtNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds specific return fields (timestamp, hash, response code, QR URL), providing useful behavioral detail beyond 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 sentences in bilingual format, each earning its place. Front-loaded with key information, no fluff. Efficient and clear.

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

Completeness5/5

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

Given the low complexity (single parameter, annotations, output schema present), the description is complete enough to understand the tool's behavior without ambiguity.

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 sole parameter invoiceId has full schema description coverage (100%). The tool description does not add additional semantics beyond what the schema already provides, 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 clearly states the tool retrieves VeriFactu submission status for a specific invoice, listing returned fields. This distinguishes it from sibling tools like send_invoice, get_einvoice_status, ticketbai_status, and verifactu_resubmit.

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 implies usage for checking status after submission but provides no explicit guidance on when to use this tool versus alternatives like get_einvoice_status or ticketbai_status. Context is implied but not elaborated.

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. 23 tool updatesv1.16.3
    • Addedcreate_invoice
    • Addedcreate_quote
    • Addeddelete_client_contact
    • Addeddelete_invoice
    • Addeddelete_quote
    • Removedget_business_context
    • Removedget_expense
    • Addedget_invoice_pdf
    • Addedget_monthly_summary
    • Removedget_quarterly_taxes
    • Addedget_quote
    • Addedlist_client_activities
    • Addedlist_client_notes
    • Addedlist_clients
    • Addedlist_deposits
    • Addedlist_expenses
    • Addedlist_invoices
    • Addedlist_products
    • Addedlist_quotes
    • Addedlog_client_activity
    • Addedupdate_expense
    • Addedupdate_invoice
    • Addedupdate_product
  2. 97 tool updatesv1.16.3
    • Addedapply_deposit
    • Addedapply_late_fee
    • Addedcategorize_transaction
    • Removedcreate_client
    • Addedcreate_client_note
    • Addedcreate_credit_note
    • Addedcreate_deposit
    • Addedcreate_product
    • Addedcreate_reservation
    • Addedcreate_time_entry
    • Addedcreate_vendor
    • Addedcreate_webhook
    • Removeddelete_client_contact
    • Addeddelete_client_note
    • Addeddelete_deposit
    • Addeddelete_expense
    • Addeddelete_product
    • Addeddelete_vendor
    • Addeddelete_webhook
    • Addedduplicate_invoice
    • Addedeinvoice_export
    • Addedexport_datev
    • Addedface_status
    • Addedface_submit
    • Changedfrihet_aiem_calculate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "AIEM calculation result: applicable rate, tax base and amount due / Resultado AIEM: tipo aplicable, base imponible y cuota",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_bank_rule_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Created bank rule record with ID, conditions and actions / Regla bancaria creada con ID, condiciones y acciones",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_gl_entry_approve1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Approved GL entry record with new status and audit trail entry / Asiento contable aprobado con nuevo estado y entrada de auditoría",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_gl_entry_audit_log1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Audit trail entries for the GL entry (state transitions, actor, timestamp) / Historial de auditoría del asiento (transiciones, actor, fecha)",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_gl_entry_reject1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Rejected GL entry record with reason and audit trail entry / Asiento contable rechazado con motivo y entrada de auditoría",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_modelo_200_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Modelo 200 annual corporate tax summary: taxable base, deductions, rate, net payable / Resumen anual IS: base, deducciones, tipo, cuota",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_modelo_202_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Modelo 202 installment payments: amounts, due dates, payment status / Pagos fraccionados Modelo 202: importes, plazos, estado",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_modelo_415_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Modelo 415 summary: counterparty operations, totals and filing deadline / Resumen Modelo 415: operaciones, totales y plazo",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_modelo_418_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Modelo 418 monthly IGIC summary: collected, deductible, net due, carryover / Resumen mensual IGIC: repercutido, soportado, cuota, saldo",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_modelo_425_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Modelo 425 annual IGIC recap: IGIC collected, deductible, net payable / Resumen anual IGIC: repercutido, soportado, cuota",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_portal_domain_add1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Added domain record with required DNS (CNAME) records / Dominio añadido con los registros DNS (CNAME) necesarios",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_portal_domain_remove1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Confirmation that the custom domain was removed / Confirmación de que el dominio personalizado fue eliminado",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_portal_domain_verify1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Domain verification status (pending/verified/failed) and any DNS errors / Estado de verificación del dominio y errores DNS",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_portal_onboard_link_generate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Generated self-onboard link with expiry and token / Enlace de auto-registro generado con caducidad y token",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedfrihet_tax_id_vies_lookup1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "VIES lookup result: company name, address and validity status / Resultado VIES: nombre, dirección y validez",
        +  "properties": {},
        +  "type": "object"
        +}
    • Addedget_bank_account
    • Addedget_business_context
    • Addedget_client
    • Addedget_deposit
    • Addedget_einvoice_status
    • Addedget_expense
    • Addedget_invoice
    • Addedget_kitchen_ticket
    • Addedget_modelo_130_summary
    • Addedget_modelo_180_summary
    • Addedget_modelo_303_summary
    • Addedget_modelo_347_summary
    • Addedget_modelo_390_summary
    • Addedget_product
    • Addedget_quarterly_taxes
    • Addedget_reservation
    • Addedget_time_entry
    • Addedget_time_summary
    • Addedget_vendor
    • Addedget_webhook
    • Addedkitchen_flow_summary
    • Addedksef_submit
    • Addedlist_bank_accounts
    • Addedlist_client_contacts
    • Removedlist_client_notes
    • Removedlist_invoices
    • Addedlist_kitchen_stations
    • Addedlist_kitchen_tickets
    • Addedlist_menu_items
    • Addedlist_properties
    • Addedlist_reservations
    • Addedlist_sales
    • Addedlist_terminals
    • Addedlist_time_entries
    • Addedlist_transactions
    • Addedlist_vendors
    • Addedlist_webhooks
    • Addedmatch_transaction_to_invoice
    • Addedrefund_deposit
    • Addedrefund_sale
    • Addedsearch_invoices
    • Addedsend_einvoice
    • Addedsend_invoice
    • Addedsend_quote
    • Addedsync_channel
    • Addedtest_webhook
    • Addedticketbai_status
    • Addedticketbai_submit
    • Addedupdate_client
    • Addedupdate_deposit
    • Addedupdate_kitchen_ticket
    • Addedupdate_quote
    • Addedupdate_time_entry
    • Addedupdate_vendor
    • Addedupdate_webhook
    • Addedvalidate_einvoice_xml
    • Addedverifactu_resubmit
    • Addedverifactu_status
  3. 35 tool updatesv1.15.2
    • Addedanomaly_list
    • Removedcategorize_transaction
    • Addedcreate_client
    • Removedcreate_client_note
    • Removedcreate_invoice
    • Addedcreate_recurring_invoice
    • Removedcreate_time_entry
    • Addeddelete_client_contact
    • Removeddelete_deposit
    • Addeddelete_recurring_invoice
    • Addeddelete_time_entry
    • Removedeinvoice_export
    • Removedexport_datev
    • Addedgestoria_message_send
    • Removedget_bank_account
    • Removedget_invoice_einvoice
    • Addedget_recurring_invoice
    • Addedget_sale
    • Addedinvite_team_member
    • Removedlist_bank_accounts
    • Addedlist_client_notes
    • Addedlist_invoices
    • Addedlist_recurring_invoices
    • Addedlist_team_members
    • Removedlist_transactions
    • Removedmark_invoice_paid
    • Removedmatch_transaction_to_invoice
    • Addedpause_recurring_invoice
    • Addedpayroll_export
    • Addedremove_team_member
    • Addedresume_recurring_invoice
    • Addedrun_recurring_now
    • Removedupdate_product
    • Addedupdate_recurring_invoice
    • Addedupdate_team_member_role
  4. 107 tool updatesv1.15.2
    • Removedanomaly_list
    • Removedapply_deposit
    • Removedapply_late_fee
    • Removedcreate_client
    • Removedcreate_client_contact
    • Removedcreate_credit_note
    • Removedcreate_deposit
    • Removedcreate_expense
    • Removedcreate_product
    • Removedcreate_quote
    • Removedcreate_recurring_invoice
    • Removedcreate_reservation
    • Removedcreate_vendor
    • Removedcreate_webhook
    • Removeddelete_client
    • Removeddelete_client_contact
    • Removeddelete_client_note
    • Removeddelete_expense
    • Removeddelete_invoice
    • Removeddelete_product
    • Removeddelete_quote
    • Removeddelete_recurring_invoice
    • Removeddelete_time_entry
    • Removeddelete_vendor
    • Removeddelete_webhook
    • Removedduplicate_invoice
    • Removedface_status
    • Removedface_submit
    • Removedgestoria_message_send
    • Removedget_business_context
    • Removedget_client
    • Removedget_deposit
    • Removedget_einvoice_status
    • Removedget_expense
    • Removedget_invoice
    • Removedget_invoice_pdf
    • Removedget_kitchen_ticket
    • Removedget_modelo_130_summary
    • Removedget_modelo_180_summary
    • Removedget_modelo_303_summary
    • Removedget_modelo_347_summary
    • Removedget_modelo_390_summary
    • Removedget_monthly_summary
    • Removedget_product
    • Removedget_quarterly_taxes
    • Removedget_quote
    • Removedget_recurring_invoice
    • Removedget_reservation
    • Removedget_sale
    • Removedget_time_entry
    • Removedget_time_summary
    • Removedget_vendor
    • Removedget_webhook
    • Removedinvite_team_member
    • Removedkitchen_flow_summary
    • Removedksef_submit
    • Removedlist_client_activities
    • Removedlist_client_contacts
    • Removedlist_client_notes
    • Removedlist_clients
    • Removedlist_deposits
    • Removedlist_expenses
    • Removedlist_invoices
    • Removedlist_kitchen_stations
    • Removedlist_kitchen_tickets
    • Removedlist_menu_items
    • Removedlist_products
    • Removedlist_properties
    • Removedlist_quotes
    • Removedlist_recurring_invoices
    • Removedlist_reservations
    • Removedlist_sales
    • Removedlist_team_members
    • Removedlist_terminals
    • Removedlist_time_entries
    • Removedlist_vendors
    • Removedlist_webhooks
    • Removedlog_client_activity
    • Removedpause_recurring_invoice
    • Removedpayroll_export
    • Removedrefund_deposit
    • Removedrefund_sale
    • Removedremove_team_member
    • Removedresume_recurring_invoice
    • Removedrun_recurring_now
    • Removedsearch_invoices
    • Removedsend_einvoice
    • Removedsend_invoice
    • Removedsend_quote
    • Removedsync_channel
    • Removedtest_webhook
    • Removedticketbai_status
    • Removedticketbai_submit
    • Removedupdate_client
    • Removedupdate_deposit
    • Removedupdate_expense
    • Removedupdate_invoice
    • Removedupdate_kitchen_ticket
    • Removedupdate_quote
    • Removedupdate_recurring_invoice
    • Removedupdate_team_member_role
    • Removedupdate_time_entry
    • Removedupdate_vendor
    • Removedupdate_webhook
    • Removedvalidate_einvoice_xml
    • Removedverifactu_resubmit
    • Removedverifactu_status
  5. 30 tool updatesv1.15.0
    • Changedapply_deposit3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedapply_late_fee3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedcreate_credit_note16 fields changed
      • removedOutput schema / properties / clientName
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / createdAt
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / creditNote
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "documentNumber": {
        +      "type": "string"
        +    },
        +    "fullCredit": {
        +      "type": "boolean"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "originalInvoiceId": {
        +      "type": "string"
        +    },
        +    "reason": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / properties / dueDate
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / id
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / issueDate
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / items
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "type": "string"
        -      },
        -      "quantity": {
        -        "type": "number"
        -      },
        -      "unitPrice": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "quantity",
        -      "unitPrice"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / properties / notes
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / taxRate
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / total
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / updatedAt
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]
    • Changedcreate_invoice3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedcreate_quote3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedget_invoice3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedget_quote3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedlist_clients1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "name"
        -]
    • Changedlist_deposits1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "clientId",
        -  "amount"
        -]
    • Changedlist_expenses1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "description",
        -  "amount"
        -]
    • Changedlist_invoices3 fields changed
      • addedOutput schema / properties / data / items / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / items / properties / clientName / type
        Removed value: -"string"
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]
    • Changedlist_products1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "name",
        -  "unitPrice"
        -]
    • Changedlist_properties1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "name"
        -]
    • Changedlist_quotes3 fields changed
      • addedOutput schema / properties / data / items / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / items / properties / clientName / type
        Removed value: -"string"
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]
    • Changedlist_reservations1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "propertyId",
        -  "status",
        -  "checkIn",
        -  "checkOut",
        -  "guestCount"
        -]
    • Changedlist_vendors1 field changed
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "name"
        -]
    • Changedmark_invoice_paid3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedpause_recurring_invoice3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedrefund_deposit3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedremove_team_member3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedresume_recurring_invoice3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedrun_recurring_now3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedsearch_invoices3 fields changed
      • addedOutput schema / properties / data / items / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / items / properties / clientName / type
        Removed value: -"string"
      • removedOutput schema / properties / data / items / required
        Removed value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]
    • Changedsend_invoice3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedsend_quote3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedupdate_invoice3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedupdate_quote3 fields changed
      • addedOutput schema / properties / clientName / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / clientName / type
        Removed value: -"string"
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "clientName",
        -  "items"
        -]New value: +[
        +  "id"
        +]
    • Changedupdate_team_member_role3 fields changed
      • addedOutput schema / properties / data
        Added value: +{
        +  "not": {}
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "not": {}
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "success",
        -  "id"
        -]
    • Changedverifactu_resubmit7 fields changed
      • addedOutput schema / properties / accepted
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / csv
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / lastError
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / retryCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / sandbox
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "success",
        -  "pending",
        -  "failed"
        -]New value: +[
        +  "success",
        +  "pending",
        +  "failed",
        +  "accepted",
        +  "not_submitted"
        +]
      • addedOutput schema / properties / submittedAt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
    • Changedverifactu_status7 fields changed
      • addedOutput schema / properties / accepted
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / csv
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / lastError
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / retryCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / sandbox
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "success",
        -  "pending",
        -  "failed"
        -]New value: +[
        +  "success",
        +  "pending",
        +  "failed",
        +  "accepted",
        +  "not_submitted"
        +]
      • addedOutput schema / properties / submittedAt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  6. 14 tool updatesv1.14.5
    • Changedcreate_invoice12 fields changed
      • addedInput schema / properties / clientAddress
        Added value: +{
        +  "description": "Client billing address shown on the invoice / Direccion fiscal del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Existing client ID — server back-fills taxId/address / ID de cliente existente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientLocation
        Added value: +{
        +  "description": "Fiscal zone driving IVA vs IGIC vs exempt / Zona fiscal (IVA/IGIC/exento)",
        +  "enum": [
        +    "peninsula",
        +    "canarias",
        +    "ceuta_melilla",
        +    "eu",
        +    "world"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / clientTaxId
        Added value: +{
        +  "description": "Client tax ID (NIF/CIF/VAT) shown on the invoice / NIF/CIF del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / discountRate
        Added value: +{
        +  "description": "Global discount % applied to the invoice / Descuento global %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / documentNumber
        Added value: +{
        +  "description": "Externally-issued number for import (honored verbatim) / Numero externo para importacion",
        +  "maxLength": 50,
        +  "type": "string"
        +}
      • addedInput schema / properties / equivalenceSurchargeRate
        Added value: +{
        +  "description": "Recargo de equivalencia % (ES retail regime) / Recargo de equivalencia %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / irpfRate
        Added value: +{
        +  "description": "IRPF withholding % (retencion autonomo ES, e.g. 15 or 7) / Retencion IRPF %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / operationType
        Added value: +{
        +  "description": "Operation type (service or goods) / Tipo de operacion",
        +  "enum": [
        +    "service",
        +    "goods"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / poNumber
        Added value: +{
        +  "description": "Client purchase-order reference / Numero de pedido del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / prepayment
        Added value: +{
        +  "description": "Prepaid/advance amount already collected in EUR / Anticipo cobrado en EUR",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / seriesId
        Added value: +{
        +  "description": "Invoice numbering series ID / ID de serie de numeracion",
        +  "type": "string"
        +}
    • Changedcreate_quote9 fields changed
      • addedInput schema / properties / clientAddress
        Added value: +{
        +  "description": "Client billing address / Direccion fiscal del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Existing client ID — server back-fills taxId/address / ID de cliente existente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientLocation
        Added value: +{
        +  "description": "Fiscal zone driving IVA vs IGIC vs exempt / Zona fiscal",
        +  "enum": [
        +    "peninsula",
        +    "canarias",
        +    "ceuta_melilla",
        +    "eu",
        +    "world"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / clientTaxId
        Added value: +{
        +  "description": "Client tax ID (NIF/CIF/VAT) / NIF/CIF del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / dueDate
        Added value: +{
        +  "description": "Due date in ISO 8601 (YYYY-MM-DD) / Fecha de vencimiento",
        +  "type": "string"
        +}
      • addedInput schema / properties / equivalenceSurchargeRate
        Added value: +{
        +  "description": "Recargo de equivalencia % / Recargo de equivalencia %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / irpfRate
        Added value: +{
        +  "description": "IRPF withholding % (retencion autonomo ES) / Retencion IRPF %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / issueDate
        Added value: +{
        +  "description": "Issue date in ISO 8601 (YYYY-MM-DD), defaults to today / Fecha de emision",
        +  "type": "string"
        +}
      • addedInput schema / properties / taxRate
        Added value: +{
        +  "description": "Tax rate % (e.g. 21 IVA, 7 IGIC) / Porcentaje de impuesto",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedeinvoice_export7 fields changed
      • addedOutput schema / properties / contentType
        Added value: +{
        +  "description": "MIME type of the XML payload (application/xml)",
        +  "type": "string"
        +}
      • changedOutput schema / properties / filename / description
        Previous value: -"Suggested filename (e.g. INV-2026-001-facturae.xml)"New value: +"Suggested filename (e.g. INV-2026-001_Facturae.xml)"
      • changedOutput schema / properties / format / description
        Previous value: -"E-invoice format used"New value: +"E-invoice format used (echoes the requested format)"
      • changedOutput schema / properties / signed / description
        Previous value: -"Whether XAdES signature was applied (Facturae only)"New value: +"Whether XAdES signature was applied (Facturae + signed=true only)"
      • addedOutput schema / properties / xml
        Added value: +{
        +  "description": "Raw e-invoice XML content (the document itself, returned inline by the CF)",
        +  "type": "string"
        +}
      • removedOutput schema / properties / xmlUrl
        Removed value: -{
        -  "description": "Signed URL to download the e-invoice XML (valid 24h)",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "xmlUrl",
        -  "filename",
        -  "format",
        -  "signed"
        -]New value: +[
        +  "xml",
        +  "contentType",
        +  "filename",
        +  "signed",
        +  "format"
        +]
    • Changedface_status10 fields changed
      • addedOutput schema / properties / codigo
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "FACe status code (e.g. '1200'=Registrada, '1400'=Contabilizada, '3100'=Rechazada)"
        +}
      • addedOutput schema / properties / descripcion
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Human-readable FACe status description"
        +}
      • addedOutput schema / properties / estadoTramitacion
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "FACe processing-state code (estado de tramitación)"
        +}
      • addedOutput schema / properties / motivo
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Reason/motive associated with the current status (e.g. rejection motive)"
        +}
      • addedOutput schema / properties / numeroRegistro
        Added value: +{
        +  "description": "FACe registration number for this submission",
        +  "type": "string"
        +}
      • removedOutput schema / properties / registroFACe
        Removed value: -{
        -  "description": "FACe registration number",
        -  "type": "string"
        -}
      • removedOutput schema / properties / rejectionReason
        Removed value: -{
        -  "description": "Rejection reason if statusCode=3100",
        -  "type": "string"
        -}
      • removedOutput schema / properties / statusCode
        Removed value: -{
        -  "description": "FACe status code (e.g. '1200'=Registrada, '1400'=Contabilizada, '3100'=Rechazada)",
        -  "type": "string"
        -}
      • removedOutput schema / properties / statusDescription
        Removed value: -{
        -  "description": "Human-readable FACe status description",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "registroFACe",
        -  "statusCode",
        -  "statusDescription"
        -]New value: +[
        +  "numeroRegistro",
        +  "estadoTramitacion",
        +  "codigo",
        +  "descripcion",
        +  "motivo"
        +]
    • Changedface_submit11 fields changed
      • addedOutput schema / properties / codigo
        Added value: +{
        +  "description": "FACe result code returned by the portal (resultado.codigo)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / descripcion
        Added value: +{
        +  "description": "Human-readable FACe result description (resultado.descripcion)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / idempotent
        Added value: +{
        +  "description": "True if this echoes a prior already-registered submission (no resubmission occurred)",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / mode
        Removed value: -{
        -  "description": "Mode used: mock | sandbox | production",
        -  "type": "string"
        -}
      • addedOutput schema / properties / numeroRegistro
        Added value: +{
        +  "description": "FACe registration number (número de registro) returned by the portal",
        +  "type": "string"
        +}
      • removedOutput schema / properties / registroFACe
        Removed value: -{
        -  "description": "FACe registration number (número de registro) returned by the portal",
        -  "type": "string"
        -}
      • addedOutput schema / properties / status / const
        Added value: +"submitted"
      • changedOutput schema / properties / status / description
        Previous value: -"Submission outcome"New value: +"Submission accepted by FACe (the CF returns an error otherwise)"
      • removedOutput schema / properties / status / enum
        Removed value: -[
        -  "submitted",
        -  "error"
        -]
      • removedOutput schema / properties / submittedAt
        Removed value: -{
        -  "description": "ISO 8601 timestamp of the submission",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "registroFACe",
        -  "status",
        -  "submittedAt",
        -  "mode"
        -]New value: +[
        +  "status",
        +  "numeroRegistro",
        +  "codigo",
        +  "descripcion"
        +]
    • Changedget_modelo_130_summary10 fields changed
      • addedOutput schema / properties / model
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / modelo130
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "gastos": {
        +      "type": "number"
        +    },
        +    "ingresos": {
        +      "type": "number"
        +    },
        +    "pagoFraccionado": {
        +      "description": "Pago fraccionado IRPF (20% del rendimiento neto)",
        +      "type": "number"
        +    },
        +    "rendimientoNeto": {
        +      "type": "number"
        +    },
        +    "retencionesSoportadas": {
        +      "description": "IRPF withheld by clients on issued invoices",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo303
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "description": "Deductible base (input)",
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "description": "Base of exempt operations (zero cuota)",
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "description": "IVA devengado base (operaciones interiores sujetas)",
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "description": "Intra-community / export / reverse-charge base",
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "description": "Input VAT (cuota deducible)",
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "description": "Output VAT (cuota repercutida)",
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "description": "IGIC/IPSI totals — outside the 303 self-assessment",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultado": {
        +      "description": "cuotaRepercutida − cuotaDeducible (+ to pay, − to refund/compensate)",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo390
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultadoAnual": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / months
        Added value: +{
        +  "description": "Months covered by the period (YYYY-MM)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / period / description
        Added value: +"YYYY-QN (303/130) or YYYY (390)"
      • addedOutput schema / properties / readonly
        Added value: +{
        +  "const": true,
        +  "description": "Marks the payload as an informational summary, never filed to AEAT",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientCount": {
        +      "type": "number"
        +    },
        +    "expenseCount": {
        +      "type": "number"
        +    },
        +    "invoiceCount": {
        +      "type": "number"
        +    },
        +    "totalExpenses": {
        +      "type": "number"
        +    },
        +    "totalRevenue": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "modeloCode"
        -]
    • Changedget_modelo_180_summary10 fields changed
      • addedOutput schema / properties / model
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / modelo130
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "gastos": {
        +      "type": "number"
        +    },
        +    "ingresos": {
        +      "type": "number"
        +    },
        +    "pagoFraccionado": {
        +      "description": "Pago fraccionado IRPF (20% del rendimiento neto)",
        +      "type": "number"
        +    },
        +    "rendimientoNeto": {
        +      "type": "number"
        +    },
        +    "retencionesSoportadas": {
        +      "description": "IRPF withheld by clients on issued invoices",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo303
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "description": "Deductible base (input)",
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "description": "Base of exempt operations (zero cuota)",
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "description": "IVA devengado base (operaciones interiores sujetas)",
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "description": "Intra-community / export / reverse-charge base",
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "description": "Input VAT (cuota deducible)",
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "description": "Output VAT (cuota repercutida)",
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "description": "IGIC/IPSI totals — outside the 303 self-assessment",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultado": {
        +      "description": "cuotaRepercutida − cuotaDeducible (+ to pay, − to refund/compensate)",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo390
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultadoAnual": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / months
        Added value: +{
        +  "description": "Months covered by the period (YYYY-MM)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / period / description
        Added value: +"YYYY-QN (303/130) or YYYY (390)"
      • addedOutput schema / properties / readonly
        Added value: +{
        +  "const": true,
        +  "description": "Marks the payload as an informational summary, never filed to AEAT",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientCount": {
        +      "type": "number"
        +    },
        +    "expenseCount": {
        +      "type": "number"
        +    },
        +    "invoiceCount": {
        +      "type": "number"
        +    },
        +    "totalExpenses": {
        +      "type": "number"
        +    },
        +    "totalRevenue": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "modeloCode"
        -]
    • Changedget_modelo_303_summary10 fields changed
      • addedOutput schema / properties / model
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / modelo130
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "gastos": {
        +      "type": "number"
        +    },
        +    "ingresos": {
        +      "type": "number"
        +    },
        +    "pagoFraccionado": {
        +      "description": "Pago fraccionado IRPF (20% del rendimiento neto)",
        +      "type": "number"
        +    },
        +    "rendimientoNeto": {
        +      "type": "number"
        +    },
        +    "retencionesSoportadas": {
        +      "description": "IRPF withheld by clients on issued invoices",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo303
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "description": "Deductible base (input)",
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "description": "Base of exempt operations (zero cuota)",
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "description": "IVA devengado base (operaciones interiores sujetas)",
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "description": "Intra-community / export / reverse-charge base",
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "description": "Input VAT (cuota deducible)",
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "description": "Output VAT (cuota repercutida)",
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "description": "IGIC/IPSI totals — outside the 303 self-assessment",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultado": {
        +      "description": "cuotaRepercutida − cuotaDeducible (+ to pay, − to refund/compensate)",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo390
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultadoAnual": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / months
        Added value: +{
        +  "description": "Months covered by the period (YYYY-MM)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / period / description
        Added value: +"YYYY-QN (303/130) or YYYY (390)"
      • addedOutput schema / properties / readonly
        Added value: +{
        +  "const": true,
        +  "description": "Marks the payload as an informational summary, never filed to AEAT",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientCount": {
        +      "type": "number"
        +    },
        +    "expenseCount": {
        +      "type": "number"
        +    },
        +    "invoiceCount": {
        +      "type": "number"
        +    },
        +    "totalExpenses": {
        +      "type": "number"
        +    },
        +    "totalRevenue": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "modeloCode"
        -]
    • Changedget_modelo_347_summary10 fields changed
      • addedOutput schema / properties / model
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / modelo130
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "gastos": {
        +      "type": "number"
        +    },
        +    "ingresos": {
        +      "type": "number"
        +    },
        +    "pagoFraccionado": {
        +      "description": "Pago fraccionado IRPF (20% del rendimiento neto)",
        +      "type": "number"
        +    },
        +    "rendimientoNeto": {
        +      "type": "number"
        +    },
        +    "retencionesSoportadas": {
        +      "description": "IRPF withheld by clients on issued invoices",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo303
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "description": "Deductible base (input)",
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "description": "Base of exempt operations (zero cuota)",
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "description": "IVA devengado base (operaciones interiores sujetas)",
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "description": "Intra-community / export / reverse-charge base",
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "description": "Input VAT (cuota deducible)",
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "description": "Output VAT (cuota repercutida)",
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "description": "IGIC/IPSI totals — outside the 303 self-assessment",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultado": {
        +      "description": "cuotaRepercutida − cuotaDeducible (+ to pay, − to refund/compensate)",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo390
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultadoAnual": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / months
        Added value: +{
        +  "description": "Months covered by the period (YYYY-MM)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / period / description
        Added value: +"YYYY-QN (303/130) or YYYY (390)"
      • addedOutput schema / properties / readonly
        Added value: +{
        +  "const": true,
        +  "description": "Marks the payload as an informational summary, never filed to AEAT",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientCount": {
        +      "type": "number"
        +    },
        +    "expenseCount": {
        +      "type": "number"
        +    },
        +    "invoiceCount": {
        +      "type": "number"
        +    },
        +    "totalExpenses": {
        +      "type": "number"
        +    },
        +    "totalRevenue": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "modeloCode"
        -]
    • Changedget_modelo_390_summary10 fields changed
      • addedOutput schema / properties / model
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / modelo130
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "gastos": {
        +      "type": "number"
        +    },
        +    "ingresos": {
        +      "type": "number"
        +    },
        +    "pagoFraccionado": {
        +      "description": "Pago fraccionado IRPF (20% del rendimiento neto)",
        +      "type": "number"
        +    },
        +    "rendimientoNeto": {
        +      "type": "number"
        +    },
        +    "retencionesSoportadas": {
        +      "description": "IRPF withheld by clients on issued invoices",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo303
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "description": "Deductible base (input)",
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "description": "Base of exempt operations (zero cuota)",
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "description": "IVA devengado base (operaciones interiores sujetas)",
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "description": "Intra-community / export / reverse-charge base",
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "description": "Input VAT (cuota deducible)",
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "description": "Output VAT (cuota repercutida)",
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "description": "IGIC/IPSI totals — outside the 303 self-assessment",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultado": {
        +      "description": "cuotaRepercutida − cuotaDeducible (+ to pay, − to refund/compensate)",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / modelo390
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "baseDeducible": {
        +      "type": "number"
        +    },
        +    "baseExenta": {
        +      "type": "number"
        +    },
        +    "baseImponible": {
        +      "type": "number"
        +    },
        +    "baseNoSujetaORC": {
        +      "type": "number"
        +    },
        +    "cuotaDeducible": {
        +      "type": "number"
        +    },
        +    "cuotaRepercutida": {
        +      "type": "number"
        +    },
        +    "outOfScope": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "resultadoAnual": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / months
        Added value: +{
        +  "description": "Months covered by the period (YYYY-MM)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / period / description
        Added value: +"YYYY-QN (303/130) or YYYY (390)"
      • addedOutput schema / properties / readonly
        Added value: +{
        +  "const": true,
        +  "description": "Marks the payload as an informational summary, never filed to AEAT",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientCount": {
        +      "type": "number"
        +    },
        +    "expenseCount": {
        +      "type": "number"
        +    },
        +    "invoiceCount": {
        +      "type": "number"
        +    },
        +    "totalExpenses": {
        +      "type": "number"
        +    },
        +    "totalRevenue": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "modeloCode"
        -]
    • Changedticketbai_status13 fields changed
      • addedOutput schema / properties / accepted
        Added value: +{
        +  "description": "Whether the submission has been accepted by the hacienda foral",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / csv
        Added value: +{
        +  "description": "CSV (Código Seguro de Verificación) for the submission",
        +  "type": "string"
        +}
      • removedOutput schema / properties / error
        Removed value: -{
        -  "description": "Internal error message (if error)",
        -  "type": "string"
        -}
      • addedOutput schema / properties / errors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Hacienda error messages if rejected (null if none)"
        +}
      • addedOutput schema / properties / estado
        Added value: +{
        +  "description": "Current submission status stored server-side (e.g. 'accepted', 'rejected')",
        +  "type": "string"
        +}
      • addedOutput schema / properties / qrUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "QR code URL to print on the invoice (null if not yet available)"
        +}
      • removedOutput schema / properties / rejectionReason
        Removed value: -{
        -  "description": "Rejection reason from hacienda (if rejected)",
        -  "type": "string"
        -}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "description": "Current hacienda acknowledgement status",
        -  "enum": [
        -    "submitted",
        -    "accepted",
        -    "rejected",
        -    "error"
        -  ],
        -  "type": "string"
        -}
      • addedOutput schema / properties / submittedAt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "ISO 8601 timestamp the submission was recorded (null if unknown)"
        +}
      • removedOutput schema / properties / tbaiId
        Removed value: -{
        -  "description": "TicketBAI identifier",
        -  "type": "string"
        -}
      • addedOutput schema / properties / tbaiIdentifier
        Added value: +{
        +  "description": "TicketBAI identifier",
        +  "type": "string"
        +}
      • removedOutput schema / properties / territory
        Removed value: -{
        -  "description": "Basque territory",
        -  "enum": [
        -    "bizkaia",
        -    "gipuzkoa",
        -    "araba"
        -  ],
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "tbaiId",
        -  "territory",
        -  "status"
        -]New value: +[
        +  "accepted",
        +  "csv",
        +  "tbaiIdentifier",
        +  "estado",
        +  "qrUrl",
        +  "submittedAt",
        +  "errors"
        +]
    • Changedticketbai_submit9 fields changed
      • addedOutput schema / properties / accepted
        Added value: +{
        +  "description": "Whether the hacienda foral accepted the submission",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / csv
        Added value: +{
        +  "description": "CSV (Código Seguro de Verificación) returned by the hacienda foral",
        +  "type": "string"
        +}
      • addedOutput schema / properties / idempotent
        Added value: +{
        +  "description": "True if this echoes a prior already-accepted submission (no resubmission occurred)",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / sandbox
        Removed value: -{
        -  "description": "Whether this was a sandbox (test) submission",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "description": "Submission status",
        -  "enum": [
        -    "submitted",
        -    "accepted",
        -    "rejected",
        -    "error"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / properties / tbaiId
        Removed value: -{
        -  "description": "TicketBAI identifier (TBAI-XXXXX) returned by hacienda foral",
        -  "type": "string"
        -}
      • addedOutput schema / properties / tbaiIdentifier
        Added value: +{
        +  "description": "TicketBAI identifier (TBAI-XXXXX) returned by the hacienda foral",
        +  "type": "string"
        +}
      • removedOutput schema / properties / territory
        Removed value: -{
        -  "description": "Basque territory auto-detected from workspace address",
        -  "enum": [
        -    "bizkaia",
        -    "gipuzkoa",
        -    "araba"
        -  ],
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "tbaiId",
        -  "territory",
        -  "status",
        -  "sandbox"
        -]New value: +[
        +  "accepted",
        +  "csv",
        +  "tbaiIdentifier",
        +  "qrUrl"
        +]
    • Changedupdate_invoice12 fields changed
      • addedInput schema / properties / clientAddress
        Added value: +{
        +  "description": "Client billing address shown on the invoice / Direccion fiscal del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Existing client ID — server back-fills taxId/address / ID de cliente existente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientLocation
        Added value: +{
        +  "description": "Fiscal zone driving IVA vs IGIC vs exempt / Zona fiscal (IVA/IGIC/exento)",
        +  "enum": [
        +    "peninsula",
        +    "canarias",
        +    "ceuta_melilla",
        +    "eu",
        +    "world"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / clientTaxId
        Added value: +{
        +  "description": "Client tax ID (NIF/CIF/VAT) shown on the invoice / NIF/CIF del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / discountRate
        Added value: +{
        +  "description": "Global discount % applied to the invoice / Descuento global %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / documentNumber
        Added value: +{
        +  "description": "Externally-issued number for import (honored verbatim) / Numero externo para importacion",
        +  "maxLength": 50,
        +  "type": "string"
        +}
      • addedInput schema / properties / equivalenceSurchargeRate
        Added value: +{
        +  "description": "Recargo de equivalencia % (ES retail regime) / Recargo de equivalencia %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / irpfRate
        Added value: +{
        +  "description": "IRPF withholding % (retencion autonomo ES, e.g. 15 or 7) / Retencion IRPF %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / operationType
        Added value: +{
        +  "description": "Operation type (service or goods) / Tipo de operacion",
        +  "enum": [
        +    "service",
        +    "goods"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / poNumber
        Added value: +{
        +  "description": "Client purchase-order reference / Numero de pedido del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / prepayment
        Added value: +{
        +  "description": "Prepaid/advance amount already collected in EUR / Anticipo cobrado en EUR",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / seriesId
        Added value: +{
        +  "description": "Invoice numbering series ID / ID de serie de numeracion",
        +  "type": "string"
        +}
    • Changedupdate_quote9 fields changed
      • addedInput schema / properties / clientAddress
        Added value: +{
        +  "description": "Client billing address / Direccion fiscal del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Existing client ID — server back-fills taxId/address / ID de cliente existente",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientLocation
        Added value: +{
        +  "description": "Fiscal zone driving IVA vs IGIC vs exempt / Zona fiscal",
        +  "enum": [
        +    "peninsula",
        +    "canarias",
        +    "ceuta_melilla",
        +    "eu",
        +    "world"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / clientTaxId
        Added value: +{
        +  "description": "Client tax ID (NIF/CIF/VAT) / NIF/CIF del cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / dueDate
        Added value: +{
        +  "description": "Due date in ISO 8601 (YYYY-MM-DD) / Fecha de vencimiento",
        +  "type": "string"
        +}
      • addedInput schema / properties / equivalenceSurchargeRate
        Added value: +{
        +  "description": "Recargo de equivalencia % / Recargo de equivalencia %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / irpfRate
        Added value: +{
        +  "description": "IRPF withholding % (retencion autonomo ES) / Retencion IRPF %",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / issueDate
        Added value: +{
        +  "description": "Issue date in ISO 8601 (YYYY-MM-DD), defaults to today / Fecha de emision",
        +  "type": "string"
        +}
      • addedInput schema / properties / taxRate
        Added value: +{
        +  "description": "Tax rate % (e.g. 21 IVA, 7 IGIC) / Porcentaje de impuesto",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
  7. 157 tool updatesv1.13.1
    • Addedanomaly_list
    • Addedapply_deposit
    • Addedapply_late_fee
    • Addedattendance_clock_in
    • Addedattendance_clock_out
    • Addedcategorize_transaction
    • Changedcreate_client2 fields changed
      • addedInput schema / properties / address / properties / state
        Added value: +{
        +  "description": "State or province / Provincia o comunidad autonoma",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "address": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "city": {
        +          "type": "string"
        +        },
        +        "country": {
        +          "type": "string"
        +        },
        +        "postalCode": {
        +          "type": "string"
        +        },
        +        "state": {
        +          "type": "string"
        +        },
        +        "street": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "email": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "phone": {
        +      "type": "string"
        +    },
        +    "taxId": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Addedcreate_client_contact
    • Addedcreate_client_note
    • Addedcreate_credit_note
    • Addedcreate_deposit
    • Changedcreate_expense1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "amount": {
        +      "type": "number"
        +    },
        +    "category": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "date": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "taxDeductible": {
        +      "type": "boolean"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "vendor": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "description",
        +    "amount"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_invoice5 fields changed
      • addedInput schema / properties / issueDate
        Added value: +{
        +  "description": "Issue date in ISO 8601 format (YYYY-MM-DD), defaults to today / Fecha de emision",
        +  "type": "string"
        +}
      • changedInput schema / properties / items / description
        Previous value: -"Line items / Conceptos de la factura"New value: +"Line items (each with description, quantity, unitPrice) / Conceptos de la factura"
      • changedInput schema / properties / notes / description
        Previous value: -"Additional notes / Notas adicionales"New value: +"Additional notes shown on the invoice / Notas adicionales"
      • changedInput schema / properties / taxRate / description
        Previous value: -"Tax rate percentage (e.g. 21 for 21% IVA) / Porcentaje de impuesto"New value: +"Tax rate percentage (e.g. 21 for 21% IVA, 7 for IGIC) / Porcentaje de impuesto"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "dueDate": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "issueDate": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_product3 fields changed
      • removedInput schema / properties / sku
        Removed value: -{
        -  "description": "SKU / Reference code / Codigo de referencia",
        -  "type": "string"
        -}
      • removedInput schema / properties / unit
        Removed value: -{
        -  "description": "Unit of measurement (e.g. 'hour', 'unit', 'kg') / Unidad de medida",
        -  "type": "string"
        -}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "unitPrice": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "unitPrice"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_quote3 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"Line items / Conceptos del presupuesto"New value: +"Line items (each with description, quantity, unitPrice) / Conceptos del presupuesto"
      • changedInput schema / properties / notes / description
        Previous value: -"Additional notes / Notas adicionales"New value: +"Additional notes shown on the quote / Notas adicionales"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "validUntil": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Addedcreate_recurring_invoice
    • Addedcreate_reservation
    • Addedcreate_time_entry
    • Addedcreate_vendor
    • Changedcreate_webhook1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "events": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "secret": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "url",
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_client1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Addeddelete_client_contact
    • Addeddelete_client_note
    • Addeddelete_deposit
    • Changeddelete_expense1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_invoice1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_product1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_quote1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Addeddelete_recurring_invoice
    • Addeddelete_time_entry
    • Addeddelete_vendor
    • Changeddelete_webhook1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Addedduplicate_invoice
    • Addedeinvoice_export
    • Addedexport_datev
    • Addedface_status
    • Addedface_submit
    • Addedfrihet_aiem_calculate
    • Addedfrihet_bank_rule_create
    • Addedfrihet_bank_rules_list
    • Addedfrihet_gl_entry_approve
    • Addedfrihet_gl_entry_audit_log
    • Addedfrihet_gl_entry_reject
    • Addedfrihet_modelo_200_summary
    • Addedfrihet_modelo_202_summary
    • Addedfrihet_modelo_415_summary
    • Addedfrihet_modelo_418_summary
    • Addedfrihet_modelo_425_summary
    • Addedfrihet_portal_domain_add
    • Addedfrihet_portal_domain_remove
    • Addedfrihet_portal_domain_verify
    • Addedfrihet_portal_onboard_link_generate
    • Addedfrihet_tax_id_vies_lookup
    • Addedgestoria_aging_consolidated
    • Addedgestoria_message_send
    • Addedgestoria_messages_list
    • Addedgestoria_template_bulk_send
    • Addedgestoria_template_create
    • Addedget_bank_account
    • Addedget_business_context
    • Changedget_client1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "address": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "city": {
        +          "type": "string"
        +        },
        +        "country": {
        +          "type": "string"
        +        },
        +        "postalCode": {
        +          "type": "string"
        +        },
        +        "state": {
        +          "type": "string"
        +        },
        +        "street": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "email": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "phone": {
        +      "type": "string"
        +    },
        +    "taxId": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Addedget_deposit
    • Addedget_einvoice_status
    • Changedget_expense1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "amount": {
        +      "type": "number"
        +    },
        +    "category": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "date": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "taxDeductible": {
        +      "type": "boolean"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "vendor": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "description",
        +    "amount"
        +  ],
        +  "type": "object"
        +}
    • Changedget_invoice1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "dueDate": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "issueDate": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Addedget_invoice_einvoice
    • Addedget_invoice_pdf
    • Addedget_kitchen_ticket
    • Addedget_modelo_130_summary
    • Addedget_modelo_180_summary
    • Addedget_modelo_303_summary
    • Addedget_modelo_347_summary
    • Addedget_modelo_390_summary
    • Addedget_monthly_summary
    • Changedget_product1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "unitPrice": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "unitPrice"
        +  ],
        +  "type": "object"
        +}
    • Addedget_quarterly_taxes
    • Changedget_quote1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "validUntil": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Addedget_recurring_invoice
    • Addedget_reservation
    • Addedget_sale
    • Addedget_time_entry
    • Addedget_time_summary
    • Addedget_vendor
    • Changedget_webhook1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "events": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "secret": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "url",
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Addedinvite_team_member
    • Addedkitchen_flow_summary
    • Addedksef_submit
    • Addedleave_approve
    • Addedleave_cancel
    • Addedleave_list
    • Addedleave_reject
    • Addedleave_request_create
    • Addedlist_bank_accounts
    • Addedlist_client_activities
    • Addedlist_client_contacts
    • Addedlist_client_notes
    • Changedlist_clients5 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return (e.g. 'id,name,email') / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / q
        Added value: +{
        +  "description": "Search by name or email / Buscar por nombre o email",
        +  "type": "string"
        +}
      • addedInput schema / properties / stage
        Added value: +{
        +  "description": "Filter by CRM stage / Filtrar por etapa del CRM",
        +  "enum": [
        +    "lead",
        +    "contacted",
        +    "proposal",
        +    "active",
        +    "inactive",
        +    "lost"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "address": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "city": {
        +                "type": "string"
        +              },
        +              "country": {
        +                "type": "string"
        +              },
        +              "postalCode": {
        +                "type": "string"
        +              },
        +              "state": {
        +                "type": "string"
        +              },
        +              "street": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "email": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "phone": {
        +            "type": "string"
        +          },
        +          "taxId": {
        +            "type": "string"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedlist_deposits
    • Changedlist_expenses7 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / category
        Added value: +{
        +  "description": "Filter by expense category (e.g. 'office', 'travel') / Filtrar por categoria",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return (e.g. 'id,description,amount') / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Start date filter (YYYY-MM-DD) / Fecha inicio",
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "End date filter (YYYY-MM-DD) / Fecha fin",
        +  "type": "string"
        +}
      • addedInput schema / properties / vendorId
        Added value: +{
        +  "description": "Filter by vendor ID / Filtrar por ID de proveedor",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "amount": {
        +            "type": "number"
        +          },
        +          "category": {
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "date": {
        +            "type": "string"
        +          },
        +          "description": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "taxDeductible": {
        +            "type": "boolean"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          },
        +          "vendor": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "description",
        +          "amount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_invoices8 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Filter by client ID / Filtrar por ID de cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return (e.g. 'id,clientName,total') / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Start date filter in ISO 8601 (YYYY-MM-DD) / Fecha inicio",
        +  "type": "string"
        +}
      • addedInput schema / properties / seriesId
        Added value: +{
        +  "description": "Filter by invoice series ID / Filtrar por ID de serie",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "Filter by invoice status / Filtrar por estado",
        +  "enum": [
        +    "draft",
        +    "sent",
        +    "paid",
        +    "overdue",
        +    "cancelled"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "End date filter in ISO 8601 (YYYY-MM-DD) / Fecha fin",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "clientName": {
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "dueDate": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "issueDate": {
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "description": {
        +                  "type": "string"
        +                },
        +                "quantity": {
        +                  "type": "number"
        +                },
        +                "unitPrice": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "description",
        +                "quantity",
        +                "unitPrice"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "notes": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "taxRate": {
        +            "type": "number"
        +          },
        +          "total": {
        +            "type": "number"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "clientName",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedlist_kitchen_stations
    • Addedlist_kitchen_tickets
    • Addedlist_menu_items
    • Changedlist_products5 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return (e.g. 'id,name,unitPrice') / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / isActive
        Added value: +{
        +  "description": "Filter by active status / Filtrar por estado activo",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / q
        Added value: +{
        +  "description": "Search by product name / Buscar por nombre de producto",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "description": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "taxRate": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedlist_properties
    • Changedlist_quotes8 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion basada en cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / clientId
        Added value: +{
        +  "description": "Filter by client ID / Filtrar por ID de cliente",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return (e.g. 'id,clientName,total') / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Start date filter (YYYY-MM-DD) / Fecha inicio",
        +  "type": "string"
        +}
      • addedInput schema / properties / seriesId
        Added value: +{
        +  "description": "Filter by quote series ID / Filtrar por ID de serie",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "Filter by quote status / Filtrar por estado",
        +  "enum": [
        +    "draft",
        +    "sent",
        +    "accepted",
        +    "rejected",
        +    "expired"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "End date filter (YYYY-MM-DD) / Fecha fin",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "clientName": {
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "description": {
        +                  "type": "string"
        +                },
        +                "quantity": {
        +                  "type": "number"
        +                },
        +                "unitPrice": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "description",
        +                "quantity",
        +                "unitPrice"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "notes": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "total": {
        +            "type": "number"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          },
        +          "validUntil": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "clientName",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedlist_recurring_invoices
    • Addedlist_reservations
    • Addedlist_sales
    • Addedlist_team_members
    • Addedlist_terminals
    • Addedlist_time_entries
    • Addedlist_transactions
    • Addedlist_vendors
    • Changedlist_webhooks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "active": {
        +            "type": "boolean"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "events": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "secret": {
        +            "type": "string"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "url",
        +          "events"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedlog_client_activity
    • Addedmark_invoice_paid
    • Addedmatch_transaction_to_invoice
    • Addedonboarding_persona_set
    • Addedonboarding_status
    • Addedovertime_report
    • Addedpause_recurring_invoice
    • Addedpayroll_checklist
    • Addedpayroll_export
    • Addedperiod_close
    • Addedperiod_close_status
    • Addedperiod_reopen
    • Addedpermissions_matrix
    • Addedpermissions_me
    • Addedrefund_deposit
    • Addedrefund_sale
    • Addedremove_team_member
    • Addedresume_recurring_invoice
    • Addedrun_recurring_now
    • Changedsearch_invoices10 fields changed
      • addedInput schema / properties / after
        Added value: +{
        +  "description": "Cursor for cursor-based pagination (document ID) / Cursor para paginacion",
        +  "type": "string"
        +}
      • removedInput schema / properties / clientName
        Removed value: -{
        -  "description": "Client name to search for / Nombre del cliente a buscar",
        -  "type": "string"
        -}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Comma-separated field names to return / Campos a devolver",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Start date filter (YYYY-MM-DD) / Fecha inicio",
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max results / Resultados maximos"New value: +"Max results (1-100) / Resultados maximos"
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Search text (client name, etc.) / Texto de busqueda",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "Filter by status / Filtrar por estado",
        +  "enum": [
        +    "draft",
        +    "sent",
        +    "paid",
        +    "overdue",
        +    "cancelled"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "End date filter (YYYY-MM-DD) / Fecha fin",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "clientName"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "clientName": {
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "type": "string"
        +          },
        +          "dueDate": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "issueDate": {
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "description": {
        +                  "type": "string"
        +                },
        +                "quantity": {
        +                  "type": "number"
        +                },
        +                "unitPrice": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "description",
        +                "quantity",
        +                "unitPrice"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "notes": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "taxRate": {
        +            "type": "number"
        +          },
        +          "total": {
        +            "type": "number"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "clientName",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "type": "number"
        +    },
        +    "nextCursor": {
        +      "type": "string"
        +    },
        +    "offset": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "total",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
    • Addedsend_einvoice
    • Addedsend_invoice
    • Addedsend_quote
    • Addedsync_channel
    • Addedtest_webhook
    • Addedticketbai_status
    • Addedticketbai_submit
    • Changedupdate_client2 fields changed
      • addedInput schema / properties / address / properties / state
        Added value: +{
        +  "description": "State or province / Provincia o comunidad autonoma",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "address": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "city": {
        +          "type": "string"
        +        },
        +        "country": {
        +          "type": "string"
        +        },
        +        "postalCode": {
        +          "type": "string"
        +        },
        +        "state": {
        +          "type": "string"
        +        },
        +        "street": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "email": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "phone": {
        +      "type": "string"
        +    },
        +    "taxId": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Addedupdate_deposit
    • Changedupdate_expense1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "amount": {
        +      "type": "number"
        +    },
        +    "category": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "date": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "taxDeductible": {
        +      "type": "boolean"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "vendor": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "description",
        +    "amount"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_invoice2 fields changed
      • addedInput schema / properties / issueDate
        Added value: +{
        +  "description": "Issue date (YYYY-MM-DD) / Fecha de emision",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "dueDate": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "issueDate": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Addedupdate_kitchen_ticket
    • Changedupdate_product3 fields changed
      • removedInput schema / properties / sku
        Removed value: -{
        -  "description": "SKU / Referencia",
        -  "type": "string"
        -}
      • removedInput schema / properties / unit
        Removed value: -{
        -  "description": "Unit / Unidad",
        -  "type": "string"
        -}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "unitPrice": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "unitPrice"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_quote2 fields changed
      • changedInput schema / properties / validUntil / description
        Previous value: -"Expiry date / Fecha de validez"New value: +"Expiry date (YYYY-MM-DD) / Fecha de validez"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "clientName": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "unitPrice": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "quantity",
        +          "unitPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "validUntil": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "clientName",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Addedupdate_recurring_invoice
    • Addedupdate_team_member_role
    • Addedupdate_time_entry
    • Addedupdate_vendor
    • Changedupdate_webhook1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "createdAt": {
        +      "type": "string"
        +    },
        +    "events": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "secret": {
        +      "type": "string"
        +    },
        +    "updatedAt": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "url",
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Addedvalidate_einvoice_xml
    • Addedverifactu_resubmit
    • Addedverifactu_status
  8. 31 tool updatesv1.1.0
    • First observedcreate_client
    • First observedcreate_expense
    • First observedcreate_invoice
    • First observedcreate_product
    • First observedcreate_quote
    • First observedcreate_webhook
    • First observeddelete_client
    • First observeddelete_expense
    • First observeddelete_invoice
    • First observeddelete_product
    • First observeddelete_quote
    • First observeddelete_webhook
    • First observedget_client
    • First observedget_expense
    • First observedget_invoice
    • First observedget_product
    • First observedget_quote
    • First observedget_webhook
    • First observedlist_clients
    • First observedlist_expenses
    • First observedlist_invoices
    • First observedlist_products
    • First observedlist_quotes
    • First observedlist_webhooks
    • First observedsearch_invoices
    • First observedupdate_client
    • First observedupdate_expense
    • First observedupdate_invoice
    • First observedupdate_product
    • First observedupdate_quote
    • First observedupdate_webhook

TDQS

B3.4/5.0

Scored across 148 tools

Disambiguation4/5

Most tools have distinct purposes, but with 148 tools, some overlap exists (e.g., send_invoice vs send_einvoice, list_invoices vs search_invoices). Overall, the actions and targets differentiate tools sufficiently.

Naming Consistency3/5

Many tools follow verb_noun pattern, but there are inconsistencies like 'leave_request_create' (noun_noun_verb) and prefixes (frihet_, gestoria_) that break uniformity. Still readable overall.

Tool Count1/5

148 tools is excessive for an MCP server. While the server covers a broad ERP scope, the count is far beyond the typical 3-15 range, making the surface overwhelming.

Completeness3/5

Covers many domains comprehensively (invoicing, e-invoicing, tax models, HR), but missing basic CRUD for clients (no create_client or delete_client), which is a notable gap in the client lifecycle.

Maintenance

ActivityActive
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with the Finizi B4B platform through 15 comprehensive tools for managing business entities, invoices, vendors, and products. Features secure JWT authentication, automatic retries, and full business-to-business workflow integration through natural language commands.
    -
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with the Finizi B4B platform through 15 comprehensive tools for managing business entities, invoices, vendors, and products. Features secure JWT authentication, automatic retries, and comprehensive business data operations through natural language commands.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Complete Swiss accounting integration for Bexio via MCP. Works with Claude Desktop, n8n, and any MCP client. 221 tools for invoices, contacts, projects & more. Created by Lukas Hertig.
    29
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    AI-powered freelance business manager for Claude Code. Proposals, invoices, time tracking, scope management, and follow-ups - 37 tools, 5 coaching skills.
    37
    22
    MIT